Skip to content

Commit c99b7e7

Browse files
authored
fix(ci): target release commits during recovery / 恢复时指定版本提交 (#21)
fix(ci): target the version commit during recovery
1 parent fa9e34e commit c99b7e7

1 file changed

Lines changed: 20 additions & 4 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ on:
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

1418
concurrency:
1519
group: npm-release
@@ -36,6 +40,7 @@ jobs:
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
@@ -46,6 +51,14 @@ jobs:
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"
@@ -55,6 +68,7 @@ jobs:
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
@@ -78,6 +92,7 @@ jobs:
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
@@ -92,7 +107,7 @@ jobs:
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

Comments
 (0)