GitHubへのファイル修正などのpush時は行わないけどタグをつけた際だけ行いたいジョブの書き方 ここではデプロイ処理について書きました。
そもそもtagとは
上記によると単なるコミットのエイリアスのようなものとのこと。 タグを指定してDockerHubと連携したりすることが可能
# タグの一覧をみる $ git tag # タグ名を削除 $ git tag -d # タグを指定してclone $ git clone ${REPOSITORY_NAME} -b "${BRANCH_NAME}|${TAG_NAME}" # タグを生成して $ git tag -a ${TAG_NAME} -m 'comment' # リモートと同期 $ git push origin ${TAG_NAME} $ git push origin --tags
リネームやらリモート上のタグの操作もできるんですね。
タグをトリガーとしたジョブ
ここでは上記のうちのgit push origin --tagsを指定した時のみ行いたいジョブを定義する方法を記載。
workflows: version: 2 build_and_test: jobs: - lint: filters: tags: only: /.*/ - build: requires: - lint filters: tags: only: /.*/ - deploy: requires: - lint - build filters: branches: # 全てのブランチを無視 ignore: /.*/ tags: # 全てのタグについて行う only: /.*/
上記のようにworkflowを記載することでタグづけされたpushをトリガーとしたジョブを定義することができます。 (buildとlintについては常時実行される)
上の書き方だと全てのタグに反応するが正規表現を用いるフィルタリングも可能です。 下記の例だと「v0.1」みたいなタグの時のみ反応するジョブを定義できます。 このタグへprodやtestなどのプレッフィックスをつけることでデプロイ時の処理を分けることも可能です。
tags: only: /^v[0-9]+(\.[0-9]+){2}.*/
実際のデプロイ処理を書くと下記のような感じでしょうか。 前段のビルド結果をキャッシュから取得してDockerHubへpushといった流れになるかと思います。
- run: name: Load image command: docker load -i {DockerImage} - run: name: Tag command: docker tag ${USER} ${DockerImage}:latest ${USER}/${DockerImage}:${CIRCLE_TAG} # CIRCLE_TAG : 現在のビルドがタグ付けされている場合の git タグの名前。 - run: name: Docker Login command: docker login -u ${USER} -p ${PASS} - run: name: Push image command: docker push ${USER} /${DockerImage}