matsuo

Travis CI から GitHub へ git push を行う設定

Travis CI から GitHub への git push を行う場合の、設定メモです。

静的サイトジェネレータ + GitHub Pages の組合せを使っていて、ビルド処理を Travis CI に任せつつ、デプロイ (GitHub Pagesへのプッシュ) までを自動化したいなあと思い、セットアップしてみました。

  • [補足] Travis CI は継続的インテグレーション(CI)サービスのひとつです
    https://travis-ci.org/

やりたいこと

  1. GitHub 上のデータを更新すると、
  2. 連携した Travis CI にデータが渡り、Travis CI 上で静的サイトジェネレータがビルドを開始
  3. ビルドされたファイルを、公開用の GitHub リポジトリに反映 (Travis CIから commit と push を行う)
  4. GitHub Pages で公開しているサイトが更新される! (全自動で!)

という感じです。

まずは GitHub と Travis CI の連携が必要ですが、ここはそう迷うところはありませんし、ググればいろいろ情報が出てきますので割愛。
Travis CI から GitHub へ push するところを重点的に見ていきます。

ローカルでの準備

travis コマンドのインストール

Travis CI には CLIクライアントが用意されており、これを使った作業が必要になりますので、 gem でインストールします。

gem install travis

また、Travis CI と連携しているリポジトリのフォルダに移動して、Travis CI にログインしておきます。

travis login

ssh鍵ファイルの用意

GitHub に ssh でアクセスするには鍵ファイルの用意が必要ですね、通常どおり ssh-keygen を使います。

ssh-keygen -f sample_key

この例では、秘密鍵 sample_key と公開鍵 sample_key.pub の2ファイルが生成されます。
公開鍵のほうは、GitHub 上でリポジトリの設定画面 SettingsDeploy keys のところに追加しておきます。

travis コマンドで鍵ファイルを暗号化する

秘密鍵を Travis CI 側に持っていく必要がありますが、そのままの状態でリポジトリに含めてしまうとセキュリティ上大問題ですので、travis コマンドを使って暗号化します。

travis encrypt-file sample_key

成功すれば sample_key.enc という暗号化済みのファイルが作成されます。また、画面には以下のように復号化の方法が表示されますので、メモしておきます。

Please add the following to your build script (before_install stage in your .travis.yml, for instance):

    openssl aes-256-cbc -K $encrypted_xxxx_key -iv $encrypted_xxxx_iv -in sample_key.enc -out ~\/tmp/sample_key -d

暗号化した鍵ファイルをリポジトリに含める

暗号化が完了したので、暗号化した秘密鍵 sample_key.enc を Gitリポジトリに含められるようになりました。
(もちろん、暗号化前の秘密鍵 sample_key はリポジトリに含めない)

Travis CI 側の設定をする

手順としては大きくは以下のような感じです

  • 暗号化された sample_key.enc ファイルを、 ~/.ssh/id_rsa に秘密鍵として復号 (これで GitHub への sshアクセスが可能になる)
  • 対象のリポジトリを Travis CI 上に GitHub から clone してくる
  • Travis CI でビルドした、デプロイ対象ファイルを git add 〜 commit する
  • 満を持して git push

これを Travis CI の設定ファイル .travis.yml に設定していきます。
ビルドが成功した場合に処理を実施するので after_success のパートに書き、最終的にはこんな感じになりました。

after_success:
  - openssl aes-256-cbc -K $encrypted_xxxx_key -iv $encrypted_xxxx_iv -in travis_key.enc -out ~/.ssh/id_rsa -d
  - chmod 600 ~/.ssh/id_rsa
  - echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
  - git config --global user.email "example@example.com"
  - git config --global user.name "example user"
  - git clone git@github.com:example/example.git
  - cd example
  - cp -aR example_from_dir example_dist_dir
  - git add --all
  - git commit -m "by Travis CI (JOB $TRAVIS_JOB_NUMBER)"
  - git push origin master
  1. 復号は、travis コマンドで暗号化した時に表示された復号化コマンド openssl で行う
  2. 秘密鍵のパーミッション設定、600 にするのを忘れずに
  3. ssh接続時に、対話式の確認をしないようにする (StrictHostKeyChecking の設定)
  4. git のユーザ名・メールアドレスの設定も必要, git config --global で実施
  5. 以後はシェルスクリプトで git clone 〜 対象ファイルのコピー 〜 git add 〜 git commit するのと同じ要領
  6. 満を持して git push

これで、Travis CI でのビルドが成功するタイミングで、GitHub のお好きなリポジトリに git push ができるようになりました。

秘密鍵の暗号化・復号化さえできれば、あとはわりと素直な手順です。静的サイトジェネレータと GitHub Pages の組合せ以外でも、CIツール内から git 操作を行いたい場面はちょいちょいあるので、うまく活用できればと思います。

参考

お問い合わせはこちら