⚙️

不安定なGithub actionsのworkflowをリトライする処理を書く。

2024/07/22に公開

不安定なGithub actionsのworkflowを自動的にリトライする処理を書く。

導入

Github actionsのテストや自動デプロイなどのworkflowにおいて、時折不安定な処理を使わないとならない時があります。外部サーバに秘密鍵などのファイルを設置しておき、そちらをSFTPでダウンロードするような処理の場合、状況によってはネットワークが不安定で接続できずにworkflow全体が失敗するケースが見られます。

そんな問題が発生した場合、問題となってるピーキーな処理自体を修繕してしまうのが一番良いのですが、どうしても外部の問題などが絡んでしまい対応できない! となった場合、actionsのworkflowを早々に例外で終了させてしまい、workflowのリトライさせた方が早いということがあります。

今回、Github appを使い、actionsのworkflowが異常終了したイベントを検知して、5回まではactionsのworkflowをリトライさせる処理を作成していきます。

準備

  • Githubのアカウントが必要
  • 対象となるGithub actionsのワークフローが必要
  • Github appを作成できる権限が必要 (Github appのインストール自体は全体に有効にしておけばどこからでもできるようです)

実装

Github appの作成

  1. Github appの作成ページを開く
    [ユーザアイコン] > [Setting] > [Developer Setting] > [Github apps] > [New Github app]
  2. 新しくGithub appを作成
    • Github App nameはアプリに付けたい名前を入力。
    • HomePage URLは適当なものでOK
    • WebhookはActiveのチェックを外す
    • Permissionsは下記の三つのみを設定してください。Repository permissions配下にあります。
      • Actions (Read and Write)
      • Metadata (Read only)
      • Workflows (Read and Write)
  3. Generate a private keyを押して秘密鍵を発行
    こちらで取得する秘密鍵と、App IDは後ほどCIの中で一時トークンの発行に使いますので大事に保管してください。

Github appのリポジトリへのインストール

https://github.com/organizations/{{org名}}/settings/apps/{{app名}}/installations

上記にアクセスしてリポジトリへのアプリのインストールを行なってください。

補足説明ですが、自分のアカウント内で作成したアプリであればただ上記でインストールを行うだけで問題ありませんが、もし別のアカウントにアプリをインストールさせたいという場合、[Advanced]からGithub appをパブリックにするとうまくいきます。

https://docs.github.com/ja/apps/creating-github-apps/registering-a-github-app/making-a-github-app-public-or-private

リトライタスクのyamlファイルの作成

下記のようにyamlファイルを作成して、.github/workflowディレクトリにアップしてください。

name: Rerun failed workflow

# workflow「Flutter CI」が完了後に実行される
on:
  workflow_run:
    workflows: ["Flutter CI"]
    types:
      - completed

jobs:
  rerun_workflow:
    runs-on: ubuntu-latest
    # workflowが失敗しており、尚且つこのworkflowの実行回数が5回以下のときのみ以下を実行
    if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.run_attempt < 5 }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    # Github appの秘密鍵を使って一時トークンを発行
    - name: Generate GitHub Apps Token
      id: generate-github-apps-token
      uses: tibdex/github-app-token@v1
      with:
        app_id: ${{ secrets.APP_ID }}
        private_key: ${{ secrets.APP_PRIVATE_KEY }}
    # ghを使い、失敗したworkflowをリトライさせる
    - name: Rerun workflow
      run: |
        gh run rerun ${{ github.event.workflow_run.id }} --failed
      env:
        GH_TOKEN: ${{ steps.generate-github-apps-token.outputs.token }}

アプリを作成するときの秘密鍵とAPP IDについてはそれぞれ環境変数に保存してください。秘密鍵の内容は丸ごとコピペでAPP_PRIVATE_KEYに保存。APP_IDにアプリ名を保存してください。

まとめ

Github appの使い方については知らなかったので参考になりました。また、Github actionsのデフォルトマシンの中ではGithub CLIを使うことができるようですが、これをホステッドランナーを使ったりする場合は、別途インストールが必要になるかと思います。そちらについては、誰か別の人の資料などを参考にしながら追記などしていきたいです。

参考サイト

https://www.docswell.com/s/r4mimu/ZXYR73-2024-05-16-184345
https://zenn.dev/tatsuo48/articles/72c8939bbc6329

Discussion