Dashboard › publish › Distillation
d3cdb0ab-55ac-4e6b-9a0c-183c9afa969b["lore_tm_v1_mtS2OmBYxobaH3lJszx3iLrvs7uov9zKpsLmDwKDsR8","lore_tm_v1_rYETrsiUqKeMT7WTAcmGDoj9zmVgjZ6pNAgv9sT9QKo","lore_tm_v1_p0qrZVEipZwcjOdW5NuveoJ0j0utAl-EHHo5DXF9VDA","lore_tm_v1_DWcxiFd3OEpd_69AtprBmoUbemtcslWp8Orh06-fAjA","lore_tm_v1_c1FDQlSE-8SH6KuGn4d4Ux1BskcVWtwByEdEIQHNTp8","lore_tm_v1_gtiawqHFg-g2OKoWn5wmzASfH1zd1ta2JuJYdvdJY7g","lore_tm_v1_cE8JH4qqWpjspmIR5QFZtIkMkqDbns3hPg7b3rJ3sk8","lore_tm_v1_GNBG2pN_Ds3qygwpC9LAjeCm3vH26g5LfAryKEuFtPc","lore_tm_v1_h52o9PIEKiDggKgLqMYNuo1BTRqW-U_mlKQjf2GdW_E","lore_tm_v1_pRCer4QOeicS4Elvp5bl7HEmPbEMK4HufZAN65lPYXY","lore_tm_v1_A3Az0me5CRO6RRijz6xmSAt3jSD3orur-ToX4moJKIA","lore_tm_v1_4DkR5p4JvudtZfTK3OGWiux2cCU81CCAQ_em-xmwl_g","lore_tm_v1_oJttWsfnzaJQC_Q_qRQwei6CP1WKw_tZz3Lh54RK4e4","lore_tm_v1_VIdsiKMY1mSSXR2mu2UWkNFrAbnOYIl6465Nsb7F8eE","lore_tm_v1_dtJMj4f3RFaygLQ7zHByrVXTlyYiaqH3GRBOdnFherc","lore_tm_v1_KYQnPvhNNeFd1rCG6Li-mehJu-h5aIPAyXpJWgfCUV0"]
Date: Aug 27, 2026
/home/byk/Code/getsentry/publish contains .eslintrc.js, .git/, .github/, .gitignore, AGENTS.md, auto-approve-repos.txt, docs/, LICENSE, node_modules/, package.json, README.md, src/, vitest.config.js, and yarn.lock.security-as-code to gate approver validity”; URL https://github.com/getsentry/publish/issues/9355; created Aug 27, 2026 at 11:30:52Z; updated at 11:54:23Z; authored and assigned to BYK (Burak Yigit Kaya, GitHub databaseId 126780), member association, no labels.getsentry/publish repository can currently approve releases. This causes friction for contractors who have write access to selected SDK repositories but cannot approve or retract release issues for their own repositories.getsentry/security-as-code repository to gate approver validity.getsentry/security-as-code is private while getsentry/publish is public; any implementation using it must ensure its contents remain private.security-as-code may instead need to be authoritative to prevent permissions granted outside that system from bypassing policy. GitHub may not reveal all individuals’ access rights on all repositories.BYK at 11:54:23Z: “cc @aldy505 @timfish @stephanie-anderson”; the comment had 1 thumbs-up reaction.src/publish/update-issue.js, src/publish/inputs.js, src/publish/post-workflow-details.js, src/libs/github.js, src/publish/post-result.js, src/libs/__tests__/github.js, src/modules/update-issue.js, src/modules/process-end-state.js, src/modules/post-workflow-details.js, src/modules/details-from-context.js, src/modules/__tests__/details-from-context.js, src/modules/__tests__/post-workflow-details.js, src/modules/__tests__/process-end-state.js, and src/modules/__tests__/update-issue.js.package.json: package name publish, version 0.0.1, private, description “Approval-based publishing system for Sentry,” repository git@github.com:getsentry/publish.git, Apache-2.0 license. Volta pins Node 24.0.0 and Yarn 1.22.22; resolution undici: "^6.23.0".package.json scripts: test: vitest run; test:watch: vitest; lint: eslint src .github --ignore-pattern '!.github'; prettier: prettier --write src. Dev dependencies: eslint ^8.9.0, eslint-config-prettier ^8.3.0, eslint-plugin-yml ^0.13.0, prettier ^2.2.1, vitest ^4.1.0. Runtime dependencies: @actions/core ^2.0.0, @actions/github ^7.0.0, @sentry/node ^10.0.0.src/publish/update-issue.js imports updateIssue from ../modules/update-issue.js, getGitHubToken from ../libs/github, and @actions/github; it initializes context = github.context, octokit = github.getOctokit(getGitHubToken()), parses inputs from process.env.PUBLISH_ARGS, then invokes updateIssue({ context, octokit, inputs }).src/modules/update-issue.js: updateTargets({octokit, version, publishRepo, issue_number}) reads ${process.env.GITHUB_WORKSPACE}/__repo__/.craft-publish-${version}.json if it exists; concurrently fetches the publish issue with octokit.rest.issues.get and parses the craft state JSON; calls transformIssueBody(craftState, issue.body); then updates the issue body through octokit.rest.issues.update.transformIssueBody(craftState, issueBody) uses TARGETS_SECTION_PARSER_REGEX and TARGETS_PARSER_REGEX; it marks existing target checklist entries checked when craftState.published[targetId] is truthy, preserves target IDs, appends any unlisted Object.keys(craftState.published) targets, and adds trailing newlines.updateIssue({ context, octokit, inputs }) derives version from inputs, publishRepo from context.repo, and issue_number from context.payload.issue.number; it concurrently calls updateTargets(...) and octokit.rest.issues.removeLabel(...) to remove the accepted label.src/modules/details-from-context.js defines TARGETS_SECTION_PARSER_REGEX as /^(?!### Targets$\s)(?: *- \[[ xX]\] \S+\s*$(?:\r?\n)?)+/m, TARGETS_PARSER_REGEX as /^\s*- \[[ x]\] (\S+)/gim, and CHECKED_TARGETS_PARSER_REGEX as /^\s*- \[x\] (\S+)/gim.detailsFromContext({ context }) throws Error("Issue context is not defined") when context, context.payload, or context.payload.issue is absent. It parses publish issue titles using /^publish: (?:getsentry\/)?(?<repo>[^/@]+)(?<path>\/[\w./-]+)?@(?<version>[\w.+-]+)$/, sets dry_run to "1" only when an issue label is named dry-run, sets path to "." + (titleMatch.path || ""), parses an optional body line Merge target: <merge_target> using /^Merge target: (?<merge_target>[\w.\-/]+)$/m, and returns checked target IDs from the matched targets section.src/modules/process-end-state.js: processEndState({ context, octokit, inputs, status }) reads repo and version from inputs; publishRepo and run_id from context; and issue_number from the issue payload. It fetches workflow run data through octokit.rest.actions.getWorkflowRun, posts a result comment, closes the issue only when status === "success", then reports a Sentry session.githubIssueComment status outputs in src/modules/process-end-state.js: failure returns “Failed to publish” plus run logs at ${workflowInfo.html_url}?check_suite_focus=true#step:8 and a branch-deletion link for https://github.com/getsentry/${repo}/branches/all?query=${encodeURIComponent(version)}; cancelled returns equivalent “Publish workflow cancelled” text and links; success returns Published successfully: [run#${run_id}](${workflowInfo.html_url}); unknown status throws Error("Unknown status: '<status>'").src/modules/process-end-state.js: release is ${details.repo}@${details.version}; Sentry.init uses process.env.SENTRY_DSN; scope tag repository is set to details.repo; scope context release includes issue_number and inputs; it captures a message, starts a session with derived status, ends it, then awaits Sentry.close(). Status mappings: failure → message Release failed: ${repo}, severity error, session status crashed; cancelled → Release cancelled: ${repo}, severity warn, session status crashed; success → Release succeeded: ${repo}, severity info, session status ok.src/publish/inputs.js calls detailsFromContext({ context: github.context }) and writes the result as GitHub Actions output result via core.setOutput('result', result).src/libs/github.js defines getGitHubToken(): it requires process.env.GITHUB_TOKEN, throwing Error('No "GITHUB_TOKEN" environment variable found. Please ensure the workflow is configured correctly') if absent, otherwise returns the token..github/ contains CODEOWNERS and workflows/; workflow definitions have not yet been enumerated or inspected.