Travis CIを利用した継続的な成果物の配置
こんにちは。 @suzu_v です。 Advent Calendar 2015 18日目 休載のお知らせ - VOYAGE GROUP techlog とのことだったので代打で書いてみます。*1
いま私が所属している fluct ではCIの一部にTravis CIを利用しています。用途としては、
- 継続的なテスト
- 継続的なビルド
というところを担当しています。今日は簡単に、
の紹介をします。
Travis Artifacts
travis-ci/artifacts はTravis CIのアドオンとして利用されているもので、ビルド済みのartifactsを扱うことができます。私たちは一部のバッチやAPIサーバの実装について、Travis CIを利用したビルド及びs3への転送を行っています。
プロジェクト構成は概ね以下のようになっています。この場合Goのアプリです。
github.com/your-username/your-reponame .travis.yml Gomfile Gomfile.lock Makefile ci.mk cmd/myapp.go kuke.go kuke_test.go
.travis.yml
には以下のように設定しています。
sudo: false language: go go: - 1.5.2 before_script: - export PATH=$HOME/gopath/bin:$PATH install: make -f ci.mk deps script: - make -f ci.mk test - make -f ci.mk build addons: artifacts: paths: - $(git ls-files -o --exclude-standard | tr "\n" ":") debug: true bucket: your-bucket target-paths: artifacts/$TRAVIS_REPO_SLUG/$TRAVIS_BRANCH s3_region: "ap-northeast-1"
このようにすると s3://your-bucket/artifacts/your_user_name/your_repo_name/branch_name
以下にビルド物が展開されます。例えば github.com/suzuken/gs
のmasterブランチのビルドに対しては s3://your-bucket/artifacts/suzuken/gs/master
以下に成果物(artifacts)が配置されます。Pull Requestを出した場合にも同様で、トピックブランチごとのartifactがs3に配置されます。テストをするサーバ側ではこのartifactを aws s3 cp
などで取得し、利用することができます。ちなみにブランチ以外にもcommit hashやtagごとに出す、ということもできます。詳しくは travis-ci/artifacts をみてください。
git ls-files -o --exclude-standard | tr "\n" ":"
というのはざっくりいうと「git管理下では無いファイル」をリストする、ということをしています。こうすることでビルドされたものだけs3へのアップロード対象にすることができます。
ci.mk
というのはCI用のMakefileです。Makefile
は開発用に、 ci.mk
はCIで使うように、と分けています。実際にそれぞれやっていることはあまり変わりませんが、こうすることでプロジェクトごとのCI用のマクロを揃えておくということがやりやすくなります。例えばJavaのプロジェクトでもこの仕組をつかおうとしたときにでも、 make -f ci.mk install test build
すれば成果物ができる、という取り決めにしておけばよいのです。
実際に ci.mk
の中身は以下のようになっています。(プロジェクトによって若干異なりますが、Goのプロジェクトだと概ね以下のようになります。)
.PHONY: install build test deps BRANCH := master GOOS := linux GOARCH := amd64 deps: go get github.com/mattn/gom gom install test: gom test -v ./... build: myapp.$(GOOS).$(GOARCH).gz -rm myapp.$(GOOS).$(GOARCH) myapp.$(GOOS).$(GOARCH): GOOS=$(GOOS) GOARCH=$(GOARCH) gom build -ldflags "-X=main.version=$(shell git rev-parse HEAD)" cmd/myapp.go mv myapp $@ myapp.$(GOOS).$(GOARCH).gz: myapp.$(GOOS).$(GOARCH) gzip -f $< clean: -rm -rf myapp.$(GOOS).$(GOARCH) -rm -rf myapp.$(GOOS).$(GOARCH).gz
依存の管理には mattn/gom を利用しています。Go版のBundlerのようなものです。s3への転送は myapp.linux.arm64.gz
だけを配置する、ということにしたいので適当に整理しています。
Travis CIからS3への転送についてはcredentialが必要になります。これはTravis CIのプロジェクト設定で、環境変数から読み込ませることができます。 Uploading Artifacts on Travis CI - Travis CI に書いてあるとおり、リポジトリの設定から以下を設定します。
ARTIFACTS_KEY=(AWS access key id) ARTIFACTS_SECRET=(AWS secret access key) ARTIFACTS_BUCKET=(S3 bucket name)
Bucketについては .travis.yml
に設定してもよいでしょう。Travis CI側ではtestが通らないとbuildが実行されないようにしているので、これでビルドが通ったもののみs3に配置される、ということになります。
以上、簡単ですが代打でした。明日は @qooh0 さんです。
小ネタ
*1:決してTravis CIのビルドが詰まっているので息抜きに書いているわけではありません。 Travis CI Status - Start delays on legacy precise infrastructure for travis-ci.com (private) builds