この記事はElixir その2 Advent Calendar 2020 8日目です。
前日は、WindowsでIExで日本語を使う(iex --werl) (Elixir) でした。
はじめに
- Phoenixプロジェクトで、CircleCIを使ってみました
- アカウント登録とかGitHubやBitbucketリポジトリとの連携はなんとな〜くやればできます
-
mix testが自動で行われるようにします - ついでにGigalixirへのデプロイも行います
- プロジェクトのルートに
.circleci/config.ymlを置きます
.circleci/config.yml
- 2021/08/01追記
- 久しぶりに以下を使ってみるとかわっていたところがあるので追記しておきます
- Gigalixirのコマンドインストールの際にPythonが3系にかわっていたり、Rustが必要だったりしました
- 2021/08/01に私がデプロイまでできた
.ymlをご紹介しておきます - https://github.com/TORIFUKUKaiou/autorace_phoenix/blob/dd92d470ed6aa5834ce1eb2f48a5723494124c4c/.circleci/config.yml
.circleci/config.yml
version: 2
jobs:
build:
parallelism: 1
docker:
- image: circleci/elixir:1.10.4
environment:
MIX_ENV: test
- image: circleci/postgres:10.1-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_DB: my_app_test
POSTGRES_PASSWORD: postgres
working_directory: ~/app
steps:
- checkout
- run: mix local.hex --force
- run: mix local.rebar --force
- restore_cache:
keys:
- v1-mix-cache-{{ .Branch }}-{{ checksum "mix.lock" }}
- v1-mix-cache-{{ .Branch }}
- v1-mix-cache
- restore_cache:
keys:
- v1-build-cache-{{ .Branch }}
- v1-build-cache
- run: mix do deps.get, compile
- save_cache:
key: v1-mix-cache-{{ .Branch }}-{{ checksum "mix.lock" }}
paths: "deps"
- save_cache:
key: v1-mix-cache-{{ .Branch }}
paths: "deps"
- save_cache:
key: v1-mix-cache
paths: "deps"
- save_cache:
key: v1-build-cache-{{ .Branch }}
paths: "_build"
- save_cache:
key: v1-build-cache
paths: "_build"
- run:
name: Wait for DB
command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run: mix test
- store_test_results:
path: _build/test/lib/my_app
deploy:
docker:
- image: circleci/elixir:1.10.4
steps:
- add_ssh_keys
- checkout
- run: sudo apt-get update
- run: sudo apt-get install -y python-pip
- run: sudo pip install gigalixir --ignore-installed six
- run:
name: my_app
command: |
echo 'export SUFFIX=$(echo $CIRCLE_BRANCH | tr "[:upper:]" "[:lower:]" | tr -cd "[a-z0-9-]")' >> $BASH_ENV
echo 'export APP_NAME="$GIGALIXIR_APP_NAME-$SUFFIX"' >> $BASH_ENV
source $BASH_ENV
- run: gigalixir login -e "$GIGALIXIR_EMAIL" -p "$GIGALIXIR_PASSWORD" -y
- run: gigalixir git:remote $GIGALIXIR_APP_NAME
- run: git push -f gigalixir HEAD:refs/heads/main
- run: printf "Host *\n StrictHostKeyChecking no" > ~/.ssh/config
- run: gigalixir ps:migrate
workflows:
version: 2
deploy:
jobs:
- build
- deploy:
requires:
- build
filters:
branches:
only: main
-
my_appは適宜読み替えてください -
buildjobはなんとなく、https://github.com/CircleCI-Public/circleci-demo-elixir-phoenix/blob/master/.circleci/config.ymlを見ながら書いてみました-





Supported Languages Guideからのリンク先 - 要は、
mix testしたいがために準備をしてから、mix testを行っているのみです
-
-
deployjobはなんとなく、https://github.com/gigalixir/gigalixir-getting-started/blob/42a73c9e0f7de50cbfabd092a504aa454f9f9fc8/.circleci/config.ymlを見ながら書いてみました-





https://gigalixir.readthedocs.io/en/latest/deploy.htmlからのリンク先 - 要は、
git push -f gigalixir HEAD:refs/heads/mainとgigalixir ps:migrateをしたいがために、gigalixirコマンドのインストールやらの準備をしてから、目的のコマンドを実行しています - Gigalixirにはあらかじめ枠(アプリケーションとデータベース)が用意されている状態を想定しています
- 参考という名の手前味噌
- Hello Gigalixir (Phoenix/Elixir)
-
mainブランチ1にマージされた場合にのみデプロイすることとしています
-
プロジェクト固有の設定
mix release
- ほぼほぼ、Deploying with Releasesに書いてある通りのことをやります
-
config/prod.secret.exsをconfig/releases.exsにリネーム -
config/releases.exsの先頭のほうにあるuse Mix.Configをimport Configに書き換える -
config/prod.exsの中でimport_config "prod.secret.exs"を呼び出しているところはもはやいらないので消す -
config/releases.exsに、config :my_app, MyAppWeb.Endpoint, server: trueを足す -
config/prod.exsのurl:のところを変更する -
lib/my_app/release.exをつくる
config/prod.exs
@@ -10,7 +10,7 @@ use Mix.Config
# which you should run after static files are built and
# before starting your production server.
config :yubaba, YubabaWeb.Endpoint,
- url: [host: "example.com", port: 80],
+ url: [host: "gigalixir-app-name.gigalixirapp.com", port: 443],
cache_static_manifest: "priv/static/cache_manifest.json"
# Finally import the config/prod.secret.exs which loads secrets
# and configuration from environment variables.
-import_config "prod.secret.exs"
+# import_config "prod.secret.exs"
-
gigalixir-app-name.gigalixirapp.comは適宜読み替えてください
lib/my_app/release.ex
defmodule MyApp.Release do
@app :my_app
def migrate do
load_app()
for repo <- repos() do
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true))
end
end
def rollback(repo, version) do
load_app()
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version))
end
defp repos do
Application.fetch_env!(@app, :ecto_repos)
end
defp load_app do
Application.load(@app)
end
end
-
MyAppや:my_appは適宜読み替えてください
CircleCI
- プロジェクトの設定で設定します
Environment Variables
- GIGALIXIR_APP_NAME
-
gigalixir appsして、unique_nameを指定します
-
- GIGALIXIR_EMAIL
- GigalixirのログインIDです
- GIGALIXIR_PASSWORD
SSH Key
- 秘密鍵
- passphraseは空2
- Hostnameは空
たとえば
cd ~/.ssh
ssh-keygen -b 4096 -f gigalixir
で作った場合、~/.ssh/gigalixir の中身を登録します。
CircleCIのコンテナからGigalixirのアプリコンテナへデプロイをしますので、CircleCIが秘密鍵を知っておく必要があるというわけです。
Gigalixir
-
https://console.gigalixir.com/#/account/ssh-keysで、公開鍵
gigalixir.pubの中身を登録します - この公開鍵がデプロイ環境の
authorized_keysに設定されるという仕掛けなわけです
Wrapping Up
- GitリポジトリにPushすると、自動で
mix testしてくれるし、mainブランチ1にマージしたら自動でGigalixirへデプロイしてくれます- お前、
test書いていないやん! は、
- いままでいちいち、
git push gigalixir mainしていた自分にさようなら
- お前、
- ありがとうございます! CircleCI !!!
- @im_miolab さんの「【Elixir 1.11】Phoenix Framework + DB開発をDockerでやる #2(CIパイプライン導入)」もご参照ください
- Enjoy Elixir


