Travis-CIで行っているRedmineプラグイン用テストをローカルで行う

Redmine XLSX format issue exporterのCIはTravis-CIを使わせてもらっています。
Travis Integration for Redmine Pluginsを使うとRubyとRedmineのバージョンの組み合わせなども結構簡単に環境を作れます。
ただGitHubへのPushがトリガーなのでローカルでもできると確認とかできていいかな、と思って、Travis-CI環境をローカルでというのをやってみました。
結論から言うと、Pushしちゃう方が早い、と言う感じでした。。。

まずは公式

Troubleshooting Locally in a Docker Imageで、Dockerで提供されているイメージと.travis.ymlからCI用のシェルスクリプトを出力するtravis-buildのインストールについて書かれています。
最後の最後で手動で依存関係解決しCIコマンド実行してね、で終わってて詰まりました。

実際にやった手順

環境

  • macOS Sierra 10.12.4
  • Docker version 17.03.1-ce, build c6d412e

手順

1. Dockerイメージを起動してログインする
~ $ docker pull travisci/ci-garnet:packer-1478744932
packer-1478744932: Pulling from travisci/ci-garnet
Digest: sha256:9380acbb65ed1ae6e5a0b545616f2f4a9f8d6855c264a45924dd52d3ff0589f5
Status: Image is up to date for travisci/ci-garnet:packer-1478744932
~ $ docker run --name travis-redmine-ci --rm -dit travisci/ci-garnet:packer-1478744932 /sbin/init
<snip>
~ $ docker exec -it travis-redmine-ci bash -l
root@foo:/# su - travis
travis@bar:~$

参考ページ
https://docs.docker.com/engine/reference/commandline/run/
http://docs.docker.jp/engine/reference/run.html
https://docs.docker.com/engine/reference/commandline/exec

2. Travis-CI CLIをインストールする
travis@bar:~$ gem install travis
<snip>
travis@bar:~$ git clone --depth=50 --branch=master https://github.com/travis-ci/travis-build.git
<snip>
travis@cc01d74d8710:~$ travis
Shell completion not installed. Would you like to install it now? |y|
<snip>
travis@bar:~$ cd travis-build
travis@bar:~$ ln -s `pwd` ~/.travis/travis-build
travis@bar:~$ bundle install --gemfile ~/.travis/travis-build/Gemfile
<snip>
travis@bar:~$

参考ページ
https://docs.travis-ci.com/user/common-build-problems/#Troubleshooting-Locally-in-a-Docker-Image
https://github.com/travis-ci/travis.rb

3. .travis.ymlからCI用のスクリプトを生成する
ここでは、Redmine XLSX issue exporterのリポジトリをクローンしています。
リポジトリのルートに.travis.ymlがあります。
travis@bar:~$ cd ~/builds
travis@bar:~$ git clone https://github.com/two-pack/redmine_xlsx_format_issue_exporter.git
travis@bar:~$ cd redmine_xlsx_format_issue_exporter
travis@bar:~$ travis compile 1.1 > ci.sh

4. スクリプトを修正する(その1)
Dockerの制約でスクリプト内で行っている/etc/hostsの変更ができなくなっています。
このため、無理やりですが参考ページを参考に、スクリプトを変更して対処します。

変更前
sudo sed -e 's/^\(127\.0\.0\.1.*\)$/\1 '`hostname`'/' -i'.bak' /etc/hosts
test -f ~/.m2/settings.xml && sed -i.bak -e 's|https://nexus.codehaus.org/snapshots/|https://oss.sonatype.org/content/repositories/codehaus-snapshots/|g' ~/.m2/settings.xml
sudo sed -e 's/^\([0-9a-f:]\+\) localhost/\1/' -i'.bak' /etc/hosts

変更後
cp /etc/hosts ./hosts.new
sudo sed -e 's/^\(127\.0\.0\.1.*\)$/\1 '`hostname`'/' -i'.bak' ./hosts.new
test -f ~/.m2/settings.xml && sed -i.bak -e 's|https://nexus.codehaus.org/snapshots/|https://oss.sonatype.org/content/repositories/codehaus-snapshots/|g' ~/.m2/settings.xml
sudo sed -e 's/^\([0-9a-f:]\+\) localhost/\1/' -i'.bak' ./hosts.new
cp -f ./hosts.new /etc/hosts

参考ページ
http://blog.jonathanargentiero.com/docker-sed-cannot-rename-etcsedl8ysxl-device-or-resource-busy/

5. スクリプトを修正する(その2
travis-buildのページに書いてありますが、.travis.ymlに書かれているenvやmatrixはスクリプト生成時に反映されません。このため、スクリプトでいくつかの修正が必要です。
赤字部分が該当箇所で.travis.ymlの定義に該当します。

  • 使用するRubyバージョンを書き換え
    travis_cmd rvm\ use\ 2.0.0\ --install\ --binary\ --fuzzy --assert --echo --timing
  • 使用するRedmineバージョンの書き換え
    travis_cmd export\ REDMINE_VERSION\=2.5.2 --echo
  • 対象ブランチの指定
    travis_cmd git\ clone\ --depth\=50\ --branch\=\'\'\ https://github.com/two-pack/redmine_xlsx_format_issue_exporter.git\ two-pack/redmine_xlsx_format_issue_exporter --assert --echo --retry --timing

6. スクリプトを実行する
travis@bar:~$ bash ci.sh

まとめ

.travis.ymlのmatrixやenvの設定を活かしたスクリプトをうまく生成できないため、手間がかかってしまいます。
Travis-CI上でのみ失敗するとかでなければ、大人しくブランチにプッシュしてクラウドで回してもらう方が良さそうです。


コメント

このブログの人気の投稿

[Spring] Autowiredアノテーションを使っているクラスのユニットテスト

Spring + Thymeleafでデザインの分離を進める(のとっかかり) [Spring Framework Advent Calendar 2012 5日目 #jsug ]

半固定抵抗を使ってみる(回路図も書いてみた)