60 日間リポジトリに「アクティビティ」がない場合、ワークフローは自動的に無効化されます。
この「アクティビティ」は公式から細かく説明されていませんが、少なくともコミットの作成は「アクティビティ」とみなされるようです。
参考「ワークフローの無効化と有効化 - GitHub Docs」
参考「schedule - ワークフローをトリガーするイベント - GitHub Docs」
0. まとめ
回避方法は主に以下の 2 つがあります:
- GitHub API を用いてワークフローを有効化する
- ワークフローが既に有効の場合でも、期限が延長される
- ワークフローからの有効化も可
- (要確認) 期限を延長したいワークフローそれぞれを有効化する必要がある?
- コミットを作成する
- ワークフローからの push も可
- オプション
--allow-empty
を用いた空コミットも可 - (要確認) デフォルトブランチ以外も可?
1. GitHub API でワークフローを有効化する
GitHub API を用いてワークフローを有効化すると、その時点が 60 日の基準になります。
GitHub Actions の cron は実行されないこともあるため、月に 1 回より 2 回ほど実行を試みた方が良いと思います。
ワークフロー ID を取得しなくてもワークフローのファイル名で操作可能です。
name: Prevent scheduled workflow from being automatically disabled
on:
schedule:
- cron: '45 14 4,19 * *'
workflow_dispatch:
concurrency:
group: keepalive
cancel-in-progress: false
jobs:
keepalive:
permissions:
actions: write
runs-on: ubuntu-latest
steps:
- name: Re-enable workflow
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
run: |
gh workflow enable keepalive.yml
gh workflow enable foo.yml
※ここでは GITHUB_TOKEN
を用いてワークフローの有効化を行うため、権限 permissions.actions: write
が必要です。
※ここではリポジトリをチェックアウトせずに GitHub CLI を使用するため、環境変数またはコマンドのオプションを用いてリポジトリを指定する必要があります。
※リポジトリは github.repository
または環境変数 GITHUB_REPOSITORY
から取得出来ます。
参考「"Enable a workflow" のきめ細かいアクセス トークン - ワークフローの REST API エンドポイント - GitHub Docs」(permissions.actions: write
)
参考「Repository permissions for "Actions" - GitHub Appに必要な権限 - GitHub Docs」(PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable
)
参考「Controlling permissions for GITHUB_TOKEN - GitHub Docs」(permissions.actions
)
参考「ワークフローで GitHub CLI を使用する - GitHub Docs」
参考「GitHub CLI - ワークフローの無効化と有効化 - GitHub Docs」
参考「gh environment - GitHub CLI | Take GitHub to the command line」(GH_REPO
)
参考「gh workflow enable - GitHub CLI | Take GitHub to the command line」
参考「github context - Accessing contextual information about workflow runs - GitHub Docs」(github.repository
)
参考「Default environment variables - Store information in variables - GitHub Docs」(GITHUB_REPOSITORY
)
2. コミットを作成する
コミットを作成すると、その時点が 60 日の基準になります。
GitHub Actions の cron は実行されないこともあるため、月に 1 回より 2 回ほど実行を試みた方が良いと思います。
デフォルトブランチのコミットも有効ですが、本質的でないコミットのため、デフォルトブランチ以外でコミットを作成するべきと思います。
※ (要確認) デフォルトブランチ以外も可?
git switch --orphan keep-active
git commit --allow-empty -m 'Initial commit'
git push --set-upstream origin keep-active
参考「--orphan <new-branch> - Git - git-switch Documentation」
参考「--orphan <new-branch> - Git - git-checkout Documentation」
オプション --allow-empty
を用いて空コミットを作成します。
コミット時のユーザー情報を変更する方法はいくつか有ります:
- オプション
-c <name>=<value>
git config
- 環境変数
name: Prevent scheduled workflow from being automatically disabled
on:
schedule:
- cron: '45 14 4,19 * *'
workflow_dispatch:
concurrency:
group: keepalive
cancel-in-progress: false
jobs:
keepalive:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# TODO: 要確認: デフォルトブランチ以外も可?
with:
ref: keep-active
- name: Commit and push
env:
NAME: 'github-actions[bot]'
EMAIL: '41898282+github-actions[bot]@users.noreply.github.com'
run: |
git -c user.name="$NAME" -c user.email="$EMAIL" commit --allow-empty -m 'Automated commit'
git push
※ actions/checkout
によって GITHUB_TOKEN
が git push
から使用されるようになるため、権限 permissions.contents: write
が必要です。
※メールアドレス 41898282+github-actions[bot]@users.noreply.github.com
は GitHub Enterprise Server では使用出来ません。
参考「"Create a commit" のきめ細かいアクセス トークン - ワークフローの REST API エンドポイント - GitHub Docs」(permissions.contents: write
)
参考「Repository permissions for "Contents" - GitHub Appに必要な権限 - GitHub Docs」(POST /repos/{owner}/{repo}/git/commits
)
参考「Controlling permissions for GITHUB_TOKEN - GitHub Docs」(permissions.contents
)
参考「Usage - GitHub - actions/checkout: Action for checking out a repo」
参考「Push a commit using the built-in token - GitHub - actions/checkout at v4.1.7」
参考「-c <name>=<value> - Git - git Documentation」
参考「user.name - Git - git-config Documentation」
参考「COMMIT INFORMATION - Git - git-commit Documentation」
参考「--allow-empty - Git - git-commit Documentation」