Travis CIからGitHub Releasesへの自動デプロイ

こんにちはtatsyです。

相変わらず、テスト環境に凝っている今日この頃です。

今日は意外と解説しているページがなかったので、Travis CIからGitHubのReleasesへ自動でデプロイする方法についてまとめてみたいと思います。

手順は、

  • GitHubでTravisからのPushおよびDeployを許可
  • Travis CI用のトークンの暗号化
  • デプロイのための.travis.ymlの書き方

となっております。順にご説明したいと思います。

GitHubでTravisからのPush/Deployを許可


まず、GitHubにアクセスして、ユーザのSettingsページに移動します。

左側のメニューに「Personal access tokens」という項目があるので、そこに移動します。

その上側に「Generate new token」というメニューがあるので、そこをクリックし、新しいトークンを生成します。

多分、初期状態では以下のようになっているはずです。

generate_new_token

一応、安全のために「repo_deployment」と「public_repo」だけにチェックを入れてトークンを生成します。

ちなみにトークンを生成した画面を一度閉じてしまうと、変更するまで見えなくなるので注意してください。

以下、解説のために生成したトークンを「my_access_token」として話を進めます。

Travis CI用のトークンを暗号化


生成したトークンを.travis.ymlに直打ちするのはさすがにヤバいので、これを暗号化します。

暗号化するためのプログラムはRubyGemsで落とします。まずRubyをインストールしていただいて、

$ gem install travis

でプログラムがインストールできます。

インストールしたら暗号化です。暗号化のコマンドは、

travis encrypt -r "my_access_token"

です。

ここでポイントなのですが、今回のデプロイでは現在のコミットにタグをつけてプッシュする処理と、リリースの処理で2つの暗号化されたトークンが必要です。

具体的には以下の2種類です。

travis encrypt -r "GH_TOKEN=my_access_token"
travis encrypt -r "my_access_token"

今回は説明のために上の暗号化結果を「encrypted_gh_token」、下の暗号化結果を「encrypted_plain_token」として話を進めます。

デプロイのための.travis.ymlの書き方


最後は.travis.ymlでデプロイの設定をします。

基本の書き方は、

before_deploy:
  # デプロイの準備

deploy:
  # デプロイの処理

after_deploy:
  # デプロイ後の処理

です。

環境変数の設定

デプロイの設定の前に.travis.ymlに環境変数を設定しておきます。

env:
  global:
    - GIT_TAG=<your version string>
    - secure: <encrypted_gh_token>

と書きます(カッコはわかりやすくするために付けているだけなので注意してください)。

デプロイの準備

デプロイの準備でやることは、主に配布用の圧縮データの生成です。

その他にもドキュメントの生成などは準備段階で行います。

配布データの生成が終わったらGitのユーザ設定を行って、タグへのコミットとプッシュを行います。

以下は、圧縮からプッシュまでの一連の処理を行うためのスクリプトになります。

before_deploy:
  # 配布データの生成
  - mkdir packages
  - tar czf packages/releases-$GIT_TAG.tar.gz $(ls -I packages)
  - zip -q packages/releases-$GIT_TAG.zip -r $(ls -I packages)
  # Gitの設定
  - git config --global user.name "Travis CI"
  - git config --global user.email "travis@travis-ci.org"
  - git tag $GIT_TAG -a -m "Commit from Travis CI for build $TRAVIS_BUILD_NUMBER"
  - git push --quiet https://$GH_TOKEN@github.com/<user name>/<repo name>.git --tags 2> /dev/null

デプロイの処理

デプロイの処理は.travis.ymlの他の場所の記述とは少し違っていて、シェルスクリプトをそのまま書くわけではなく、特定のルールに従って、データを入力してあげます。

基本の書き方は以下の通り。

deploy:
  provider: releases
  skip_cleanup: true
  api_key:
    secure: <encrypted_plain_token>
  file:
    - packages/releases-$GIT_TAG.tar.gz
    - packages/releases-$GIT_TAG.zip
  on:
    tags: false
    branch: master
    condition: "other conditions"

上から何を書いているかを見ていきます。

項目名説明
providerリリースに使うサービスの名前です。今回はGitHub Releasesを使うので「releases」を指定。他にHerokuやAWSなども指定できます。
skip_cleanupこれがfalseになっているとビルド中に作られたファイルが破棄されます。今回は特に破棄する必要もないのでtrueにしています。
api_keyリリースに使うAPIのキーです。今回は先ほど生成した暗号化済みのアクセス・トークンを使います。
fileリリースするファイルの一覧です。今回は先ほど生成した圧縮ファイルを指定しています。
onデプロイを行う条件を記述しています。今回の場合はタグがついていない(tag: false)、ブランチがmaster (branch: master)という条件を記述しています。このほかにもコンパイラがGCCなどの条件をcondition: “$CXX = g++”などで指定できます。

上記の条件ではmasterブランチにタグをつけずにプッシュすると、その時のコミットに指定されたタグをつけてプッシュしたのち、そのコミットをリリースします。

Travis CIで処理が完了すると、以下のようにReleaseがなされています。

deployed_releases

まとめ


これでめでたくGitHub Releasesへの自動デプロイができました。

もし、うまくいかないなどの不具合がありましたらコメントいただけますと嬉しいです。

最後までお読みいただきまして、ありがとうございました。