ポートフォリオ作成の過程でgithubに各ブランチでプッシュした場合はJestを走らせて、mainブランチにプルリクした場合のみs3のwebホスティングしているバケットにデプロイするようなCI/CDを構築したかった。
その過程でcicle ciのconfig.ymlについて理解をする必要があったので載せておく。
とりあえず、結論
version: 2.1
orbs:
aws-s3: circleci/aws-s3@3.0.0
executors:
default:
docker:
- image: cimg/node:14.15.0
- image: cimg/python:3.10
commands:
npm_install:
steps:
- restore_cache:
key: dependency-cache-{{ checksum "package.json" }}
- run:
name: install npm
command: npm install
- save_cache:
key: dependency-cache-{{ checksum "package.json" }}
paths:
- node_modules
jobs:
test_frontend:
executor: default
steps:
- checkout
- npm_install
- run:
npm test
build_deploy:
executor: default
steps:
- checkout
- npm_install
- run:
npm run build
- run:
ls -la
- aws-s3/sync:
arguments: |
--delete --exact-timestamps
from: ./build
to: s3://{{s3のバケット名}}
workflows:
version: 2
continuous_integration&continuous_deploy:
jobs:
- test_frontend
- build_deploy:
requires:
- test_frontend
filters:
branches:
only: main
上から解説していく
version
circle ciのconfigバージョン。
orbs
ジョブ、 コマンド、 Executor などの、共有可能な設定要素をパッケージ化したもので、本来、特定のビルドやコマンドなどを記載しなくてはいけないところを、circle ciのほうでパッケージ化してくれてるので冗長になってしまう部分を簡素に書くことができる。
今回はs3 syncを使うために aws-s3: circleci/aws-s3@2.0.0
を設定。
executors
CircleCI で実行するテストやデプロイを動かすための環境を共通化して使うためのもの、今回でいえば、ソースはReactで構築していたので npmまわりのインストールやビルドにNode.jsが必要なのでそれのDockerイメージと、aws cliのためにPythonイメージを設定している。
commands
これは使いまわしたいコマンドを共通化するときに使えるもの、今回でいえばJestのテスト実行とデプロイ前のビルドに同じnpmコマンドを使うため共通化した。
command
実行するコマンド。
restore_cache
キャッシュを活用することでビルド時間を短縮するが、package.jsonが更新されている場合はモジュールの再インストールが必要なので、checksumでpackage.jsonの中身をチェックして、変化があれば npm install
を実行して、なければ次の処理をスキップするようにしている。
save_cache
キャッシュすることでビルド時間を短縮する。
今回でいえば、node_modulesをキャッシュすることでビルド時間を短縮している。
jobs
wolkflowで実行する単位。
executor
executorsで設定したものを使う。
steps
実行するコマンド。commandsで設定したものを呼び出すこともできる。
checkout
githubとcircleciが連携していることが前提になるが、対象のリポジトリのブランチからソースをチェックアウトする
aws-s3/sync
awsのs3でデプロイするためのsyncコマンド周りのオプションと実行。
最新の3.1.1で --delete --exact-timestamps
をオプション指定するとうまくいかなかったので3.0.0にしている。
詳しくは
fromは同期元のファイルの場所、toは同期先のs3バケットを指定する。
ただし、circle ciのプロジェクトでAWSの各環境変数を設定しておく必要がある。
IAMユーザーを作成して、アクセスキーとシークレットアクセスキーを作成する必要がある。
workflows
jobの実行管理をする。
requires
基本的にjobは並列実行されるが、requiresにjobを指定することで指定したjobが完了してから実行することができる。
今回でいえば、test_frontendでテストが実行されてpassとなった場合のみ、ビルドしたかったので設定。
branches
jobを実行するブランチを指定できる。
ビルドとデプロイに関しては、mainブランチでのみ実行したかったので指定。
一言
CircleCiすごいし、便利っす。