Franklin.jlでドキュメント生成でプレビューを有効化する
https://github.com/JuliaPackageComparisons/JuliaPackageComparisons.github.io/issues/56 に対処したい。やりたいこと:
- PRが作成されると自動的にドキュメント生成してpushする
- push先は同リポジトリ(JuliaPackageComparisons/JuliaPackageComparisons.github.io)ではなく、別のリポジトリ(JuliaPackageComparisons/preview など)とする
- forkからでも正常に動いて欲しい
- Previewがdeployされればpreview用のURLを自動的に投稿して欲しい
試したこと
Forkしたhyrodium/JuliaPackageComparisons.github.ioでの作業
- hyrodium/JuliaPackageComparisons.github.ioからhyrodium/JuliaPackageComparisonsPreviewにpreview作成
- https://github.com/hyrodium/JuliaPackageComparisons.github.io/pull/5
- previewのpushはできた
- previewのURLをコメント投稿するのには失敗している(謎)
新しくOrganization作成して作業
- forkしたhyrodium/JuliaPackageComparisons.github.ioでは環境が揃わないので埒が明かないのでHyrodiumOrgを作成
-
HyrodiumOrg.github.ioも作成
-
PREVIEW
としてRepository scecretsを設定
-
-
HyrodiumOrg/previewも作成
- Deploy keyを設定
- forkなしでPR作成
- https://github.com/HyrodiumOrg/HyrodiumOrg.github.io/pull/3
- previewドキュメントの生成&deploy成功 :tada:
- コメント投稿失敗
- forkありでPR作成
- https://github.com/HyrodiumOrg/HyrodiumOrg.github.io/pull/4
- previewドキュメントのdeploy失敗
- コメント投稿のstepの前に終了しちゃったから…ネ…
forkありのPRでドキュメントdeploy失敗しているのはシークレットを参照できていないのが問題っぽい
- fork されたリポジトリからのプルリクで Actions のシークレットを参照できるようにしたいが参考になりそう
- pull_request_target トリガーを使って fork されたリポジトリからの pull request で発火した GitHub Actions で fork 元の secrets を参照するも参考になりそう
- Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requestsをちゃんと読むのが良さそう。まだまだ英語読むのに時間掛かっちゃうよね
pull_request
ではなくpull_request_target
で発火させるとscecretにアクセスできて良いが、実行するコードもfork元を参照してしまうので面倒っぽい…?
ChatGPTに聞いても、セキュリティ的な懸念を沢山並べるだけで実際のコードの提案が疎かになりがちだったりする。俺の聞き方が悪いのか…?自然言語に落として丁寧に質問するのも疲れてしまう感覚がある。
fork無しのPRでもコメント投稿に失敗しているのが謎。
https://github.com/HyrodiumOrg/HyrodiumOrg.github.io/pull/3 で色々試してみたが、どうも上手く行かない。公式ドキュメントに従って
- name: Create comment
uses: peter-evans/create-or-update-comment@v4
with:
issue-number: 1
body: |
This is a multi-line test comment
- With GitHub **Markdown** :sparkles:
- Created by [create-or-update-comment][1]
[1]: https://github.com/peter-evans/create-or-update-comment
reactions: '+1'
のように設定してみたが
Run peter-evans/create-or-update-comment@v4
with:
issue-number: 1
body: This is a multi-line test comment
- With GitHub **Markdown** :sparkles:
- Created by [create-or-update-comment][1]
[1]: https://github.com/peter-evans/create-or-update-comment
reactions: +1
token: ***
repository: HyrodiumOrg/HyrodiumOrg.github.io
edit-mode: append
append-separator: newline
reactions-edit-mode: append
env:
pythonLocation: /opt/hostedtoolcache/Python/3.8.18/x64
LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.8.18/x64/lib
SSH_AUTH_SOCK: /tmp/ssh-XXXXXXMw11bp/agent.2250
SSH_AGENT_PID: 2251
deployment_status: skipped
/home/runner/work/_actions/peter-evans/create-or-update-comment/v4/dist/index.js:4695
const error = new requestError.RequestError(toErrorMessage(data), status, {
^
RequestError [HttpError]: Resource not accessible by integration
at /home/runner/work/_actions/peter-evans/create-or-update-comment/v4/dist/index.js:4695:21
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
status: 403,
response: {
url: 'https://api.github.com/repos/HyrodiumOrg/HyrodiumOrg.github.io/issues/1/comments',
status: 403,
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset',
'content-encoding': 'gzip',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Sat, 27 Jan 2024 05:08:23 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'GitHub.com',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
'transfer-encoding': 'chunked',
vary: 'Accept-Encoding, Accept, X-Requested-With',
'x-accepted-github-permissions': 'issues=write; pull_requests=write',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-api-version-selected': '2022-11-28',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '5C40:961E:106A7CE:21A7887:65B48FC7',
'x-ratelimit-limit': '1000',
'x-ratelimit-remaining': '995',
'x-ratelimit-reset': '1706332859',
'x-ratelimit-resource': 'core',
'x-ratelimit-used': '5',
'x-xss-protection': '0'
},
data: {
message: 'Resource not accessible by integration',
documentation_url: 'https://docs.github.com/rest/issues/comments#create-an-issue-comment'
}
},
request: {
method: 'POST',
url: 'https://api.github.com/repos/HyrodiumOrg/HyrodiumOrg.github.io/issues/1/comments',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': 'octokit-core.js/3.6.0 Node.js/20.8.1 (linux; x64)',
authorization: 'token [REDACTED]',
'content-type': 'application/json; charset=utf-8'
},
body: '{"body":"This is a multi-line test comment\\n- With GitHub **Markdown** :sparkles:\\n- Created by [create-or-update-comment][1]\\n\\n[1]: https://github.com/peter-evans/create-or-update-comment"}',
request: {
agent: Agent {
_events: [Object: null prototype] {
free: [Function (anonymous)],
newListener: [Function: maybeEnableKeylog]
},
_eventsCount: 2,
_maxListeners: undefined,
defaultPort: 443,
protocol: 'https:',
options: [Object: null prototype] {
keepAlive: true,
scheduling: 'lifo',
timeout: 5000,
noDelay: true,
path: null
},
requests: [Object: null prototype] {},
sockets: [Object: null prototype] {},
freeSockets: [Object: null prototype] {
'api.github.com:443:::::::::::::::::::::': [ [TLSSocket] ]
},
keepAliveMsecs: 1000,
keepAlive: true,
maxSockets: Infinity,
maxFreeSockets: 256,
scheduling: 'lifo',
maxTotalSockets: Infinity,
totalSocketCount: 1,
maxCachedSessions: 100,
_sessionCache: {
map: {
'api.github.com:443:::::::::::::::::::::': [Buffer [Uint8Array]]
},
list: [ 'api.github.com:443:::::::::::::::::::::' ]
},
[Symbol(kCapture)]: false
},
hook: [Function: bound bound register]
}
}
}
Node.js v20.8.1
のエラーが発生。
類似のissueがいくつかあったが(#188, #212, #238)、あまり参考にならなかった。
つまり
- Forkから実行している訳ではないのでシークレットが使えない訳ではない
- リポジトリへのアクセス権限も問題無さそう
token
のデフォルトがGITHUB_TOKEN
になっているが
The example provided in docs not working as expected. I think this secrets.GITHUB_TOKEN doesn't has permission to add comment on the issue.
との意見もあるらしい。(マジ?)
自分でtokenとか作って渡すのが良いのか…?
https://qiita.com/osakiy/items/df80db383ce33b82c797 の記事を参考にやってみたが、こちらも同様のエラーだった。やはりデフォのscecrets.GITHUB_TOKEN
の権限不足かも
はい解決、pull-requests: write
の設定不足でした。
公式ドキュメントより:
You can use permissions to modify the default permissions granted to the GITHUB_TOKEN,
github actionsの「permissions」とはなにか?のメモが良かった。感謝。
GitHub ActionsでNGを検出した際にPRにコメントをする方法の記事などを読んで、permissions
の設定どうなってたっけ?と思って気づいた次第。ところでcreate-or-update-commentのREADMEにpermissionsについて記載が無くて不親切な気がした。
GITHUB_TOKEN
を雰囲気で使いすぎてただけだったな……。
次はforkからpreview生成ジョブが実行できるようにやっていき!
forkからのPRでpreview生成してdeployしてコメントできた!!
pull_request
からpull_request_target
に変えただけ。なのでPRでのドキュメント変更が取り込まれないな…
https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ ふたたび。
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.sha }}
のように明示的にcheckoutすると良いらしいが、ちょっと不安なので先にラベル付された場合にのみ発火する仕組みを構築したい
on:
pull_request_target:
types: [labeled]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'ok to preview')
のように設定してlabelでtriggerできるようになった。
成功🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
コメント投稿!おわり!