GeekFactory

int128.hatenablog.com

Travis CIからGitHubにPull Requestを送る

ドキュメントやWebサイトの情報は、プロダクトと同じリポジトリで管理することが望ましいですが、構成管理の都合でリポジトリが別になってしまうことがあります。そのような場合、リポジトリ間で情報を反映する手作業が発生します。例えば、

  • ドキュメントをHTMLにレンダリングしてGitHub Pagesに反映する
  • データから画像を生成してGitHub Pagesに反映する
  • ドキュメントのバージョン番号を書き換える

といったケースが挙げられます。

手作業による反映はボトルネックやミスを引き起こす原因になります。そこで、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 になっていると、ビルドログにトークンが表示されてしまいます。

f:id:int128:20150529225707p:plain

ビルド時にシェルスクリプトを実行する

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を作成するまでの流れを下記に示します。

  1. リポジトリをcloneする
  2. リポジトリをforkする(自分が所有するリポジトリの場合は不要)
  3. 新しいブランチに変更をコミットする
  4. 新しいブランチをpushする
  5. 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を経由して他のリポジトリに反映できます。