はじめに
PyCon mini 東海 2024、1日ありがとうございました! nikkieです。
カンファレンスのまとめは別にして、発表準備の中で理解が深まったGitHub Actionsについてです。
GITHUB_TOKENのpermissionsを設定できることをようやく認識しました。
目次
- はじめに
- 目次
- GitHub Actionsでリポジトリにコミットを作ろうとするとエラー
- これまでの解決法:GITHUB_TOKENのデフォルトの権限をread/writeにする
- 今回知った方法:GitHub Actionsの定義のYAMLファイルでpermissionsを指定する
- 終わりに
GitHub Actionsでリポジトリにコミットを作ろうとするとエラー
静的ファイルをGitHub Pagesとして公開するためのGitHub Action、ftnext/action-push-ghpagesを公開しています1。
これを使っている中で、自分自身の伸びしろを認識していました。
sphinx-revealjs製のスライドをGitHub Pagesで公開するためのリポジトリの初期設定 - nikkie-ftnextの日記
現在はこの記事の方法ではpermissionまわりでpushできないエラーが出るので、設定から権限を与えています。
伸びしろはGitHub Actionsの定義ファイルで解決することです。
remote: Permission to ftnext/first-python-test-2024.git denied to github-actions[bot]. fatal: unable to access 'https://github.com/ftnext/first-python-test-2024/': The requested URL returned error: 403
この伸びしろにこのたび取り組みました。
これまでの解決法:GITHUB_TOKENのデフォルトの権限をread/writeにする
github.comでリポジトリの設定から権限を与えています。
リポジトリの Settings から Actions の General(左側のメニューを操作)

「Workflow permissions」で「Read and write permissions」を選びます

Choose the default permissions granted to the GITHUB_TOKEN when running workflows in this repository.
こちらがソースです。
GitHub Actionsで自分のリポジトリ操作時に権限不足に起因するエラーが発生する
なお「Workflow permissions」にも「YAMLを使ってワークフローのよりきめ細かい権限を指定できる (You can specify more granular permissions in the workflow using YAML.)」と記載があります。
これが次の方法です。
今回知った方法:GitHub Actionsの定義のYAMLファイルでpermissionsを指定する
こちらのほうがよりセキュアと認識しています。
これまでの解決法はそのリポジトリすべてのActionのデフォルトの権限をread/writeに変更するものですが、こちらの方法では該当のActionだけにread/write権限を付与できるからです。
# 完全版は https://github.com/ftnext/first-python-test-2024/blob/34b635c2d805fce67d1059459e9c430db231f57c/.github/workflows/publish-pages.yaml jobs: publish: permissions: contents: write steps: # 省略 - name: Publish on GitHub Pages uses: ftnext/action-push-ghpages@v1.0.0 with: build_dir: docs/build/html github_token: ${{ secrets.GITHUB_TOKEN }}
ワークフロー ファイル内の
permissionsキーを使用して、ワークフロー全体または個々のジョブのGITHUB_TOKENのアクセス許可を変更することができます。
https://docs.github.com/ja/actions/writing-workflows/workflow-syntax-for-github-actions#permissions
permissionsを使用してGITHUB_TOKENに付与された既定のアクセス許可を変更し、必要に応じてアクセスを追加または削除することで、必要最小限のアクセスのみを許可することができます。
後者のドキュメントには「使用可能なアクセス許可と、それぞれがアクションに実行を許可する内容の詳細」という表があります
contentsとは
リポジトリの内容を操作します。
contents: writeはアクションによるリリースの作成を許可します。
リポジトリに対してコミットをpushするのもcontents: writeでした。
GitHub ActionsのYAMLで設定したので、リポジトリのSettingsの「Workflow permissions」はreadのみです(「Read repository contents and packages permissions」。こちらがデフォルト値です)
終わりに
GitHub ActionsのYAMLファイルに書けるpermissionsを知りました。
Action単位でGITHUB_TOKENに必要な権限を追加できるわけですね。
これまではなかなか掘り下げる余裕がなかったのですが、今回理解できたのはとてもよかったです。
例を言う おれはまだまだ強くなれる