地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【CircleCI】CircleCIで特定のタグのpushだけを検知して行いたいジョブの定義

GitHubへのファイル修正などのpush時は行わないけどタグをつけた際だけ行いたいジョブの書き方 ここではデプロイ処理について書きました。

そもそもtagとは

numb86-tech.hatenablog.com

上記によると単なるコミットのエイリアスのようなものとのこと。 タグを指定して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

qiita.com

リネームやらリモート上のタグの操作もできるんですね。

タグをトリガーとしたジョブ

ここでは上記のうちの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}

参考になるドキュメント