コンテキスト
- GitHub App の installation token を利用して org 配下のリポジトリを操作している
- 適切な権限を付与している(つもり)にもかかわらずうまくいかない:
- public repo は操作できる
- private repo は操作できない
結論から言うと
「public repo は操作できるが private repo は操作できない」ように見えるときには、おそらく下記のいずれかに該当しているので一つずつ見直すとよい。
- a. 適切なトークンを生成できていない
- b. 権限を付与できていない
- c. トークンを利用できていない
いずれも基本的な事項なので大丈夫と思いがちだが、取り組んでいるタスクが、public repo に対しては特別な権限が不要なタスク(例:「issue 作成」)であった場合、原因特定が遅れてしまうことがある。
というのも、上記 a
~c
のいずれかに失敗していた場合、権限獲得はまったくできていないにもかかわらず、public repo に対してだけは操作が可能であるため、「この操作は public repo に対しては可能だが private repo では可能なのかもしれない」と勘違いしてしまうからだ。要注意。
状況例
- やりたいこと: あるリポジトリの GitHub Actions から、organization 配下の別リポジトリに issue を作る
organization
├── issue-creator-repo
├── target-public-repo
└── target-private-repo
issue-create-repo
から、target-public-repo
および target-private-repo
に issue を作りたい
- 確認済みの事項:
- organization の GitHub App に付与している権限:
repo:issue
の 'write' 権限 - インストール先:
all repositories
- organization の GitHub App に付与している権限:
見落としパターン 1: 生成しているトークンが全リポジトリ操作用になっていない
actions/create-github-app-token
を利用している場合には "Create a token for multiple repositories in the current owner's installation" に該当
on: [issues]
jobs:
hello-world:
runs-on: ubuntu-latest
steps:
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
owner: ${{ github.repository_owner }} # この行を忘れていると、生成されるトークンは全く役に立たない
- uses: peter-evans/create-or-update-comment@v3
with:
token: ${{ steps.app-token.outputs.token }}
issue-number: ${{ github.event.issue.number }}
body: "Hello, World!"
全く役に立たないトークンを使った場合にも public repo だけは操作できているように見えるので気づくのが遅れることがある。
見落としパターン 2: 実際に必要な権限を把握できていない
GitHub CLI を使っていると起こりがち
- uses: actions/create-github-app-token@v1
id: generate_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
- run: |
# 実は背後で repository.defaultBranchRef の GraphQL クエリが実行されるため `repo:contents` の read 権限が必要
gh issue create \
--repo rindrics-sandbox-org/private-repo \
--title foo \
--body bar
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
実際にはトークンの権限が足りていないのだが public repo だけは操作できているように見えるので気づくのが遅れることがある。
見落としパターン 3: 権限を付与したつもりになっている
GitHub App の権限不足に気づき、画面から権限を追加した場合、権限の更新を「承認」する必要がある
実際にはトークンの権限が足りていないのだが public repo だけは操作できているように見えるので気づくのが遅れることがある。
気をつけましょう