ようへいの日々精進XP

よかろうもん

実録にっぽん CircleCI ばなし 〜 Workflows のジョブ制御を完全に理解した (わけではない) 〜

tl;dr

CircleCI の Workflows で, 世界中で多分自分だけがハマった (他の人はきっとハマることは無いはず) のでメモっておきます.

そして, この記事は...

YAMAP エンジニア Advent Calendar 2019 の 7 日目の記事になる予定です.

qiita.com

そして, CircleCI Advent Calendar 2019 の 7 日目の記事になる予定です.

qiita.com

とある .circleci/config.yml

むかーし, むかーし

とある .circleci/config.yml (以後, config.yml) がありましたとさ.

version: 2.1

executors:
  default:
    docker:
      - image: docker:19.03.5-git

jobs:
  test:
    executor:
      name: default
    steps:
      - run:
          name: Test
          command: |
            echo 'Test'
  build:
    executor:
      name: default
    steps:
      - run:
          name: Build
          command: |
            echo 'Build'
  deploy:
    executor:
      name: default
    steps:
      - run:
          name: Deploy
          command: |
            echo 'Deploy'

workflows:
  version: 2
  test-only:
    jobs:
      - test:
          filters:
            branches:
              ignore: 
                - master
                - development
  build-after-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: 
                - master
                - development

この config.yml の Workflows で実現したかったのは,

  • master と development ブランチの場合には, build ジョブと deploy ジョブを実行したい
  • また, build ジョブの後に deploy ジョブを実行する必要がある
  • master と development ブランチ以外は test ジョブのみ実行したい

だったそうな.

ところが

master と development 以外のブランチでも build と deploy のジョブが動いちゃうことを確認したそうな.

f:id:inokara:20191206001231p:plain

あれ, deployment/demo02 ブランチなのに, test-onlybuild-after-deploy が動いちゃってる. なんでやねん.

しかも, build しか動いていないという...

f:id:inokara:20191206001553p:plain

修正

冒頭の config.yml を以下のように修正したそうな.

... (略) ...
workflows:
  version: 2
  test-only:
    jobs:
      - test:
          filters:
            branches:
              ignore: 
                - master
                - development
  build-after-deploy:
    jobs:
      - build:
          filters:
            branches:
              only: 
                - master
                - development
      - deploy:
          requires:
            - build

test-only ワークフローは, 以下のように ignore キーに指定された masterdevelopment ブランチではジョブは発動しないようになっていますな. これは, 見りゃ判るよ案件. build-after-deploy ワークフローが今回の肝で, deploy ジョブは build ジョブに依存しているので, requires キーを指定しています. そして, 懸案となっていた masterdevelopment 以外でも動いちゃうのは, build ジョブにだけ filters を設定すれば良かったんですな.

これで改めてジョブを実行してみると...

以下は deployment/demo02 ブランチ.

f:id:inokara:20191206002135p:plain

以下は master ブランチにマージした場合の挙動.

f:id:inokara:20191206002422p:plain

意図した通りにジョブが動いていることを確認しましとさ.

めでたし, めでたし.

参考

circleci.com