1010 description : Commit immediately before the version increases (defaults to HEAD^)
1111 required : false
1212 type : string
13+ release_commit :
14+ description : Commit that introduced the package versions (defaults to the workflow commit)
15+ required : false
16+ type : string
1317
1418concurrency :
1519 group : npm-release
3640 env :
3741 PUSH_BEFORE : ${{ github.event.before }}
3842 DISPATCH_BEFORE : ${{ inputs.before }}
43+ DISPATCH_RELEASE_COMMIT : ${{ inputs.release_commit }}
3944 shell : bash
4045 run : |
4146 set -euo pipefail
4651 before="$(git rev-parse HEAD^)"
4752 fi
4853 fi
54+ release_sha="$GITHUB_SHA"
55+ if [[ "${{ github.event_name }}" == "workflow_dispatch" ]] && [[ -n "$DISPATCH_RELEASE_COMMIT" ]]; then
56+ release_sha="$(git rev-parse "$DISPATCH_RELEASE_COMMIT^{commit}")"
57+ if ! git merge-base --is-ancestor "$release_sha" "$GITHUB_SHA"; then
58+ echo "Release commit $release_sha is not an ancestor of workflow commit $GITHUB_SHA" >&2
59+ exit 1
60+ fi
61+ fi
4962 if [[ ! "$before" =~ ^[0-9a-fA-F]{40}$ ]] || [[ "$before" =~ ^0+$ ]]; then
5063 echo "No usable previous commit; skipping automatic release."
5164 echo '[]' > "$RUNNER_TEMP/release-plan.json"
5568 node scripts/release-plan.mjs --before "$before" --output "$RUNNER_TEMP/release-plan.json"
5669 count="$(node -p "require(process.env.RUNNER_TEMP + '/release-plan.json').length")"
5770 echo "count=$count" >> "$GITHUB_OUTPUT"
71+ echo "release_sha=$release_sha" >> "$GITHUB_OUTPUT"
5872
5973 - name : Set up pnpm
6074 uses : pnpm/action-setup@v6
7892 PLAN_FILE : ${{ runner.temp }}/release-plan.json
7993 ARTIFACT_DIR : ${{ runner.temp }}/release-artifacts
8094 ARTIFACTS_FILE : ${{ runner.temp }}/release-artifacts.tsv
95+ RELEASE_SHA : ${{ steps.plan.outputs.release_sha }}
8196 shell : bash
8297 run : |
8398 set -euo pipefail
92107 safe="${package#@}"
93108 safe="${safe//\//-}"
94109 tarball="$ARTIFACT_DIR/$safe-$version.tgz"
95- release_epoch="$(git show -s --format=%ct "$GITHUB_SHA ")"
110+ release_epoch="$(git show -s --format=%ct "$RELEASE_SHA ")"
96111 find "$directory" -type f -exec touch -d "@$release_epoch" {} +
97112 pnpm --filter "$package" pack --out "$tarball"
98113 printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
@@ -112,6 +127,7 @@ jobs:
112127 env :
113128 ARTIFACTS_FILE : ${{ runner.temp }}/release-artifacts.tsv
114129 GH_TOKEN : ${{ github.token }}
130+ RELEASE_SHA : ${{ steps.plan.outputs.release_sha }}
115131 shell : bash
116132 run : |
117133 set -euo pipefail
@@ -122,8 +138,8 @@ jobs:
122138 attach_tarball=true
123139 if git rev-parse --verify --quiet "refs/tags/$tag" >/dev/null; then
124140 target="$(git rev-list -n 1 "$tag")"
125- if [[ "$target" != "$GITHUB_SHA " ]]; then
126- echo "Tag $tag already points to $target instead of $GITHUB_SHA " >&2
141+ if [[ "$target" != "$RELEASE_SHA " ]]; then
142+ echo "Tag $tag already points to $target instead of $RELEASE_SHA " >&2
127143 exit 1
128144 fi
129145 tag_exists=true
@@ -154,7 +170,7 @@ jobs:
154170 rm -f "$npm_error"
155171
156172 if [[ "$tag_exists" != true ]]; then
157- git tag --annotate "$tag" --message "Release $tag" "$GITHUB_SHA "
173+ git tag --annotate "$tag" --message "Release $tag" "$RELEASE_SHA "
158174 git push origin "refs/tags/$tag"
159175 fi
160176
0 commit comments