github actionsの「permissions」とはなにか?
これのことです
permissions:
actions: read|write|none
checks: read|write|none
contents: read|write|none
deployments: read|write|none
id-token: read|write|none
issues: read|write|none
discussions: read|write|none
packages: read|write|none
pages: read|write|none
pull-requests: read|write|none
repository-projects: read|write|none
security-events: read|write|none
statuses: read|write|none
リポジトリへのpushの際にエラーに引っかかったため、調べてみます
permissions
でなにができる?
GITHUB_TOKEN
に付与される権限を操作できるようです。
You can use permissions to modify the default permissions granted to the GITHUB_TOKEN, adding or removing access as required, so that you only allow the minimum required access. For more information, see "Automatic token authentication."
You can use permissions either as a top-level key, to apply to all jobs in the workflow, or within specific jobs. When you add the permissions key within a specific job, all actions and run commands within that job that use the GITHUB_TOKEN gain the access rights you specify. For more information, see jobs.<job_id>.permissions.
GITHUB_TOKEN
とは何者なのか調べてみます
GITHUB_TOKEN
とはなにか
GitHub API を呼び出すための一時的な認証情報のようです。
こいつを設定することでgithubの様々な機能にアクセスできるんですね。
The GITHUB_TOKEN is an automatically generated secret that lets you make authenticated calls to the GitHub API in your workflow runs. Actions generates a new token for each job and expires the token when a job completes. The token has write permissions to a number of API endpoints except in the case of pull requests from forks which are always read. These new settings allow you to follow a principle of least privilege in your workflows.
GitHub API
にはどんなものがあるか
以下に一覧がありました。デフォルトで有効なものも記載があります。
GITHUB_TOKEN
を使う仕組み
github actionsで以下を参考にすれば良さそうです。
ワークフローの実行開始時にGITHUB_TOKEN
を自動生成し、GitHub Appにアクセス可能。
ジョブが失敗するタイミング、または最大24時間でその権限は失効する
実験①
以下のワークフローで実験してみます。
name: "permissions test"
on:
workflow_dispatch:
jobs:
test:
permissions: {}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
permissions: {}
ですべての権限を無効化できるそうなので使ってみます
実験① 結果
エラーになりました。
ログを見ると、リポジトリが見つからないとのこと
/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +xxxxxxxxxxxxxxxxxxxxx:refs/remotes/origin/main
remote: Repository not found.
なにかの権限が足りないのでしょう
実験① 修正
以下のようにワークフローを修正したらうまくcheckoutできました
jobs:
test:
permissions:
contents: read
こちらに記載があり、真似したらうまくいった次第です
contents
はデフォルトでread権限が付与されるため、普段特に意識せずcheckoutが成功していたようです。
保留
名前から大体の想像はつくが、なぜcontents
を設定するのか
ググったけど公式ドキュメントには書いてなさげ...
実験② リポジトリへのpush
次は以下のワークフローを試します。
Readmeを作成し、pushします。
name: "permissions test"
on:
workflow_dispatch:
jobs:
test:
permissions:
contents: read
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: git setting and push
run: |
echo "test" > README.md
git config user.name ${{ secrets.GIT_USER }}
git config user.email ${{ secrets.GIT_EMAIL }}
git add .
git commit -m "update README.md"
git push origin main
実験② 結果
エラーになりました。
ログを見ると、リポジトリへの書き込み権限が無いと怒られています。
remote: Write access to repository not granted.
fatal: unable to access 'https://github.com/***/<repo-name>/': The requested URL returned error: 403
これはわかりやすそうですね
実験② 修正
permissions
を以下のように変更します。
jobs:
test:
permissions:
contents: write
readをwriteに変えるだけですね!
これでうまくpushできます。
contents
を設定する?
なぜ以下を参考にするとpermissions
はGITHUB_APP
の権限に準じるそうです。
さらにcontents
を設定する必要のあるAPIがわかります。
今回はリポジトリへのファイル書き込みを行ったので、↓を使ったものと思われます。
ということは、
- 実行したいgithubのAPIを探す
- そのAPIがどの
permissions
に該当するか探す - 見つけた
permissions
をワークフローファイルに書く
をやれば適切な権限が見つけられそうです。
(めんどくさい...)
まとめ
リポジトリへのpushへは↓のように設定すればOK
jobs:
test:
permissions:
contents: write
理解も深まりました...が適切な権限を探すのが難しいですね。
クローズ
以下参考にさせていただきました。