GeekFactory

int128.hatenablog.com

GitHub APIでリポジトリにファイルをコミットするコマンドを作った

GitHub APIを利用してリポジトリにファイルをコミットするコマンド ghcp を作りました。シングルバイナリでgitコマンドに依存しないため、リリースなどでCIからリポジトリのファイルを書き換えたい場合に便利です。

github.com

使い方

GitHub ReleasesもしくはHomebrewからインストールできます。

# GitHub Releases
curl -L -o /usr/local/bin/ghcp https://github.com/int128/ghcp/releases/download/v1.3.0/ghcp_linux_amd64

# Homebrew
brew tap int128/ghcp
brew install ghcp

# Go
go get github.com/int128/ghcp

あらかじめGitHubの設定ページからトークンを取得して $GITHUB_TOKEN に設定しておく必要があります。

基本的な使い方は以下になります。

デフォルトブランチ(通常はmaster)にファイルをコミットする:

ghcp -u YOUR -r REPO -m MESSAGE files

指定したブランチにファイルをコミットする:

ghcp -u YOUR -r REPO -b BRANCH -m MESSAGE files

デフォルトブランチから新しいブランチを作成して、ファイルをコミットする:

ghcp -u YOUR -r REPO -B BRANCH -m MESSAGE files

指定した親ブランチから新しいブランチを作成して、ファイルをコミットする:

ghcp -u YOUR -r REPO -B BRANCH --parent PARENT -m MESSAGE files

応用例

GitHub Pagesへのリリース

CIでビルドしたファイルをGitHub Pagesにリリースする場合、これまでは git commitgit push を駆使したスクリプトを書く必要がありましたが、ghcpを使うと以下の1コマンドでリリースできます。

ghcp -u int128 -r sandbox -b gh-pages -m "Example commit" index.html

Homebrew tapリポジトリへのリリース

tapリポジトリにformulaをリリースする場合もghcpを使うと簡単に実現できます。

# formulaを生成する
cat > hello.rb <<EOF
class Hello < Formula
  desc "Your awesome application"
  homepage "https://github.com/YOUR/hello"
  url "https://github.com/YOUR/hello/releases/download/v1.0.0/hello_darwin_amd64"
  version "v1.0.0"
  sha256 "$(shasum -a 256 -b hello | cut -f1 -d' ')"

  def install
    bin.install "hello_darwin_amd64" => "hello"
  end

  test do
    system "#{bin}/hello -h"
  end
end
EOF

# tapリポジトリにコピー
ghcp -u int128 -r homebrew-sandbox -m v1.0.0 hello.rb

バージョン文字列を書き換える

READMEやビルドスクリプトなどのバージョン文字列を書き換える用途にも使えます。CIで新バージョンをテストする場合に便利ですね。

# substitute version string in files
sed -i -e "s/version '[0-9.]*'/version '$TAG'/g" README.md build.gradle

# commit the changes to a new branch
ghcp -u YOUR -r REPO -B bump-v1.1.0 -m v1.1.0 README.md build.gradle

まとめ

詳しい使い方は https://github.com/int128/ghcp を参照してください。