Travis CIからデプロイ

Travis CIにはDeploymentという機能があり、Heroku等色々なサービスに対応しています。

その一つとして、GitHub Releasesに対してファイルをデプロイする事が出来ます。

zipファイルならなんでも登録でき、登録するファイルサイズはリポジトリにpushするより大きくても問題ないので、バイナリサイズがでかいnode-webkitアプリには向いていると言えます。

この記事は基本的にはTravis-CI で Go の Windows 用バイナリを Github release に登録する - Qiitaと同じなので、先に読んでおくといいかと思います。

node-webkitアプリの実行ファイルの作成

node-webkitアプリの実行ファイル(バイナリ)の作成方法といっても基本的にランタイムを丸ごと入れた実行ファイルを作るだけです。

これはmllrsohn/node-webkit-builderを使うと簡単に行うことができます。

以下のように対応したいプラットフォームと、node-webkitアプリのrootディレクトリを指定するだけでプラットフォームごとの実行ファイルを作ってくれます。(デフォルトではbuild/ディレクトリに作られる)

nwbuild -p 'win,osx,linux32,linux64' ./"

Macなら.app、Windowsなら.exeのようなファイルがそれぞれ、build/win/github-reader.exeのような感じで作成されます。

ビルドスクリプト

GitHub Releasesに登録するためにはzipファイルでないと行けないので、ビルドしたものをzip化する必要があります。

azu/github-reader でのビルドスクリプトは以下のような感じです。

#!/bin/bash

if [[ "$TRAVIS_TAG" ]]; then
    rm -rf build
    nwbuild -p 'win,osx,linux32,linux64' ./ -o ./build
    cd build
    # ziped in build/
    zip -q github-reader-osx.zip -r github-reader/osx
    zip -q github-reader-win.zip -r github-reader/win
    zip -q github-reader-linux32.zip -r github-reader/linux32
    zip -q github-reader-linux64.zip -r github-reader/linux64
    cd -
    echo "ziped!"
else
    echo "Not Release"
fi

このスクリプトをtravis.ymlでdeployする前に設定しておくと、ビルドした実行ファイルのzipファイルがプロジェクトのrootに並びます。

$TRAVIS_TAGはTravis CIがつけてくれる環境変数で、git tagのコミットの時に値が入る変数となっています。値があるときのみビルドスクリプトを走らせる感じです。

(このzipを展開するとgithub-reader/osx/github-reader.appのような無駄な階層が含まれるのを削るオプションはあるのかな?)

Travis CIの設定

Travis-CI で Go の Windows 用バイナリを Github release に登録する - Qiitaと全く同じことなので、簡単に解説します。

travis setup releases を行うとGitHub Releasesへ登録するためのAPIキー等発行されて.travis.ymlに登録されます。

gem install travis
travis setup releases

ただし、上記の記事で書かれているようにall_branches: trueがないと正しく動かないバグあることに注意して下さい。

  on:
    repo: azu/github-reader
    tags: true
    all_branches: true

最終的な.travis.ymlは以下のようになりました。

deploy:
  provider: releases
  api_key:
    secure: qS2igPviHIlN6zGVUPa9s5lh/TnYH/nELBxb9EfjXQzhaScV1/R3csjg0AI28Bh0ReSp1xhRWc7I5EiKLsS5wqYM821MfTiyrjoKneAjDYy5XeW4+kFKXaqvMgYK+v5f1CoiuJVKtJwVv5uEVb3NsXpX5qUGcLmIvmWmUoRrjik=
  file:
    - build/github-reader-osx.zip
    - build/github-reader-win.zip
    - build/github-reader-linux32.zip
    - build/github-reader-linux64.zip
  on:
    repo: azu/github-reader
    tags: true
    all_branches: true
  skip_cleanup: true

tags: true にしておくと、git tagをつけたコミットに対してのみdeployが動作するようになります。(スクリプト側では$TRAVIS_TAGを見てビルド)

このように設定したら後はgit tagをはってpushするだけで、自動的に最新のタグにバイナリが登録されます。(Travis CIの回線結構早いのでローカルでやるより楽な気がします)

Tips

GitHub Releasesでは最新のタグにリンクを貼る方法が存在します。

https://github.com/azu/github-reader/releases/latest

という感じでバージョンではなく、latestという指定をすると最新バージョンへリダイレクトされます。(添付したダウンロードファイルでは使えないのが不便…)

おわりに

Travis CIのDeploymentを使ってGitHub Releaseにnode-webkitアプリのバイナリを登録する方法について紹介しました。

node-webkitアプリはランタイムも含む都合上(含めない方法もありnwファイルがそれです)、ファイルサイズが数十から数百MBとなったりします。

GitHubにはpush出来るファイルにサイズ制限があるため、node-webkitアプリのバイナリをリポジトリに置くのは難しいと思います。

そのため、大きなファイルを配布する場合は、別の所におくか、GitHub Releaseを使うのが一般的です。

Travis CIはただのテストだけではなく、こういったデプロイの用途にも使えて便利だと思います。

GitHub Releaseでのバイナリ配布は以下から実例を見られます。