Skip to content

Commit f5a8ef2

Browse files
authored
Improve release process with RC tags, branch naming, and Maven JAR
1 parent 3e766aa commit f5a8ef2

File tree

2 files changed

+115
-31
lines changed

2 files changed

+115
-31
lines changed

.github/workflows/release.yml

Lines changed: 85 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ on:
3939
required: true
4040
type: string
4141
release_branch:
42-
description: 'Release branch (e.g., release/2.3)'
42+
description: 'Release branch (e.g., release/2.3._)'
4343
required: true
4444
type: string
4545
next_snapshot:
@@ -59,6 +59,7 @@ defaults:
5959
env:
6060
RELEASE_VERSION: ${{ inputs.release_version }}
6161
RELEASE_TAG: v${{ inputs.release_version }}
62+
RC_TAG: v${{ inputs.release_version }}_RC
6263

6364
jobs:
6465
# ============================================================
@@ -117,6 +118,15 @@ jobs:
117118
echo "::error::Tag v${{ inputs.release_version }} already exists on remote"
118119
exit 1
119120
fi
121+
# Check for leftover RC tag
122+
if git rev-parse "${RC_TAG}" >/dev/null 2>&1; then
123+
echo "::error::RC tag ${RC_TAG} already exists locally. Clean up with: git tag -d ${RC_TAG}"
124+
exit 1
125+
fi
126+
if git ls-remote --tags origin "refs/tags/${RC_TAG}" | grep -q .; then
127+
echo "::error::RC tag ${RC_TAG} already exists on remote. Clean up with: git push origin :refs/tags/${RC_TAG}"
128+
exit 1
129+
fi
120130
echo "Tag does not exist - OK"
121131
122132
- name: Check if release branch exists
@@ -338,26 +348,26 @@ jobs:
338348
echo "sha=${SHA}" >> $GITHUB_OUTPUT
339349
echo "Release commit: ${SHA}"
340350
341-
- name: Create tag
351+
- name: Create RC tag
342352
if: ${{ inputs.dry_run != true }}
343353
run: |
344-
git tag -a "${RELEASE_TAG}" -m "Release ${RELEASE_TAG}"
345-
echo "Created tag ${RELEASE_TAG}"
354+
git tag -a "${RC_TAG}" -m "Release candidate ${RELEASE_TAG}"
355+
echo "Created RC tag ${RC_TAG}"
346356
347-
- name: Push branch and tag
357+
- name: Push branch and RC tag
348358
if: ${{ inputs.dry_run != true }}
349359
run: |
350360
git push origin "${{ inputs.release_branch }}"
351-
git push origin "${RELEASE_TAG}"
352-
echo "Pushed branch and tag"
361+
git push origin "${RC_TAG}"
362+
echo "Pushed branch and RC tag"
353363
354364
- name: Dry run summary
355365
if: ${{ inputs.dry_run == true }}
356366
run: |
357367
echo "::warning::DRY RUN - Branch and tag NOT pushed"
358368
echo "Would have pushed:"
359369
echo " - Branch: ${{ inputs.release_branch }}"
360-
echo " - Tag: ${RELEASE_TAG}"
370+
echo " - RC Tag: ${RC_TAG}"
361371
362372
# ============================================================
363373
# Job 5: Stage to Maven Central (does NOT release)
@@ -368,10 +378,10 @@ jobs:
368378
runs-on: ubuntu-latest
369379
if: ${{ inputs.dry_run != true }}
370380
steps:
371-
- name: Checkout release tag
381+
- name: Checkout RC tag
372382
uses: actions/checkout@v6
373383
with:
374-
ref: ${{ env.RELEASE_TAG }}
384+
ref: ${{ env.RC_TAG }}
375385

