🦁

GitHub actions から任意のブランチを指定して CircleCI のパイプラインを実行する

2022/12/30に公開約2,500字

背景と目的

通常の CI テストと、CircleCI のスケジュールワークフローで特定ブランチに対してのみ実施するスケジュール限定のテストの2種類のテストがあるプロジェクトにおいて、
通常時よりも多くの変更が発生したため、スケジュール限定テストを事前に開発ブランチで実行したいというニーズが発生した。

そこで、これまではスケジュールのみで実行していたテストを手動で実行できるように設定を行った。

要件

  • 手動で CircleCI のパイプラインを実行できること
  • 任意のブランチに対してテストを行えること
  • 通常の CI ではテストは実行しないこと
  • なるべく既存の設定を流用したい

解決策

  • 手動実行の GitHub Actions(workflow_dispatch)から CircleCI のパイプライン実行の API を叩く
    • → GitHub からブランチを選択して手動実行できる
  • その際、API のパラメーターで手動実行であることを伝える
  • CircleCI 側は手動実行のパラメーターがセットされている場合のみジョブを開始する
    • → 通常の GitHub への push トリガーのパイプラインではテストは実行されない

詳しく

GitHub Actions から CircleCI の API を叩く

  • 手動実行のアクション

    GitHub Actions の設定 yaml でトリガーを以下のように設定することで GitHub の画面上から手動実行可能なアクションを作成できる。

    on:
      workflow_dispatch:
    

    このアクションを実行する時、GitHub の UI 上でどのブランチでそのアクションを行うかを選択することが可能。

    Untitled

  • CircleCI の API

    CircleCI の API は Trigger a new pipeline で、パラメーターとしてブランチ(or タグ)を設定する必要がある。

    GitHub Actions では ${{ github.ref_name }} でアクション実行対象のブランチ名が取得できるので、その値をパラメーターにセットする。

    JSON=$(cat << EOS
    {
      "branch": "${{ github.ref_name }}",
      "parameters": {
        "manual": true
      }
    }
    EOS)
    
    RESULT=$(curl https://circleci.com/api/v2/project/{ ** CircleCI のプロジェクト slug **}/pipeline \
      -X POST \
      -H "Circle-Token: ${{ secrets.CIRCLE_TOKEN }}" \
      -H "Content-Type: application/json" \
      -d "${JSON}")
    

手動実行時のみジョブを実行

CircleCI ではパイプラインにパラメーターを設定可能で、パラメーターの値に応じて処理の切り替えも可能。

今回は boolean の manual が true である場合のみジョブを実行するように CircleCI の設定 yaml を編集した。

# 使用するパラメーターの定義が必要
parameters:
  manual:
    type: boolean
    default: false

~~

# manual = true の場合のみ実行
workflows:
  manual_test:
    when: << pipeline.parameters.manual >>
    jobs:
      - test

少しハマったところ

  • CircleCI の API トークンはパーソナルトークン(アカウント)とプロジェクトトークンがあるが、API v2 に使えるのはパーソナルトークン限定
  • メインブランチに GitHub Actions 設定 yaml をマージしないと手動アクションは実行できない
    • そのため一旦空の GitHub Actions yaml を作成して push、メインブランチにマージした
    • メインブランチとアクション対象ブランチで設定 yaml が異なる場合、アクション対象ブランチの内容でアクションが実行される

参考・リンク

ほとんどこちらを参考にしました qiita

Discussion

ログインするとコメントできます