この記事は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
は適宜読み替えてください -
build
jobはなんとなく、https://github.com/CircleCI-Public/circleci-demo-elixir-phoenix/blob/master/.circleci/config.ymlを見ながら書いてみました- Supported Languages Guideからのリンク先
- 要は、
mix test
したいがために準備をしてから、mix test
を行っているのみです
-
deploy
jobはなんとなく、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