CircleCIでジョブを途中で終了する


任意のタイミングでジョブを終了する方法は、run:circleci step halt を実行することです。

なぜこんなものが必要かというと、masterにタグがpushされたときだけ処理したいような場合があります。
しかしこんなふうにfiltersを設定しても、masterにプッシュされただけで、タグが無くてもreleaseジョブは実行されてしまいます。

config.yml
workflows:
  version: 2
  release:
    jobs:
      - release:
          filters:
            branches:
              only:
                - master
            tags:
              only:
                - /^.*$/

そこでreleaseジョブの中で、タグが設定されていなかったら後続の処理をしないでスキップしたいという発想になりました。
以下のようなジョブ定義で意図した動作になりました。

config.yml
jobs:
  release:
    <<: *job_base
    steps:
      - run:
          name: skip_if_no_tag
          command: |
            if [ "${CIRCLE_TAG}" == "" ]; then
              echo "no tag"
              circleci step halt
            fi
      - checkout
      - run: bundler install
      - <<: *restore_gradle_cache
      - <<: *resolve_gradle
      - <<: *save_gradle_cache
      - run: fastlane deploy