376386
- name: Cache Java binaries
377387
id: cache-java
@@ -547,6 +557,46 @@ jobs:
547557
git push || echo "⚠️ Push failed - update catalog manually at https://github.com/btraceio/jbang-catalog"
548558
fi
549559
560+
# ============================================================
561+
# Job 5d: Finalize release tag (RC -> final)
562+
# ============================================================
563+
finalize-tag:
564+
name: Finalize Release Tag
565+
needs: [prepare-release, wait-for-maven]
566+
runs-on: ubuntu-latest
567+
if: ${{ inputs.dry_run != true }}
568+
steps:
569+
- name: Checkout at release SHA
570+
uses: actions/checkout@v6
571+
with:
572+
ref: ${{ needs.prepare-release.outputs.release_sha }}
573+
fetch-depth: 0
574+
token: ${{ secrets.GITHUB_TOKEN }}
575+
576+
- name: Fetch tags
577+
run: git fetch origin --tags
578+
579+
- name: Configure Git
580+
run: |
581+
git config user.name "github-actions[bot]"
582+
git config user.email "github-actions[bot]@users.noreply.github.com"
583+
584+
- name: Create final tag
585+
run: |
586+
git tag -a "${RELEASE_TAG}" -m "Release ${RELEASE_TAG}"
587+
echo "Created final tag ${RELEASE_TAG}"
588+
589+
- name: Push final tag
590+
run: |
591+
git push origin "${RELEASE_TAG}"
592+
echo "Pushed final tag ${RELEASE_TAG}"
593+
594+
- name: Delete RC tag
595+
run: |
596+
git tag -d "${RC_TAG}" || true
597+
git push origin ":refs/tags/${RC_TAG}" || true
598+
echo "Deleted RC tag ${RC_TAG}"
599+
550600
# ============================================================
551601
# Job 6: Build distribution packages
552602
# ============================================================
@@ -555,10 +605,10 @@ jobs:
555605
needs: prepare-release
556606
runs-on: ubuntu-latest
557607
steps:
558-
- name: Checkout release tag
608+
- name: Checkout release commit
559609
uses: actions/checkout@v6
560610
with:
561-
ref: ${{ inputs.dry_run == true && inputs.commit_sha || env.RELEASE_TAG }}
611+
ref: ${{ inputs.dry_run == true && inputs.commit_sha || env.RC_TAG }}
562612

563613
- name: Cache Java binaries
564614
id: cache-java
@@ -612,7 +662,7 @@ jobs:
612662
# ============================================================
613663
create-github-release:
614664
name: Create GitHub Release
615-
needs: [build-distributions, wait-for-maven]
665+
needs: [build-distributions, finalize-tag]
616666
runs-on: ubuntu-latest
617667
if: ${{ inputs.dry_run != true }}
618668
steps:
@@ -628,6 +678,25 @@ jobs:
628678
name: release-distributions
629679
path: distributions
630680

