はじめに
Phoenixで作成したアプリケーションのCI環境をwerckerを用いて構築するのにつまづいた箇所がいくつかあったのでまとめてみました。
環境
- Phoenix 1.4.0
- Elixir 1.7.3
wercker.yml
の設定
今回は以下のようなwercker.yml
を用いてCIを回せるようにしたいと思います。
ちなみに今回のCIではフロントエンドのテストは行なっていません。
box: elixir:1.7.3
services:
- id: postgres
env:
PASSWORD: postgres
USER: postgres
build:
steps:
- script:
name: setup system
code: |
export MIX_ENV=ci
apt-get update
apt-get install -y build-essential
- script:
name: setup mix
code: |
mix local.hex --force
mix deps.get --force
mix local.rebar --force
- script:
name: lint test
code: mix format --check-formatted
- script:
name: background test
code: mix test
ポイントはMIX_ENV
をci
にしているところです。
これはPhoenix側でDB周りの設定を行うのにconfig/ci.exs
として新たな環境を構築するようにしているために必要な設定です。
また、setup mix
はテストを行うのに必要なライブラリのインストールを行なっています。このscript
を飛ばしてしまうとうまくテストを行うことができなくなってしまうので注意してください。
Phoenix側の設定
Phoenix側では、主に以下の二つを行うので、順番に説明していきたいと思います。
-
ci.exs
の作成 -
mix.exs
の修正
ci.exs
の作成
先ほどwercker.yml
ではMIX_ENV
をci
に設定しました。
これはtest環境とは別に、wercker用のDB設定を行うためのconfigファイルを使用するためです。
ちなみにwerckerでテストを回せるようにするのにここで一番つまづきました。
作成するconfig/ci.exs
は以下の通りです。
blog_app
、BlogAppWeb
、BlogApp
はご自身のアプリケーションに合わせたものに修正しましょう。
use Mix.Config
# We don't run a server during test. If one is required,
# you can enable the server option below.
config :blog_app, BlogAppWeb.Endpoint,
http: [port: 4002],
server: false
# Print only warnings and errors during test
config :logger, level: :warn
# Configure your database
config :blog_app, BlogApp.Repo,
adapter: Ecto.Adapters.Postgres,
username: System.get_env("POSTGRES_ENV_USER"),
password: System.get_env("POSTGRES_ENV_USER"),
database: "postgres#{System.get_env("TEST_ENV_NUMBER")}",
hostname: System.get_env("POSTGRES_PORT_5432_TCP_ADDR"),
port: System.get_env("POSTGRES_PORT_5432_TCP_PORT"),
pool: Ecto.Adapters.SQL.Sandbox
注目していただきたいのはconfig :blog_app, BlogApp.Repo
の部分です。ここに書いてある環境変数の説明は
https://devcenter.wercker.com/administration/services/examples/postgresql/
にあります。これらの設定をしないとwercker上で正しくDBの作成を行うことができません。
ちなみにこれらの設定方法はRailsのDB設定を行ってくれるパイプラインの
https://github.com/wercker/step-rails-database-yml
を参考にしています。
mix.exs
の修正
前項でci.exs
の作成をしましたが、これだけではまだ正しくCIを回すことができません。
理由は、mix.exs
に記述されているtest環境用の設定が、MIX_ENV
をci
にしてしまったためにwercker上で適用されなくなってしまっているためです。
よって、最後にmix.exs
のtest環境用の設定がCI環境にも適用されるように修正します。
mix.exs
で修正を行うのは以下の部分です
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
この設定をci
にも適用させるようにするため、以下のように設定を追加します。
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(:ci), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
これで基本的な設定は完了です。テスト用にライブラリを入れている場合は、適宜CI環境でもインストールするようにdefp deps
を書き換えましょう。
最後に
今までwerckerはRuby、Railsでしか利用したことがなかったので、Phoenixで使用するのにかなりてこづってしまいました(https://github.com/wercker/step-rails-database-yml を何も考えずに使用していたことを反省しました)
werckerは個人開発ではとても重宝するサービスだと思っているので、これからもつまづくことがあったら記事にまとめていきたいです。