Dashboard › craft › Distillation
a23d1fd4-8486-42dc-89f5-5357e6ebc9db["lore_tm_v1_srE46ha3PjIc6GEbs3xB469he2wciwjg6srYSn9ZONw","lore_tm_v1_s1KF9v-KZB0Bq3iVtxKIBpA44dJi6R9ZhNqECquVhWA","lore_tm_v1_efuAadrUAlXrk9g_CApbjETbOBTLuGTOnf16EzAp_PQ","lore_tm_v1_L-TjpaLqJlzFOnJwmJJiVSYZHmdfXHnzmVtU6Adhri0","lore_tm_v1_lX9CxUuIayGLJ7YY3KvsuXsgudc0jo8XwY84f9Olk0M","lore_tm_v1_Wrhc0hvLGBgACtQfRN38BZDIRozh4Tli_OG_lBZSSOE","lore_tm_v1_uCcJ_CfLLmilDhep-r0EzChr6EF1DNNpblXLumeTyjM"]
Date: Sep 8, 2026
ci-ready label after checking CI; if ci-ready was already present, waiting-for-ci removes it first so a fresh labeled event fires./home/byk/Code/getsentry/publish-root-location-bootstrap/.github/workflows/publish.yml, lines 95-239. The publish job runs on ubuntu-latest, uses environment: production, is named Publish a new version, and has timeout-minutes: 90..github/workflows/publish.yml:102-114 gates publishing exclusively on a ci-ready label event: issue state is open; github.event.label.name == 'ci-ready'; issue labels contain both accepted and ci-ready; and labels do not contain ci-pending or ci-failed. The workflow comments state this avoids racing with waiting-for-ci on the same event..__publish__ using actions/checkout@v7, configures Node 24 through actions/setup-node@v6 with Yarn cache and cache-dependency-path: .__publish__/yarn.lock, installs dependencies via yarn install --cwd ".__publish__", and parses inputs with node .__publish__/src/publish/inputs.js..github/workflows/publish.yml:138-174 resolves the CI-approved release revision using src/publish/resolve-release-revision.js, checks out the target repository into __repo__ at ${{ steps.release-revision.outputs.revision }} with fetch-depth: 0, then resolves publish location through node .__publish__/src/publish/discover-location.js with PUBLISH_REPOSITORY_DIRECTORY: __repo__.actions/create-github-app-token@v3, with vars.SENTRY_RELEASE_BOT_CLIENT_ID, secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY, and owner getsentry, then uses that token for target-repository checkout..github/workflows/publish.yml:176-229 conditionally writes Craft publish state when input targets exist. It builds {"published": {...}} JSON from CRAFT_PUBLISH_TARGETS_JSON; validates container_cwd stays at /github/workspace/__repo__ or below it; hashes that container path with SHA-1 truncated to 12 characters; stores state under $GITHUB_WORKSPACE/.craft-state/craft; and emits state_file through $GITHUB_OUTPUT.[a-z0-9._-]; uses URL-safe unpadded Base64 as version-<encoded> when the sanitized version differs from CRAFT_PUBLISH_VERSION; and prepends workspace-<encoded>- when CRAFT_PUBLISH_WORKSPACE is nonempty.docker://getsentry/craft:latest under the step name Publish using Craft, with /bin/bash as entrypoint, and changes directory to __repo__/${{ fromJSON(steps.location.outputs.result).path }} before publishing./home/byk/Code/getsentry/publish-root-location-bootstrap/src/publish/inputs.js.src/publish/inputs.js imports @actions/github, @actions/core, and detailsFromContext from ../modules/details-from-context; inputs() calls detailsFromContext({ context: github.context }) and writes JSON.stringify(result) to GitHub Actions output key result, then invokes inputs().package.json from /home/byk/Code/getsentry/publish-root-location-bootstrap/package.json.publish is private at version 0.0.1, describes itself as an approval-based publishing system for Sentry, uses Volta Node 24.0.0 and Yarn 1.22.22, and pins undici resolution to ^6.23.0.generate: node scripts/generate-publish-issue-title-parser.js; check:generated: same command with --check; test: yarn check:generated && vitest run; test:watch: vitest; lint: eslint src .github --ignore-pattern '!.github'; prettier: prettier --write src.vitest run src/publish/__tests__/discover-location.js src/modules/__tests__/publish-location.js src/modules/__tests__/details-from-context.js src/modules/__tests__/ci-poller-input.js --printConsoleTrace passed: 4 test files and 53 tests passed, duration 643ms. ESLint command eslint src .github --ignore-pattern '!.github' also passed./home/byk/Code/getsentry/publish-root-location-bootstrap/src/modules/details-from-context.js.detailsFromContext({ context }) throws "Issue context is not defined" without context.payload.issue; parses the issue title using parsePublishIssueTitle; converts title parse failures to "Invalid publish issue title: '<title>'"; validates repository with isPublishRepository() and version with isReleaseVersion(); constructs path as "." + titleDetails.path; and rejects invalid paths with "Invalid publish issue path: '<path>'".detailsFromContext() sets dry_run to "1" only when issue labels contain dry-run, otherwise ""; derives merge_target from getReleaseRevisionDetails() and converts "(default)" to ""; extracts checked target IDs using TARGETS_SECTION_PARSER_REGEX and CHECKED_TARGETS_PARSER_REGEX; and returns title details plus dry_run, merge_target, path, and optional targets.src/publish/discover-location.js (+4 lines) and src/publish/__tests__/discover-location.js (+16 lines). The implementation returns { path: "." } immediately for input.path === "."; the added test confirms no workspace-discovery execFile call occurs for root publishing.src/publish/__tests__/discover-location.js:19 tests root releases skipping workspace discovery but does not test that a non-root path propagates a Docker/workspace-discovery failure. Recommended adding a test with path: './packages/cli', root configuration present, and a throwing execFile, asserting it throws instead of falling back to the checkout path."." bypasses discovery at src/publish/discover-location.js:51, while non-root paths call getWorkspaceNames() at line 55; non-root discovery failures propagate and fail closed; and path validation runs first at src/modules/details-from-context.js:49-52, via src/publish/inputs.js:6-9, before the workflowβs location-resolution step at .github/workflows/publish.yml:134-174.DO-NOT-MERGE pending the recommended non-root discovery-failure regression test.