Dashboard › publish › Distillation
374edc86-7563-4065-a8d1-a867140dff27["lore_tm_v1_YztylAUv5alObbL83ePUiQt7dKgB-xwdtRuKxWmVcRA","lore_tm_v1_6v2UuMR2zAtlpG9p4CSsOCJyvgV1I-zgpWStkNJs2xI","lore_tm_v1_diKeiLSfSIYMtsntJ3OUaxieUSV6UYXQ6dAiu0tYHB0","lore_tm_v1_GRP_bHLQGMSTgl5kVtvA78hY6NUnoUBo5wzcBrN0XeE","lore_tm_v1_sQ7qZSOouTLBHt3AUBm1eEZevg08E828au2ptmO4tWk","lore_tm_v1_fhdStsDpt1BuV38p988K7w3PwUHgiHbJlWP_t5OyOko","lore_tm_v1_4Y1hEdoQhgj1VH9cDkrjDUJlF1jL8H1B9M6tsWWZR3U","lore_tm_v1_joIj5cexRFiK7x5FHkChIsDPaVynA4WwWp1wBXC6Hcg","lore_tm_v1_iypKgzEQdh_7akzio3ZiwPhp1-4ug9O52zOYfmhddaQ","lore_tm_v1_u_w5Q-SgKiYT8kkQv9DiGu9n2hXNpbZ7O5DjiXaXR90","lore_tm_v1_nSFEXZHhIpqkYg4xF1j9A-qVrwI0NlT4bY44iXsZuMg","lore_tm_v1_FazZ58Srez2-ae4CAkTkVZjzGQdeNKxAky2Ag8tUCAo","lore_tm_v1_5zXP5ubDfCwC-bMYTFcL45qSWEvY2be6fTd2ubbF2_4","lore_tm_v1_fyl4-2Jz9dga9W0UsotL_8ahaMHgD5N7eiVBQw4Hkh4","lore_tm_v1_m6TxocqGMl_RTX-YhcZftsTSSJKOefLvDHEL8hM2QY8","lore_tm_v1_mZGIbwkBDF-s8liFBUg67Cij2x-ybxCYqBC9OsVJGCQ","lore_tm_v1_AedGfDToDK_KSYCa8oMwIjBgw6WzSsvb8-qyOjZZ15A","lore_tm_v1_K7wybLZfYzT6_krEDm4WtpfLys1T9YLlHvoOToz2aAI","lore_tm_v1_l0y2PyD8KNQFrSjlOApi5VhCHbctK40smAPYHO9HedM","lore_tm_v1_jfpaRHR8uHBndYtvCkPbM5tIUot5q5iyzYXL996ODm8","lore_tm_v1_JnM3mQWNYXQrOIsQdwE2lLgJxe66fFdTG9T4OzmSmVA","lore_tm_v1_fK1JF0eXy5lb6HDcXW5CQEcd4SSR7nR6BiBrjC92tT8","lore_tm_v1_7XbDJdJBnr2GAtf7M_loAYvqSFIt0N72pknQRg9Xc0c","lore_tm_v1_uu5k0vD1NYQW6YYdLxHlYB7z8Ka2-4jO2f-q6DvnkQ4","lore_tm_v1_vCCNg39Ux4u6MsLNLvRSnHn5tGNNF5Ty230z4jRIeRM","lore_tm_v1_r4yuCLFD_nO0w5sbYQaIn9BSjjUFrUBnW5t5bvYmOI0","lore_tm_v1_gy9m0ZQOFLrdX0-EvJ52aLv3hLgsZtAU0PXAmYW4SvI","lore_tm_v1_S-Q2AgAZiLbOcEoWYHmqVAb5-iHV2oXH3HULu9tL3ow","lore_tm_v1_vg_jKHQDtCkhE-AWc_8yKTbii1Wht2z1Mv_idRqb5iA","lore_tm_v1_sjid9QKl7j7ICU8uWLkN9WJpRZBwpph3CEc5L5oDGQE","lore_tm_v1_mke1Kqj3Zzled6i62IuYDZvL2T9D-WXMQGvgh4tMDk0","lore_tm_v1_TD3swXOABEEIHD3F5rxcdvwLK2setW3IL36oBQSgumU","lore_tm_v1_EHbovGb0lV1YhA4rO_qu9cO3kZEHuDxexuup4C9yUYE"]
Date: Aug 27, 2026
src/publish/authorize-approval.js, modified .github/workflows/publish.yml, and added/modified authorization tests in src/modules/__tests__/approval-authorizer.js and src/publish/__tests__/authorize-approval.js. The workflow now calls the shared approval-authorizer so authorization behavior is testable outside GitHub Actions.getsantry[bot]; all other approval actors are checked through target-repository permissions. GitHub API failures are intended to fail closed.vitest run src/modules/__tests__/approval-authorizer.js src/publish/__tests__/authorize-approval.js passed: 2 test files and 14 tests passed. src/modules/__tests__/approval-authorizer.js had 12 passing tests; src/publish/__tests__/authorize-approval.js had 2.prettier --write src --check .github/workflows/publish.yml src/modules/approval-authorizer.js src/modules/__tests__/approval-authorizer.js src/publish/authorize-approval.js src/publish/__tests__/authorize-approval.js reported code-style issues in 13 files: src/libs/__tests__/github.js, src/libs/github.js, src/modules/__tests__/approval-authorizer.js, src/modules/approval-authorizer.js, src/modules/post-workflow-details.js, src/modules/process-end-state.js, src/modules/update-issue.js, src/publish/__tests__/authorize-approval.js, src/publish/authorize-approval.js, src/publish/inputs.js, src/publish/post-result.js, src/publish/post-workflow-details.js, and src/publish/update-issue.js.accepted label attached if the release-bot permission API request failed. Root cause: API failure stopped the job before cleanup. Fix: move use of the internal token ahead of authorization and run cleanup after both authorization denials and permission-lookup failures..github/workflows/publish.yml, src/publish/authorize-approval.js, and src/publish/__tests__/authorize-approval.js were updated so authorization failures—including GitHub API errors—remove accepted before the job exits unsuccessfully.actions/create-github-app-token@v3 could not create the release-bot token, the authorizer was skipped and could not remove accepted. Fix decision: make the release-bot-token step fail softly (continue-on-error: true) so the existing internal token can remove accepted safely..github/workflows/publish.yml was updated for the release-bot-token creation failure path; authorization is designed to fail safely and the internal app removes accepted.vitest run passed: 7 test files and 30 tests—src/modules/__tests__/post-workflow-details.js (1), approval-authorizer.js (12), src/publish/__tests__/authorize-approval.js (2), update-issue.js (5), process-end-state.js (4), details-from-context.js (4), and src/libs/__tests__/github.js (2). Targeted lint/format checks passed according to the assistant.publish: sentry@…; authorization initially needed to resolve these to getsentry/sentry rather than reject them.src/modules/approval-authorizer.js initially defined ALLOWED_ROLE_NAMES = new Set(["write", "maintain", "admin"]), AUTO_APPROVER = "getsantry[bot]", and PUBLISH_TITLE_REGEX = /^publish: (?<owner>[^/]+)\/(?<repository>[^/@]+)(?:\/[^@]+)?@[^@]+$/. authorizeApproval({ actor, issueTitle, getPermission }) rejected malformed/non-getsentry titles without lookup, bypassed lookup for getsantry[bot], otherwise called getPermission({ owner, repository, username: actor }), and authorized only allowed role_name values.getsentry organization while preserving release path handling; add regression coverage for both forms.approval-authorizer tests ran with 1 failure, while 2 entry-point tests passed (14 total passed, 1 failed). Failed test: “authorizes an unqualified title against the getsentry repository”; expected { authorized: true, repository: "getsentry/sentry-javascript" }, received { authorized: false, repository: null }.approval-authorizer parsing with Publish’s existing title grammar, treating both qualified and unqualified titles as getsentry releases.vitest run src/modules/__tests__/approval-authorizer.js src/publish/__tests__/authorize-approval.js passed: 2 test files and 15 tests, with 13 in approval-authorizer.js and 2 in authorize-approval.js. Targeted formatting also passed.vitest run passed: 7 test files and 31 tests—post-workflow-details.js (1), approval-authorizer.js (13), authorize-approval.js (2), update-issue.js (5), details-from-context.js (4), github.js (2), and process-end-state.js (4).eslint src .github --ignore-pattern '!.github' failed with exactly 1 error and 0 warnings in unrelated existing file .github/workflows/cocoapods-keepalive.yml: line 1, column 7, yml/plain-scalar (“Must use plain style scalar”); ESLint reported it potentially fixable with --fix..github/workflows/publish.yml, src/libs/__tests__/github.js, src/libs/github.js, src/modules/post-workflow-details.js, src/modules/process-end-state.js, src/modules/update-issue.js, src/publish/inputs.js, src/publish/post-result.js, src/publish/post-workflow-details.js, and src/publish/update-issue.js; untracked additions were src/modules/__tests__/approval-authorizer.js, src/modules/approval-authorizer.js, src/publish/__tests__/, and src/publish/authorize-approval.js.ci-ready label..github/workflows/publish.yml: checkout via actions/checkout@v6 with persist-credentials: false; internal GitHub App token via actions/create-github-app-token@v3 using vars.SENTRY_INTERNAL_APP_ID and secrets.SENTRY_INTERNAL_APP_PRIVATE_KEY; release-bot token via actions/create-github-app-token@v3 with continue-on-error: true, vars.SENTRY_RELEASE_BOT_CLIENT_ID, secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY, and owner: getsentry; then node src/publish/authorize-approval.js with continue-on-error: true and APPROVAL_TOKEN, APPROVAL_ACTOR, and APPROVAL_ISSUE_TITLE.steps.authorization.outcome != 'success' || steps.authorization.outputs.authorized != 'true'. On rejection, it uses internal GH_TOKEN to run gh issue edit "${{ github.event.issue.number }}" -R "$GITHUB_REPOSITORY" --remove-label "accepted", comments that the actor cannot approve because approvers need write/maintain/admin access to the target repository, then exit 1.ci-ready label events, not accepted, to avoid racing waiting-for-ci; the CI poller adds ci-ready.src/publish/authorize-approval.js implementation: imports fs and authorizeApproval from ../modules/approval-authorizer.js; getPermission calls https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repository)}/collaborators/${encodeURIComponent(username)}/permission with headers Accept: application/vnd.github+json, Authorization: Bearer ${process.env.APPROVAL_TOKEN}, and X-GitHub-Api-Version: 2026-03-10; non-OK responses throw Could not retrieve ${username}'s permission for ${owner}/${repository}: GitHub returned ${response.status}.main() in src/publish/authorize-approval.js requires GITHUB_OUTPUT and APPROVAL_TOKEN, calls authorizeApproval using APPROVAL_ACTOR, APPROVAL_ISSUE_TITLE, and getPermission, then appends authorized=${authorized}\n to GITHUB_OUTPUT. When run directly, errors are logged and set process.exitCode = 1; exports are { getPermission, main }..github/workflows/cocoapods-keepalive.yml scalar error.