maya's blog

About programming, aws and ubuntu

CircleCI 2.0 master push & tag pushをtriggerにする

サンプルコードはGitHub - maya2250/circleci-demoにあります。

やりたいこと

3つのジョブがあり(build, test, deploy)、

  • master以外の全ブランチにpushした際にはbuild, testを実行
  • masterブランチにpushした際にbuild, test, deploy(の一部)を実行
  • masterブランチ & vから始まるtag(v1.0とか) pushした際にbuild, test, deployを実行

.circleci/config.yml

version: 2
jobs:
  build:
    machine: true
    steps:
      - run: echo build job

  test:
    machine: true
    steps:
      - run: echo test job

  deploy:
    machine: true
    steps:
      - run: echo deploy
      - run:
          name: Whether exists tag
          command: |
            if [ "${CIRCLE_TAG-undefined}" != "undefined" ]; then
                echo exist ^v.* tag
            else
                echo no tag
            fi

workflows:
  version: 2
  build-test-and-deploy:
    jobs:
      # build and test jobs is all branch
      - build:
          filters:
            tags:
              only: /.*/

      - test:
          requires:
            - build
          filters:
            tags:
              only: /.*/

      - deploy:
          requires:
            - test
          filters:
            branches:
              only: master
            tags:
              only: /^v.*/

実行例

developブランチにpush

build, testジョブが実行

f:id:maya2250:20180703192259p:plain

masterブランチにpush

build, test, deploy(一部) ジョブが実行

f:id:maya2250:20180703192416p:plain

f:id:maya2250:20180703192427p:plain

masterブランチでv0.0tag push

build, test, deploy ジョブが実行

f:id:maya2250:20180703192542p:plain

f:id:maya2250:20180703192553p:plain

なぜこうしたのか

今回の例では、masterブランチ上のpushとmasterブランチ上でtag pushでは同じworkflowを用いている。tag pushされた際に定義されるCircleCIの環境変数CIRCLE_TAGの有無によって、deployジョブ内の処理内容を切り分けているだけ。

masterブランチ上でtag pushをtriggerにしようとすると、直感的には以下のようにdeployfilstersからbranchを除けばいけるんじゃないかと。 確かに、master上のtag pushがtriggerになり、deployジョブまで走るがしかし、masterブランチ以外をpushした際にもdeployジョブまで走ってしまう。

... # workflow部分
      - deploy:
          requires:
            - test
          filters:
            tags:
              only: /^v.*/

できればmasterブランチでtag pushした際のworkflowは別で書ければいいのだけれど...。あまりtag pushの需要がないのかな?ソースコードのversionとdocker imageのversionを合わせたいから、tag pushした際にdocker imageのbuild, deployまでやってくれればって思って、今回みたいな設定にしたんだな。そういえば。

他に良いやり方があれば、コメントに残してってください:pray: