LoginSignup
5
1

More than 5 years have passed since last update.

Phoenixで作成したアプリケーションのCIにWerckerを使う時の設定

Last updated at Posted at 2019-02-10

はじめに

Phoenixで作成したアプリケーションのCI環境をwerckerを用いて構築するのにつまづいた箇所がいくつかあったのでまとめてみました。

環境

  1. Phoenix 1.4.0
  2. Elixir 1.7.3

wercker.ymlの設定

今回は以下のようなwercker.ymlを用いてCIを回せるようにしたいと思います。
ちなみに今回のCIではフロントエンドのテストは行なっていません。

wercker.yml
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_ENVciにしているところです。
これはPhoenix側でDB周りの設定を行うのにconfig/ci.exsとして新たな環境を構築するようにしているために必要な設定です。
また、setup mixはテストを行うのに必要なライブラリのインストールを行なっています。このscriptを飛ばしてしまうとうまくテストを行うことができなくなってしまうので注意してください。

Phoenix側の設定

Phoenix側では、主に以下の二つを行うので、順番に説明していきたいと思います。

  1. ci.exsの作成
  2. mix.exsの修正

ci.exsの作成

先ほどwercker.ymlではMIX_ENVciに設定しました。
これはtest環境とは別に、wercker用のDB設定を行うためのconfigファイルを使用するためです。

ちなみにwerckerでテストを回せるようにするのにここで一番つまづきました。

作成するconfig/ci.exsは以下の通りです。
blog_appBlogAppWebBlogAppはご自身のアプリケーションに合わせたものに修正しましょう。

config/ci.exs
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_ENVciにしてしまったためにwercker上で適用されなくなってしまっているためです。
よって、最後にmix.exsのtest環境用の設定がCI環境にも適用されるように修正します。

mix.exsで修正を行うのは以下の部分です

mix.exs
  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(_), do: ["lib"]

この設定をciにも適用させるようにするため、以下のように設定を追加します。

mix.exs
  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は個人開発ではとても重宝するサービスだと思っているので、これからもつまづくことがあったら記事にまとめていきたいです。

5
1
0

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
5
1