Nao000のぶろぐ

蝶を追っている少年になりたい

Elixirで作った個人開発プロジェクトのGitホスティングの bitbucket の pipelines を試してみた

個人開発プロジェクトで何を作っているか

このブログです。サーバーサイド言語は Elixir でフレームワークは Phoenix を利用しています。gigalixir にホスティングしています。

bitbucket pipelines とは

いわゆるCIというやつです。少し調べたら気軽に利用できそうでしたので試してみました。今回はユニットテストを自動化するだけですのでビルドまでは行いません。ビルドと言っても gigalixir にプッシュするだけですので簡単ではあると思います。無料プランの場合1ヶ月当たり50分まで利用できるようです。 bitbucket-pipelines.yml をプロジェクト直下に用意して利用します。

肝心の bitbucket-pipelines.yml の内容

    pipelines:
      default:
        - step:
            name: My Elixir Test
            image: elixir:1.9.4-alpine
            script:
              - apk update
              - apk add --no-cache make gcc libc-dev
              - mix local.hex --force
              - mix local.rebar --force
              - mix deps.get
              - MIX_ENV=test mix test --trace

ユニットテストを実行する環境でデータベース接続しない

自分の認識ですが、ユニットテストは自分達が開発した部分のテストをするためのものと認識しています。ので、データベースからデータを取得できるかのテストやフレームワーク自体のテストは行いません。 docker image を利用するので狙ったデータを格納したデータベースも用意可能ですが、テスト時間を短縮できるという利点もあります。

ユニットテスト時にデータベース関連の処理を実行しないようにする

mix.exs test コマンドでマイグレーションを実行させない

test コマンドを実行するときに "ecto.drop", "ecto.setup" を実行させないようにします。純粋に test だけを実行させます。

      defp aliases do
        [
          "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
          "ecto.reset": ["ecto.drop", "ecto.setup"],
          # test: ["ecto.create --quiet", "ecto.migrate", "test"]
          test: ["test"] # テーブル作成しないので test のみにする
        ]
      end

lib/nao000dotcom/application.ex データベース接続を監視対象から外す

データベース接続監視処理を外します。この監視する仕組みが未だに身体に馴染んでいないです。データベースに接続できませんエラーがログ一杯に表示されることによってテスト結果が不明瞭になるのを避けるためです。Phoenixにおけるデータベース接続箇所を探し出せていないのでとりあえず監視から外しています。

      def start(_type, _args) do
        # 省略
        children = case Mix.env() do
          # テスト時には Nao000dotcom.Repo 監視しない
          # Endpoint はノリで監視しない
          :test -> []

          # 通常時
          _ -> [
            Nao000dotcom.Repo,
            Nao000dotcomWeb.Endpoint
          ]
        end

        # See https://hexdocs.pm/elixir/Supervisor.html
        # for other strategies and supported options
        opts = [strategy: :one_for_one, name: Nao000dotcom.Supervisor]
        Supervisor.start_link(children, opts)
      end

実行した様子

push すると自動実行されます。bitbucket上の画面では以下のようにpipelinesの実行結果が確認できます。

pipelinesの実行結果の様子

所感

CIというものを初めて利用したこともあってかモダンな開発をしている感覚に満足しました。ユニットテスト可能な設計を目指して実装している最中にも結構な満足感を得られます。

1回の実行時間が2分で、多く見積もって3分ですので、ざっと計算すると無料プランでは16回の pipelines 実行が可能です。コストを考えるとリリースするタイミングも気をつけたほうがよさそうです。