travisCI + Bintrayによる自動デプロイを試したメモ

Bintrayはソフトウェア配布のためのサービスです.これを利用して,travisCIを使ってテストを行った後に自動でデプロイできるような仕組みを構築します.
今回デプロイしようとするソフトウェアはこれです.
KhronosGroup/glslang · GitHub
GLSLのリファレンスコンパイラです.BSDライセンスで配布されています.こちらをフォークしてテストを回し,デプロイしてみます.

ビルドしてみる

まずはこちら側でビルドしてテストを行ってみます.Linux環境の場合はSetupLinux.shを実行するだけです.ビルドにはC++11が動くコンパイラとbisonというパーサジェネレータが必要です.windowsの場合はリポジトリに最初から含まれているbison.exeでも良いはず.windowsの場合,cmakeを走らせた後にVisualStudioのプロジェクトが生成されるのでそれを用いてビルドします.テストはTestディレクトリに移動した後にruntestsを実行します.シェルスクリプトっぽいのでコマンドプロンプトでは動かないみたいです.

Bintrayの準備

Bintrayの概要については以下の記事等が参考になります.
GradleでBintrayにアップロードする手順 - Qiita
Bintray - Download Center Automation & Distribution w. Private Repositories
Bintrayはアカウントの下にいくつかのタイプのリポジトリが存在し,その下にPackageとしてソフトウェアを置きます.mavenrpmなど6種あります.今回はどれでもないので最初からあるgenericを使います.
GitHubアカウントでログインした後はOwned Repositoriesからgenericを選択し,Import from GitHubから使いたいリポジトリを選択します.これで,Bintray上にPackageが作成されます.
また,後で使用するのでEdit your profileからAPI Keyも確認しておきます.

travisCIで自動テストを回す.

travisCIのテスト環境はUbuntuらしいのですが,デフォルトではc++11が使えるgccが入っていません.そこでgccをアップデートする必要があります.
c++ - Travis CI with Clang 3.4 and C++11 - Stack Overflow
上記の回答を参考にします.新しいgccを入れた後はパスの設定も変更しなければcmakeが新しいgccを用いてビルドしてくれません.今回はg++4.8.1を入れます.
自動テストを回す.travis.ymlは以下のようになりました.

sudo: required
language: cpp
compiler:
    - gcc
script:
  - ./SetupLinux.sh
  - cd Test
  - ./runtests
before_install:
  # g++4.8.1
  - if [ "$CXX" == "g++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
  - sudo apt-get update -qq
install:
  # g++4.8.1
  - if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; fi
  - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8"; fi

sudoが必要なければキャッシュが使えるのですが,sudoなしにする方法はわからないのでこのままです.これでテストは回るはずです.

Bintrayへの自動デプロイ

次に,Bintrayへのアップロードを行う処理を記述していきます.
Bintray Deployment - Travis CI
公式の手順に従います.genericへのアップロードは以下のようにcurlでも行えるようですが,travisが指示する方法が良いと思います.

curl -T <FILE.EXT> -usoma-arc:<API_KEY> https://api.bintray.com/content/soma-arc/generic/<YOUR_COOL_PACKAGE_NAME>/<VERSION_NAME>/<FILE_TARGET_PATH>

bintrayのAPIキーをtravis encryptで暗号化して.デプロイ用の記述を追記します.

deploy:
  provider: bintray
  file: "/home/travis/build/soma-arc/glslang/bintray.desc"
  user: "soma-arc"
  key: $BINTRAY_API_KEY
env:
  secure: "hogehoge"

fileにはbintray用のdescriptionファイルを指定します.ここにデプロイ用の情報が記述されます.拡張子をどうしたら良いかわからなかったので,bintray.descにしておきました.
上述のURLに記載されているテンプレートを埋めて作成します.あらかじめbintrayにパッケージを作っていれば最小の構成は以下のようになると思います.

{
    "package": {
        "name": "glslang", // Bintray package name
        "repo": "generic", // Bintray repository name
	"subject": "soma-arc"
    },
    "version": {
        "name": "0.1"
    },
    "files":
        [
        {"includePattern": "/home/travis/build/soma-arc/glslang/build/install/bin/(.*)", "uploadPattern": "bin/$1"},
	{"includePattern": "/home/travis/build/soma-arc/glslang/build/install/lib/(.*)", "uploadPattern": "lib/$1"}
        ],
    "publish": true
}

filesでアップロードするディレクトリを決めています.ここはRuby正規表現で指定するようです.SetupLinux.shを実行した後はglslang/build/installに成果物がまとめられるので,そこを指定してやればその中身がアップロードされます.
以上の作業を行うことでtravisCIでテストが行われた後にデプロイすることができます.
f:id:soma_arc:20151204132956p:plain

おわり

今回はtravisCIとBintrayでビルド済み成果物をデプロイすることを試しました.
バージョンの指定方法について.gitHubでのタグとの関連,タグ打ちやバージョンの番号に関する話はいつか勉強しないといけませんね.また,バージョンが上がるたびに手動でdescriptionファイルをいじるというのも面倒な話です.そこらへん,実際に運用するにはどうするのか,調べる必要があります.実際に使っている人のリポジトリの設定ファイルを見るのが近道なのでしょうか…
また,travisCIは新しい事を試そうとするには何度も.travis.ymlをリポジトリにプッシュする必要があります.非常に面倒くさい上,履歴も汚れるので,よろしくありません.そろそろCircleCIも試したいところです.
同様のデプロイをWindows用にAppVeyorでも試したので次の記事にします.