Skip to content

Commit bd1a5b7

Browse files
authored
Merge pull request #19 from pranamphd/improve-cd-steps
fix(cd): make release creation idempotent and harden gh-pages publishing
2 parents aa83721 + 661d7f1 commit bd1a5b7

1 file changed

Lines changed: 73 additions & 21 deletions

File tree

.github/workflows/swift-cd.yml

Lines changed: 73 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -126,28 +126,80 @@ jobs:
126126
# -------------------------------------------------
127127
# Release safety checks
128128
# -------------------------------------------------
129-
- name: Abort if release exists
129+
- name: Check if GitHub release already exists
130130
env:
131131
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
132132
run: |
133133
set -euo pipefail
134134
if gh release view "$TAG" >/dev/null 2>&1; then
135-
echo "ERROR: Release $TAG already exists."
136-
exit 1
135+
echo "RELEASE_EXISTS=true" >> "$GITHUB_ENV"
136+
echo "RELEASE_IS_DRAFT=$(gh release view "$TAG" --json isDraft -q '.isDraft')" >> "$GITHUB_ENV"
137+
else
138+
echo "RELEASE_EXISTS=false" >> "$GITHUB_ENV"
137139
fi
138140
139-
- name: Detect prerelease
141+
- name: Abort if release already published
142+
if: env.RELEASE_EXISTS == 'true' && env.RELEASE_IS_DRAFT != 'true'
143+
run: |
144+
echo "ERROR: Release $TAG already exists and is published."
145+
echo "Refusing to modify an immutable release."
146+
exit 1
147+
148+
- name: Detect pre-release
140149
run: |
150+
set -euo pipefail
141151
if [[ "$TAG" =~ -(alpha|beta|rc) ]]; then
152+
echo "IS_PRERELEASE=true" >> "$GITHUB_ENV"
153+
else
154+
echo "IS_PRERELEASE=false" >> "$GITHUB_ENV"
155+
fi
156+
157+
- name: Set prerelease flag
158+
run: |
159+
if [[ "$IS_PRERELEASE" == "true" ]]; then
142160
echo "PRERELEASE=--prerelease" >> "$GITHUB_ENV"
143161
else
144162
echo "PRERELEASE=" >> "$GITHUB_ENV"
145163
fi
164+
- name: Detect release type
165+
run: |
166+
set -euo pipefail
167+
VERSION="${TAG#v}"
168+
IFS='.-' read -r MAJOR MINOR PATCH _ <<< "$VERSION"
169+
170+
echo "MAJOR=$MAJOR" >> "$GITHUB_ENV"
171+
echo "MINOR=$MINOR" >> "$GITHUB_ENV"
172+
echo "PATCH=$PATCH" >> "$GITHUB_ENV"
173+
174+
if [[ "$PATCH" == "0" && "$MINOR" == "0" ]]; then
175+
echo "RELEASE_TYPE=major" >> "$GITHUB_ENV"
176+
elif [[ "$PATCH" == "0" ]]; then
177+
echo "RELEASE_TYPE=minor" >> "$GITHUB_ENV"
178+
else
179+
echo "RELEASE_TYPE=patch" >> "$GITHUB_ENV"
180+
fi
181+
182+
- name: Compute notes start tag
183+
if: env.IS_PRERELEASE != 'true'
184+
run: |
185+
set -euo pipefail
186+
{
187+
case "$RELEASE_TYPE" in
188+
major) echo "START_TAG=v${MAJOR}.0.0" ;;
189+
minor) echo "START_TAG=v${MAJOR}.${MINOR}.0" ;;
190+
patch)
191+
if [[ "$PATCH" -gt 0 ]]; then
192+
echo "START_TAG=v${MAJOR}.${MINOR}.$((PATCH-1))"
193+
fi
194+
;;
195+
esac
196+
} >> "$GITHUB_ENV"
146197
147198
# -------------------------------------------------
148199
# Create & publish GitHub release
149200
# -------------------------------------------------
150201
- name: Create GitHub release (draft)
202+
if: env.RELEASE_EXISTS != 'true'
151203
env:
152204
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
153205
run: |
@@ -157,25 +209,11 @@ jobs:
157209
--title "$TAG" \
158210
--generate-notes
159211
160-
- name: Upload release assets
161-
env:
162-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
163-
run: |
164-
gh release upload "$TAG" \
165-
digipin-swift-${TAG}-spm-sbom.json \
166-
digipin-swift-${TAG}.doccarchive.zip
167-
168-
- name: Publish GitHub release
169-
if: env.TEST_MODE != 'true'
170-
env:
171-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
172-
run: gh release edit "$TAG" --draft=false
173-
174212
# -------------------------------------------------
175213
# Generate DocC (static, latest only)
176214
# -------------------------------------------------
177215
- name: Generate DocC (static, latest)
178-
if: env.TEST_MODE != 'true' && env.PRERELEASE == ''
216+
if: env.TEST_MODE != 'true' && env.IS_PRERELEASE != 'true'
179217
run: |
180218
set -euo pipefail
181219
@@ -196,12 +234,12 @@ jobs:
196234
# Publish latest docs to gh-pages
197235
# -------------------------------------------------
198236
- name: Publish docs to gh-pages
199-
if: env.TEST_MODE != 'true' && env.PRERELEASE == ''
237+
if: env.TEST_MODE != 'true' && env.IS_PRERELEASE != 'true'
200238
env:
201239
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
202240
run: |
203241
set -euo pipefail
204-
242+
rm -rf Digipin.doccarchive site
205243
git config user.name "github-actions[bot]"
206244
git config user.email "github-actions[bot]@users.noreply.github.com"
207245
@@ -233,3 +271,17 @@ jobs:
233271
Run: ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
234272
235273
git push origin gh-pages
274+
275+
- name: Upload release assets
276+
env:
277+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
278+
run: |
279+
gh release upload "$TAG" \
280+
digipin-swift-${TAG}-spm-sbom.json \
281+
digipin-swift-${TAG}.doccarchive.zip
282+
283+
- name: Publish GitHub release
284+
if: env.TEST_MODE != 'true'
285+
env:
286+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
287+
run: gh release edit "$TAG" --draft=false

0 commit comments

Comments
 (0)