681+
- name: Download Maven artifact
682+
continue-on-error: true
683+
run: |
684+
VERSION="${{ inputs.release_version }}"
685+
BASE_URL="https://repo1.maven.org/maven2/io/btrace/btrace/${VERSION}"
686+
mkdir -p maven-artifacts
687+
MAX_ATTEMPTS=40
688+
for i in $(seq 1 $MAX_ATTEMPTS); do
689+
if curl -fSL "${BASE_URL}/btrace-${VERSION}.jar" \
690+
-o maven-artifacts/btrace-${VERSION}.jar; then
691+
echo "Downloaded btrace-${VERSION}.jar"
692+
ls -la maven-artifacts/
693+
exit 0
694+
fi
695+
echo "Attempt ${i}/${MAX_ATTEMPTS} failed, retrying in 30s..."
696+
sleep 30
697+
done
698+
echo "::warning::Failed to download Maven JAR after ${MAX_ATTEMPTS} attempts (~20 minutes). GitHub release will proceed without it."
699+
631700
- name: Check for no-release-notes label
632701
id: check-label
633702
run: |
@@ -653,6 +722,7 @@ jobs:
653722
distributions/btrace-v${{ inputs.release_version }}-sdkman-bin.zip
654723
distributions/*.deb
655724
distributions/*.rpm
725+
maven-artifacts/*
656726
657727
# ============================================================
658728
# Job 8: Update SDKMan
@@ -861,7 +931,7 @@ jobs:
861931
# ============================================================
862932
summary:
863933
name: Release Summary
864-
needs: [create-github-release, update-sdkman, update-milestones, update-jbang-catalog]
934+
needs: [create-github-release, update-sdkman, update-milestones, update-jbang-catalog, finalize-tag]
865935
runs-on: ubuntu-latest
866936
if: always()
867937
steps:
@@ -915,6 +985,7 @@ jobs:
915985
echo "| Prepare Release | ${{ needs.prepare-release.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
916986
echo "| Stage Maven | ${{ needs.stage-maven.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
917987
echo "| Wait for Maven | ${{ needs.wait-for-maven.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
988+
echo "| Finalize Tag | ${{ needs.finalize-tag.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
918989
echo "| GitHub Release | ${{ needs.create-github-release.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
919990
echo "| SDKMan | ${{ needs.update-sdkman.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY
920991
echo "| JBang Catalog | ${{ needs.update-jbang-catalog.result || 'skipped' }} |" >> $GITHUB_STEP_SUMMARY

scripts/release.sh

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# Examples:
1212
# ./scripts/release.sh minor # Minor release from develop
1313
# ./scripts/release.sh major # Major release from develop
14-
# ./scripts/release.sh patch release/2.3 # Patch release from release/2.3
14+
# ./scripts/release.sh patch release/2.3._ # Patch release from release/2.3._
1515
#
1616
# Environment variables:
1717
# DRY_RUN=true Show what would be done without triggering workflow
@@ -73,20 +73,20 @@ Arguments:
7373
Release Types:
7474
major Bump major version (e.g., 2.3.0-SNAPSHOT -> 3.0.0)
7575
Next develop: 3.1.0-SNAPSHOT
76-
Creates: release/3.0 branch
76+
Creates: release/3.0._ branch
7777
7878
minor Release current version (e.g., 2.3.0-SNAPSHOT -> 2.3.0)
7979
Next develop: 2.4.0-SNAPSHOT
80-
Creates: release/2.3 branch
80+
Creates: release/2.3._ branch
8181
8282
patch Bump patch version on release branch (e.g., 2.3.1-SNAPSHOT -> 2.3.1)
8383
Next release branch: 2.3.2-SNAPSHOT
84-
Requires: release/X.Y branch as source
84+
Requires: release/X.Y._ branch as source
8585
8686
Examples:
8787
$(basename "$0") minor # Release 2.3.0 from develop
8888
$(basename "$0") major # Release 3.0.0 from develop
89-
$(basename "$0") patch release/2.3 # Release 2.3.1 from release/2.3
89+
$(basename "$0") patch release/2.3._ # Release 2.3.1 from release/2.3._
9090
9191
Environment:
9292
DRY_RUN=true Show what would happen without triggering the workflow
@@ -224,10 +224,10 @@ pick_commit() {
224224
pick_release_branch() {
225225
# Get release branches sorted by version (newest first)
226226
local branches
227-
branches=$(git branch -a --list '*release/*' | sed 's/.*\(release\/[0-9]*\.[0-9]*\).*/\1/' | sort -t. -k1,1nr -k2,2nr | uniq)
227+
branches=$(git branch -a --list '*release/*' | sed 's/.*\(release\/[0-9]*\.[0-9]*\._\).*/\1/' | sort -t. -k1,1nr -k2,2nr | uniq)
228228

229229
if [[ -z "${branches}" ]]; then
230-
error "No release branches found (expected pattern: release/X.Y)"
230+
error "No release branches found (expected pattern: release/X.Y._)"
231231
exit 1
232232
fi
233233

