Travis CIからGitHubにPull Requestを送る
ドキュメントやWebサイトの情報は、プロダクトと同じリポジトリで管理することが望ましいですが、構成管理の都合でリポジトリが別になってしまうことがあります。そのような場合、リポジトリ間で情報を反映する手作業が発生します。例えば、
といったケースが挙げられます。
手作業による反映はボトルネックやミスを引き起こす原因になります。そこで、Travis CIのビルド結果をPull Requestにして送ることで、反映作業を自動化できます。
具体的な方法
GitHubトークンをTravis CIに設定する
まず、GitHubの設定画面からPersonal Access Tokenを取得します。権限は public_repo
のみでOKです。
Travis CIの設定画面を開き、GitHubのトークンを環境変数に格納します。ここでは下記の環境変数に格納するものとします。
環境変数名 | 内容 |
---|---|
GH_TOKEN |
GitHubのPersonal Access Token |
GH_USER |
GitHubのユーザ名 |
設定画面でトークンを入力する際は Display value in build logs が OFF になっていることを確認しましょう。これが ON になっていると、ビルドログにトークンが表示されてしまいます。
ビルド時にシェルスクリプトを実行する
Travis CIのビルド時にシェルスクリプトが実行されるように .travis.yml
を設定します。下記の例では、ビルド成功時に open-pull-request.sh
というスクリプトが実行されます。
after_success: ./open-pull-request.sh
after_success
などの指定方法は Travis CI: The Lifecycle of a Travis CI Build を参照してください。
シェルスクリプトからPull Requestを送る
Pull Requestを作成するまでの流れを下記に示します。
コマンドラインからPull Requestを作成するには hubコマンド を使います。hubはGolangで書かれているため、バイナリをダウンロードして配置するだけで使えます。hubコマンドでGitHubにアクセスするには、あらかじめ下記を設定する必要があります。
- Gitアクセスの認証情報(
~/.config/git-credential
) - GitHub APIアクセスの認証情報(
~/.config/hub
) - Gitのユーザ名やメールアドレス(
git config
)
一連の流れをシェルスクリプトに書きます。
#!/bin/bash -xe HUB="2.2.0" # 認証情報を設定する mkdir -p "$HOME/.config" set +x echo "https://${GH_TOKEN}:@github.com" > "$HOME/.config/git-credential" echo "github.com: - oauth_token: $GH_TOKEN user: $GH_USER" > "$HOME/.config/hub" unset GH_TOKEN set -x # Gitを設定する git config --global user.name "${GH_USER}" git config --global user.email "${GH_USER}@users.noreply.github.com" git config --global core.autocrlf "input" git config --global hub.protocol "https" git config --global credential.helper "store --file=$HOME/.config/git-credential" # hubをインストールする curl -LO "https://github.com/github/hub/releases/download/v$HUB/hub-linux-amd64-$HUB.tar.gz" tar -C "$HOME" -zxf "hub-linux-amd64-$HUB.tar.gz" export PATH="$PATH:$HOME/hub-linux-amd64-$HUB" # リポジトリに変更をコミットする hub clone "リポジトリ名" _ cd _ hub checkout -b "ブランチ名" ## ファイルを変更する ## hub add . hub commit -m "コミットメッセージ" # Pull Requestを送る hub push origin "ブランチ名" hub pull-request -m "Pull Requestメッセージ" cd ..
他のユーザが所有するリポジトリの場合
他のユーザが所有するリポジトリにPull Requestを送るには、まずリポジトリをforkする必要があります。シェルスクリプトの後半部分を下記のように変更します。
# リポジトリに変更をコミットする hub clone "ユーザ名/リポジトリ名" _ cd _ hub checkout -b "ブランチ名" ## ファイルを変更する ## hub add . hub commit -m "コミットメッセージ" # Pull Requestを送る hub fork hub push "$GH_USER" "ブランチ名" hub pull-request -m "Pull Requestメッセージ" cd ..
Travis CIの動作をテストする
シェルスクリプトと .travis.yml
をリポジトリにpushして、Travis CIの動作をテストします。地道な試行錯誤が必要になるため、いきなりmasterブランチに反映するのではなく、新しいブランチで試してみることをおすすめします。
まとめ
Travis CI上でPull Requestを作成する方法を説明しました。この方法を活用すると、ビルドのアウトプットをPull Requestを経由して他のリポジトリに反映できます。