Elixir製のプロジェクトをTravisCIで運用するための .travis.yml
を作った.以下のことができるようになっている
- コミットを push するたび
- タグを push するたび
- 上記のコミットpushと同じ動作を行い,成功すればパッケージマネージャーの hex.pm とそのドキュメント置き場の hexdocs.pm にデプロイしてくれる
- そのときにTravisCIのログに秘匿しておきたい情報(
key
とpassphrase
)を残さない
- (ビルドの高速化)
-
sudo: false
を宣言しコンテナベースでの起動を行っている - 外部依存ライブラリを
cache
している
-
この .travis.yml
を使うにはTravisCIの管理画面で
- HEX_ENCRYPTED_KEY
- HEX_PASSPHRASE
が登録されていることが前提となっている.
language: elixir
sudo: false
otp_release:
- 19.3
elixir:
- 1.4.2
env:
global:
- HEX_USERNAME=niku
# Follow other language's environment
# e.g.) `RACK_ENV=test` has been setted as Default Environment Variables
# https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables
- MIX_ENV=test
cache:
directories:
- _build
- deps
script:
- mix credo --strict
# https://github.com/jeremyjh/dialyxir#command-line-options
# > exit immediately with same exit status as dialyzer. useful for CI
- mix dialyzer --halt-exit-status
- mix test
deploy:
# https://docs.travis-ci.com/user/deployment/script/
# must be a scalar pointing to an executable file or command.
provider: script
script: >-
mix deps.get &&
mix hex.config username "$HEX_USERNAME" &&
(mix hex.config encrypted_key "$HEX_ENCRYPTED_KEY" > /dev/null 2>&1) &&
(echo "$HEX_PASSPHRASE"\\nY | mix hex.publish) &&
mix clean &&
mix deps.clean --all
on:
tags: true
バッドノウハウ
現状でうまく動作させるために,整理されると不要になりそうな処理たちや,仕様を間違っていて苦労したところ.
hex.pm はリリース後1時間以内しかデプロイ物を更新できない.同じバージョンをつけた状態の開発でプッシュのたびにデプロイするのには向かない.タグなどで,明示的にデプロイの意思を示すこと.
主要な言語では CI が test 環境として動くように環境変数があらかじめ設定されている.(例: Rails) Elixir で同様に開発するためには自分達で MIX_ENV=test
を宣言しなければいけない.
deploy
の script
は -
を複数並べて逐次処理できないので >-
で擬似的に複数の処理を記述している.ちなみに >
だと最後の行に改行が含まれてしまい,最後のコマンドがうまく実行できないため,最後の行に改行を含まない >-
でなければいけない.日本語だとるびまのプログラマーのための YAML 入門 (初級編)にこのあたりの動作の説明があった.
mix hex.config encrypted_key "$HEX_ENCRYPTED_KEY"
は出力を抑制しないと,鍵情報が誰でもみられる TravisCI のログに吐かれてしまうので /dev/null
へと出力している.
mix hex.publish
では Code of Conduct
を読んで Y
を押さないと処理が進まないので "$HEX_PASSPHRASE"\\nY
のような奇妙な標準入力を渡している.
deploy
の script
は実行後に git stash
するため mix clean && mix deps.clean --all
しておかないと Could not restore untracked files from stash
といったエラーになる.この順番を逆にして mix deps.clean --all && mix clean
とするとうまく動作しないので注意.(先に依存関係を消してしまうと,次の mix clean
で,「まず依存関係のインストールをしてください」と言われる)