Gitでタグを打ったときに自動的にCircleCIのビルドを実行しようとして盛大にハマったので、情報を残しておきます。CircleCIは、バージョン1.0ではなくバージョン2.0の想定です。
ここでは、次の条件でビルドを開始するジョブを作ります。
- Gitの任意のブランチ&タグをpushすると、ビルド処理を実行する
- Gitのタグ (
v〇〇
) またはmaster
ブランチをpushすると、デプロイ処理も実行する
ビルドとデプロイのジョブを分けない方法
あまり格好よくないですが、こちらの方がシンプルで簡単です。ポイントは次の2点です。
-
filters/tags/only
を指定し、Gitタグをpushした場合もジョブが開始されるようにする -
deploy
ステップの中でpushされたGitタグまたはブランチを特定し、デプロイ処理も実行するかどうかを判定する
.circleci/config.yml
version: 2
jobs:
build:
docker:
- image: circleci/golang:latest
steps:
- checkout
- run: echo "Hello, World"
- deploy:
name: deploy build artifact
command: |
if [ "${CIRCLE_TAG}" != "" -o "${CIRCLE_BRANCH}" == "master" ]; then
[ "${CIRCLE_TAG}" != "" ] && TAG=${CIRCLE_TAG} || TAG=latest
echo "Deploy! ${TAG}"
fi
workflows:
version: 2
build-and-deploy:
jobs:
- build:
filters:
tags:
only: /v.*/
ビルドとデプロイのジョブを分ける方法
Workflowらしく2つのジョブを使って実現する方法はこちらです。ポイントは、次の1点につきます。仕様が分かりづら過ぎます
-
deploy
ジョブだけでなくbuild
ジョブにもfilters/tags/only
を指定する
.circleci/config.yml
version: 2
jobs:
build:
docker:
- image: circleci/golang:latest
steps:
- checkout
- run: echo "Hello, World"
deploy:
docker:
- image: circleci/golang:latest
steps:
- checkout
- run:
name: deploy
command: |
[ "${CIRCLE_TAG}" != "" ] && TAG=${CIRCLE_TAG} || TAG=latest
echo "Deploy! ${TAG}"
workflows:
version: 2
build-and-deploy:
jobs:
- build:
filters:
tags:
only: /v.*/
- deploy:
requires:
- build
filters:
tags:
only: /v.*/
branches:
only: master
1つ目の方法とは違ってジョブが2つに別れているため、ビルドジョブの出力をデプロイジョブで使い回したい場合は注意が必要です。 persist_to_workspace
, attach_workspace
などを使って、ジョブからジョブへ成果物を受け渡す必要があるでしょう。
.circleci/config.yml
jobs:
build:
steps:
- ...
- persist_to_workspace:
root: /tmp/workspace
paths:
- build/*
deploy:
steps:
- ...
- attach_workspace:
at: /tmp/workspace
- run: cat /tmp/workspace/build/output.txt