@@ -410,21 +410,21 @@ calculate_versions() {
410410
release_version="$((major + 1)).0.0"
411411
next_develop_snapshot="$((major + 1)).1.0-SNAPSHOT"
412412
next_release_snapshot="$((major + 1)).0.1-SNAPSHOT"
413-
release_branch="release/$((major + 1)).0"
413+
release_branch="release/$((major + 1)).0._"
414414
;;
415415
minor)
416-
# Minor: X.Y.Z-SNAPSHOT -> X.Y.Z (just drop SNAPSHOT)
417-
release_version="${major}.${minor}.${patch}"
416+
# Minor: X.Y.Z-SNAPSHOT -> X.Y.0 (always .0 for minor releases)
417+
release_version="${major}.${minor}.0"
418418
next_develop_snapshot="${major}.$((minor + 1)).0-SNAPSHOT"
419-
next_release_snapshot="${major}.${minor}.$((patch + 1))-SNAPSHOT"
420-
release_branch="release/${major}.${minor}"
419+
next_release_snapshot="${major}.${minor}.1-SNAPSHOT"
420+
release_branch="release/${major}.${minor}._"
421421
;;
422422
patch)
423423
# Patch: X.Y.Z-SNAPSHOT -> X.Y.Z
424424
release_version="${major}.${minor}.${patch}"
425425
next_develop_snapshot="" # Not updated for patch releases
426426
next_release_snapshot="${major}.${minor}.$((patch + 1))-SNAPSHOT"
427-
release_branch="release/${major}.${minor}"
427+
release_branch="release/${major}.${minor}._"
428428
;;
429429
*)
430430
error "Invalid release type: ${release_type}"
@@ -463,8 +463,8 @@ validate_source_ref() {
463463
fi
464464
;;
465465
patch)
466-
# Must be from a release/X.Y branch or a commit from one
467-
if [[ "${source_ref}" =~ ^release/[0-9]+\.[0-9]+$ ]]; then
466+
# Must be from a release/X.Y._ branch or a commit from one
467+
if [[ "${source_ref}" =~ ^release/[0-9]+\.[0-9]+\._$ ]]; then
468468
# It's a branch name, check if it exists
469469
if ! git show-ref --verify --quiet "refs/heads/${source_ref}" && \
470470
! git show-ref --verify --quiet "refs/remotes/origin/${source_ref}"; then
@@ -480,7 +480,7 @@ validate_source_ref() {
480480
fi
481481
fi
482482
else
483-
error "Patch releases must be from a release/X.Y branch."
483+
error "Patch releases must be from a release/X.Y._ branch."
484484
error "Got: ${source_ref}"
485485
exit 1
486486
fi
@@ -506,6 +506,19 @@ check_tag_exists() {
506506
error "Tag v${tag} already exists on remote."
507507
exit 1
508508
fi
509+
510+
# Check for leftover RC tag (locally and on remote)
511+
if git rev-parse "v${tag}_RC" &> /dev/null; then
512+
error "RC tag v${tag}_RC already exists locally."
513+
error "Clean up with: git tag -d v${tag}_RC"
514+
exit 1
515+
fi
516+
517+
if git ls-remote --tags origin "refs/tags/v${tag}_RC" | grep -q .; then
518+
error "RC tag v${tag}_RC already exists on remote."
519+
error "Clean up with: git push origin :refs/tags/v${tag}_RC && git tag -d v${tag}_RC"
520+
exit 1
521+
fi
509522
}
510523

511524
#######################################
@@ -642,7 +655,7 @@ main() {
642655
;;
643656
patch)
644657
error "Patch releases require a release branch."
645-
echo "Usage: $(basename "$0") patch release/X.Y"
658+
echo "Usage: $(basename "$0") patch release/X.Y._"
646659
exit 1
647660
;;
648661
esac

0 commit comments

Comments
 (0)