Dashboard › craft › Distillation
ae9e9238-1ec9-4c53-8ae0-b9eb410172be["lore_tm_v1_2CnDrhY-A76TqvJrVcdr_OeMZ9WASdFKIq3tXWde1Zg"]
Date: Aug 29, 2026
action.yml defines composite GitHub Action Craft Prepare Release with inputs version, merge_target, force (default 'false'), blocker_label (default 'release-blocker'), publish_repo, git_user_name, git_user_email, path (default '.'), workspace, craft_config_from_merge_target (default 'false'), and craft_version (default ''); outputs are version, branch, sha, previous_tag, changelog, changelog_file, and issue_url.action.yml release-blocker step cancels the current GitHub Actions run via gh api -X POST repos/:owner/:repo/actions/runs/$GITHUB_RUN_ID/cancel when FORCE_INPUT != 'true' and gh issue list -l "$BLOCKER_LABEL_INPUT" -s open detects an open numbered issue.action.yml sets GIT_COMMITTER_NAME and GIT_AUTHOR_NAME from inputs.git_user_name || github.actor, and EMAIL from inputs.git_user_email || format('{0}+{1}@users.noreply.github.com', github.actor_id, github.actor).actions/download-artifact@v8 to download craft-binary to /tmp/craft-artifact when github.repository == 'getsentry/craft'; it installs /tmp/craft-artifact/dist/craft if available, otherwise downloads a release binary.CRAFT_VERSION from inputs.craft_version, falling back to github.action_ref; latest or empty versions query https://api.github.com/repos/getsentry/craft/releases/latest, while explicit versions download https://github.com/getsentry/craft/releases/download/${CRAFT_VERSION}/craft and fall back to latest if curl -sfI fails. It errors if CRAFT_URL is empty or /usr/local/bin/craft is empty/missing after download.CRAFT_LOG_LEVEL=Debug, calls git remote set-head origin --auto, conditionally passes --config-from "$MERGE_TARGET" only when craft_config_from_merge_target == 'true' and MERGE_TARGET is nonempty, conditionally passes --workspace=$WORKSPACE, and invokes craft prepare "${VERSION_ARG[@]}" "${CRAFT_ARGS[@]}".craft targets "${CRAFT_ARGS[@]}" | jq -r '.[]|" - [ ] \(.)"', optionally with --workspace=$WORKSPACE, and writes the resulting multiline checklist to the targets GitHub output using an EOF delimiter.steps.craft.outputs.changelog_file rather than an environment-variable changelog to avoid Linux ARG_MAX/E2BIG; changelog files are produced by Craft >= 2.22.0, and missing files result in no changelog section.MAX_CHANGELOG_CHARS=60000; excess text is truncated and suffixed with \n\n---\n*Changelog truncated for issue body.* to remain below GitHubβs approximately 65,536-character issue-body limit.publish: ${GITHUB_REPOSITORY}${SUBDIRECTORY}${WORKSPACE:+/$WORKSPACE}@${RESOLVED_VERSION}, where SUBDIRECTORY is /${inputs.path} only when the path is not '.'; publish_repo: self resolves to $GITHUB_REPOSITORY.Craft did not output a version. This is unexpected. when RESOLVED_VERSION is empty; its issue body includes requester, merge target, compare/check-run links, accepted-label approval instruction, target checklist, and optional open <details> changelog section.gh -R "$PUBLISH_REPO" issue list --json title,url,number,body and jq ([.[] | select(.title == $t)] | first // empty), deliberately avoiding GitHub Search API indexing delays and query-syntax edge cases; because issue-list results are newest first, it uses the first match if duplicate titles theoretically exist.### Targets and Checked targets will be skipped, recognizes [x] and [X], stores names in associative array checked_targets, and reapplies checks to matching targets in the refreshed checklist.gh issue edit "$existing_issue_number" -R "$PUBLISH_REPO" --body "$body"; on permission failure it emits ::warning::Could not update existing issue (permission denied). Using existing issue as-is. and still returns the existing URL. Otherwise it creates a request through gh issue create -R "$PUBLISH_REPO" --title "$title" --body "$body".