LoginSignup
8
3

More than 5 years have passed since last update.

Elixir製のプロジェクトをTravisCIで運用するための.travis.yml

Last updated at Posted at 2017-04-17

Elixir製のプロジェクトをTravisCIで運用するための .travis.yml を作った.以下のことができるようになっている

  • コミットを push するたび
    • 静的解析ツールの credo が動き,何かメッセージがあればテスト失敗として通知してくれる
    • 静的型チェッカーの dialyzer が動き,型の不整合があればテスト失敗として通知してくれる
    • 通常の mix test が動き,テスト失敗であれば通知してくれる
  • タグを push するたび
    • 上記のコミットpushと同じ動作を行い,成功すればパッケージマネージャーの hex.pm とそのドキュメント置き場の hexdocs.pm にデプロイしてくれる
    • そのときにTravisCIのログに秘匿しておきたい情報(keypassphrase)を残さない
  • (ビルドの高速化)

この .travis.yml を使うにはTravisCIの管理画面で

  • HEX_ENCRYPTED_KEY
  • HEX_PASSPHRASE

が登録されていることが前提となっている.

.travis.yml
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 を宣言しなければいけない.

deployscript- を複数並べて逐次処理できないので >- で擬似的に複数の処理を記述している.ちなみに > だと最後の行に改行が含まれてしまい,最後のコマンドがうまく実行できないため,最後の行に改行を含まない >- でなければいけない.日本語だとるびまのプログラマーのための YAML 入門 (初級編)にこのあたりの動作の説明があった.

mix hex.config encrypted_key "$HEX_ENCRYPTED_KEY" は出力を抑制しないと,鍵情報が誰でもみられる TravisCI のログに吐かれてしまうので /dev/null へと出力している.

mix hex.publish では Code of Conduct を読んで Y を押さないと処理が進まないので "$HEX_PASSPHRASE"\\nY のような奇妙な標準入力を渡している.

deployscript は実行後に git stash するため mix clean && mix deps.clean --all しておかないと Could not restore untracked files from stash といったエラーになる.この順番を逆にして mix deps.clean --all && mix clean とするとうまく動作しないので注意.(先に依存関係を消してしまうと,次の mix clean で,「まず依存関係のインストールをしてください」と言われる)

この .travis.yml を実際に適用したリポジトリ

8
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3