LoginSignup
9
9

More than 5 years have passed since last update.

GitタグのpushでCircleCI 2.0のビルドを実行する

Posted at

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点につきます。仕様が分かりづら過ぎます :angry:

  • 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
9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9