この記事は「CircleCI Advent Calendar 2020」21日目の記事です。
きのうは@tmasuyamaさんの「【CircleCI】初めて書いた愚直な設定ファイル(config.yml)を解説してみる」でした!
概要
複数のカスタム__Docker__コンテナで構成されたWebアプリケーションの開発環境に、__CIパイプライン__を導入する。
-
__CircleCI__のMachine Executorによるコンテナビルド〜テスト実行CIパイプラインを構築し、__GitHub__リポジトリと連携します。
-
対象アプリケーションは、__Elixir製のWebフレームワークPhoenix__で実装したCRUD WebUIとします。
- 関連: シリーズ第1回目記事
#1(コンテナ開発環境構築~CRUD実装~テスト)
- 関連: シリーズ第1回目記事
-
次回シリーズ第3回目で、CDパイプラインを追加し自動デプロイ機能を導入します。
- 後日リンクを貼ります
実行環境
バージョン | 備考 | |
---|---|---|
macOS | ||
Docker (docker-compose) | ||
CircleCI | 2.1 | Linux Machine Executor Image Ubuntu 1604 |
Elixir | 1.11.2 | compiled with Erlang/OTP 23 |
Phoenix | 1.5.7 | |
PostgreSQL | 12.4 | |
Node.js | 14.15.1 |
ディレクトリ構成
.
├── .circleci
│ └── config.yml
├── .env
├── app
│ ├── Dockerfile
│ └── my_app
├── db
│ ├── Dockerfile
│ └── postgres
└── docker-compose.yml
- 一部ファイルは表記省略しています(
.gitignore
など)
コード
CI設定ファイル
version: 2.1
jobs:
build:
machine:
image: ubuntu-1604:202010-01
steps:
- checkout
- run:
name: Build Docker containers
command: |
set -x
docker-compose build
docker-compose run --rm app bash -c "mix --version"
docker-compose run --rm app mix archive
docker-compose run --rm db bash -c "psql --version"
docker-compose run --rm app bash -c "node --version && npm --version"
- run:
name: Mix deps.get
command: |
set -x
docker-compose run --rm app bash -c "cd my_app && ls && mix deps.get && mix deps.compile"
- run:
name: Npm install in assets directory
command: |
set -x
docker-compose run --rm app bash -c "cd my_app/assets && ls && npm install && node node_modules/webpack/bin/webpack.js --mode development"
- run:
name: Run Docker containers
command: |
set -x
docker-compose up -d
sleep 5
docker ps -f status=running
docker-compose logs
- run:
name: Mix format
command: |
set -x
docker-compose exec app bash -c "cd my_app && mix format --check-formatted"
- run:
name: Mix test
command: |
set -x
docker-compose exec app bash -c "cd my_app && mix test"
- run:
name: Down Docker containers and Finish pipeline
command: |
set -x
docker-compose down --rmi all --volumes --remove-orphans
echo "Finish pipeline"
環境変数設定ファイル
PROJECT_NAME=my_app
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DB=testdb
POSTGRES_PORT=5432
Docker関係ファイル
FROM elixir:1.11.2-slim
WORKDIR /usr/src/app
RUN apt-get update -y && \
apt-get upgrade -y && \
apt-get install -y \
build-essential \
curl \
git \
gzip \
inotify-tools \
ssh \
sudo \
tar
RUN apt-get install -y nodejs npm
RUN npm install -g n
RUN n 14.15.1
RUN apt-get purge -y nodejs npm
RUN yes | mix local.hex
RUN mix local.rebar --force
RUN mix archive.install hex phx_new 1.5.7 --force
RUN apt-get clean
CMD [ "mix", "phx.server" ]
FROM postgres:12.4-alpine
ENV LANG ja_JP.utf8
version: "3"
networks:
backend:
driver: bridge
services:
app:
build: ./app
volumes:
- ./app:/usr/src/app
ports:
- 4000:4000
stdin_open: true
tty: true
command:
sh -c "cd ${PROJECT_NAME} && mix phx.server"
networks:
- backend
db:
build: ./db
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
ports:
- ${POSTGRES_PORT}:5432
volumes:
- ./db/postgres/tmp/data:/var/lib/postgresql/data
restart: always
networks:
- backend
- 以下ディレクトリ(ファイル)は、後述の手順で別途生成します。
app/my_app
db/postgres
コンテナ開発環境構築(まだの人向け)
すでにシリーズ第1回目記事の環境構築が済んでいたら、ここは飛ばしてください。
まだの場合は、 第1回目記事の手順に沿って環境構築をしていきます。
ここでは、やることの概要だけを簡単に書きます。
-
前述のコード
.circleci/config.yml
.env
app/Dockerfile
db/Dockerfile
-
docker-compose.yml
を開発環境に準備します。
-
コンテナビルドやPhoenixプロジェクト生成等のコマンドを実行していきます。
-
設定ファイルのコードを書き換えていきます。
CIパイプライン導入セットアップ
ここから、CircleCIのセットアップをしていきます。
- __GitHub__上に対象リポジトリを作っておきます。
- ブランチを切っておきましょう。そちらにcommit pushしていきます。
- __CircleCI__と連携します。
-
CircleCI Projectsログイン画面から、__「Project」__を選択します。
-
対象リポジトリの__「Set Up Project」__を選択します。
-
以下のポップアップが出たら、__「Start Building」__を選択します。
「Pipeline」ページに移ったら、CircleCIとGitHubリポジトリの連携は設定完了です!
- __CircleCI__側で環境変数を設定します。
- 画面の右上にある__「Project Settings」__を選択します。
- 左カラム__「Environment Variables」__を選択します。
登録する画面に切り替わったら、.env
で設定しておいた環境変数を登録してください。
- リモートリポジトリにプルリクエスト作成します。
これで、push
やmerge
することでCIパイプラインが走るようになりました!
補足
Machine Executor
Executorのタイプに__Machine
__を適用することで、LinuxVMイメージ(Ubuntu)内でjobを走らせることができます。
jobs:
build:
machine:
image: ubuntu-1604:202010-01
Machine Executorを使用すると、Dockerプロセスにフルアクセスできるようになります。
これにより、カスタムDockerコンテナのビルドや実行をしています。
なお、記事執筆時点(2020年12月8日)では、Machine ExecutorはFree planでの使用も可能ですが、
将来の料金改定で Machine Executorの使用に追加料金が必要になる可能性があります
という公式アナウンスがされています。
Elixir / Phoenix
Elixirは、
- 膨大なアクセスやデータの高速処理
- 高い開発効率と育成容易
を両立できるプログラミング言語です。
とくにデータ変換に強みがあります。
ErlangVM上で動作し、__高度な耐障害性、並行処理性能、分散処理性能に優れている__といった特徴を持っています。
- 導入事例
- 大量アクセスのあるWeb・APIサーバ構築
- ビッグデータ分析/AI・機械学習向けデータ加工
- IoT連携
- FinTech
Phoenixは、ElixirのWebアプリケーションフレームワークとなります。
おわりに
今回、複数のDockerコンテナで構成されたWebアプリケーションの開発環境に、CIパイプラインを導入しました。
アプリケーション側技術選定の例としてPhoenix + PostgreSQLコンテナでの構築を取り上げていますが、CircleCIで複数コンテナを扱う基本的な設定は同様の手順で可能です。
本記事で参考になる部分などがあれば幸いです。
次回は、こちらの実行環境にCDパイプラインを追加し、アプリケーションのデプロイ自動化環境を構築します。
明日の「CircleCI Advent Calendar 2020」22日目は、@makotomさんです。お楽しみに!
kokura.ex
おしまいに、Elixirコミュニティの宣伝をすこしだけ。
- 北九州小倉のElixirコミュニティ__「kokura.ex」__は、「高速処理性能」と「高い開発効率性」を両立できるプログラミング言語「Elixir」と、そのWebアプリケーションフレームワーク「Phoenix」を北九州を起点として広め、ワイワイと盛り上げていく技術コミュニティです。
- オンラインでのもくもく勉強会を、毎月ペースで開催しておりますのでぜひどうぞ。
- これから先端技術をやりたい方や、最新のプログラミングを学びたい方、未来に向けてITに強くなりたい方など、技術への興味レベルが高い方や、プログラミングに関心が高い方のご参加を歓迎します。
はじめてElixirに触れる方も、お気軽にご参加ください!- connpassイベントページconnpass fukuoka.ex
(イベント一覧より、kokura.exのページをご覧いただけます)
- connpassイベントページconnpass fukuoka.ex
Elixir アドベントカレンダー
「Elixir Advent Calendar 2020」もありますので、こちらもよろしかったらどうぞ!