みずきち日記

ひらすらプログラミング

外部から任意の github actions を実行する

通常、github actions では、ブランチの actions をトリガーとするケースが多いと思います。 しかし、Slack 上で特定の actions を実行したいなど、任意のタイミングで github 外部から actions を実行するための手法を紹介します。

その場合、repository_dispatch を使います。repository_dispatch に指定した type を curl で実行する際の event_type として指定すると、合致する job が実行されます。

以下の例では、前回の記事で紹介した Android アプリのバージョンを更新する shell script を、外部からのイベントで発火し、更新したアプリバージョンの Pull Request を作成する actions を定義しています。

name: dispatch_sample

on:
  repository_dispatch:
    types: [dispatch-sample]

jobs:
  dispatch-sample-job:
    runs-on: ubuntu-latest
    name: bump up app versions
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: setup git
        run: |
          git config --local user.name bump-up-bot
          git config --local user.email bump-up-bot@google.com

      - name: bump up app versions
        run: |
          ./bump.sh ${{ github.event.client_payload.version_name }}

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          commit-message: bump up app versions
          title: bump up app versions to ${{ github.event.client_payload.version_name }}
          branch: ${{ github.event.client_payload.branch }}

上記 actions を実行するためには、外部から curl などで post します。

$ curl -X POST https://api.github.com/repos/[your-github-id]/[your-github-repository]/dispatches 
  -H "Authorization: token [your-access-token]"
  -H "Accept: application/vnd.github.everest-preview+json"
  --data "{\"event_type\": \"dispatch-sample\", \"client_payload\": {\"branch\": \"release/hoge\", \"version_name\": \"1.0.0\"}}"

この例では、repository_dispatch として dispatch-sample が定義されている job を実行します。 また、外部から情報を渡したい場合、client_payload として json 形式でデータを与える事ができます。

上記 curl を実行すると、client_payload として指定した version_name にアプリの version 名が更新され、version_code はインクリメントした差分情報を、mater からチェックアウトした release/hoge ブランチ上でコミットし、Pull Request を作成するところまで自動でやってくれます。

例えば、Slack から更新したい version name を指定し、lambda などから上記 post を実行すれば、 アプリのバージョンアップデートは slack 上で完結することが出来るので、普段のリリースフローを少し便利に済ますことが出来ます。

是非参考にしてみてください。