1+ name : auto-release-chain
2+
3+ on :
4+ # Triggers when release-packages workflow completes (chain mode only)
5+ workflow_run :
6+ workflows : ["release-packages"]
7+ types :
8+ - completed
9+ branches :
10+ - main
11+
12+ permissions :
13+ contents : write
14+ pull-requests : write
15+ actions : write
16+
17+ jobs :
18+ check-and-continue-release :
19+ runs-on : ubuntu-24.04
20+ # Only run if the triggering workflow succeeded
21+ if : github.event.workflow_run.conclusion == 'success'
22+ steps :
23+ - uses : actions/checkout@v5
24+
25+ - name : Get workflow run details
26+ id : workflow_details
27+ env :
28+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
29+ run : |
30+ # Get details about the completed workflow
31+ RUN_ID="${{ github.event.workflow_run.id }}"
32+ echo "Triggered by workflow run ID: $RUN_ID"
33+
34+ # Get the workflow run details
35+ gh run view $RUN_ID --json jobs,conclusion,displayTitle > workflow_details.json
36+ cat workflow_details.json
37+
38+ # Extract information about what was released
39+ WORKFLOW_TITLE=$(jq -r '.displayTitle' workflow_details.json)
40+ echo "Workflow title: $WORKFLOW_TITLE"
41+ echo "workflow_title=$WORKFLOW_TITLE" >> $GITHUB_OUTPUT
42+
43+ - name : Detect released package from workflow
44+ id : detect_package
45+ env :
46+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
47+ run : |
48+ echo "🔍 Auto-release-chain triggered by release-packages workflow"
49+ echo "🔗 Checking what was released..."
50+
51+ # Get the triggering workflow details
52+ TRIGGERING_WORKFLOW="${{ github.event.workflow_run.name }}"
53+ TRIGGERING_CONCLUSION="${{ github.event.workflow_run.conclusion }}"
54+
55+ echo "Triggered by: $TRIGGERING_WORKFLOW"
56+ echo "Conclusion: $TRIGGERING_CONCLUSION"
57+
58+ # Get recent commits that might indicate a release
59+ git log --oneline -3 --pretty=format:"%H %s" > recent_commits.txt
60+ cat recent_commits.txt
61+
62+ RELEASED_PACKAGE=""
63+ PACKAGE_VERSION=""
64+
65+ # Look for release-please merge commits
66+ while IFS= read -r line; do
67+ COMMIT_MSG=$(echo "$line" | cut -d' ' -f2-)
68+ echo "Checking commit: $COMMIT_MSG"
69+
70+ # Match release-please commit pattern
71+ if [[ "$COMMIT_MSG" =~ ^chore\(main\):\ release\ ([a-z-]+)\ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then
72+ RELEASED_PACKAGE="${BASH_REMATCH[1]}"
73+ PACKAGE_VERSION="${BASH_REMATCH[2]}"
74+ echo "🎉 Detected release: $RELEASED_PACKAGE@$PACKAGE_VERSION"
75+ break
76+ fi
77+ done < recent_commits.txt
78+
79+ if [[ -n "$RELEASED_PACKAGE" ]]; then
80+ echo "released_package=$RELEASED_PACKAGE" >> $GITHUB_OUTPUT
81+ echo "package_version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT
82+ echo "has_release=true" >> $GITHUB_OUTPUT
83+ echo "✅ Found released package: $RELEASED_PACKAGE@$PACKAGE_VERSION"
84+ echo "🔗 Continuing automatic release chain..."
85+ else
86+ echo "has_release=false" >> $GITHUB_OUTPUT
87+ echo "ℹ️ No package release detected - chain may have completed or failed"
88+ fi
89+
90+ - name : Determine next package to release
91+ if : steps.detect_package.outputs.has_release == 'true'
92+ id : next_package
93+ env :
94+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
95+ run : |
96+ # Define package order (dependency order: base packages first)
97+ ALL_PACKAGES=("logger" "fs" "builder" "server" "project" "cli")
98+ CURRENT_PKG="${{ steps.detect_package.outputs.released_package }}"
99+
100+ echo "🔍 Looking for next package after: $CURRENT_PKG"
101+
102+ # Find the index of the current package
103+ CURRENT_IDX=-1
104+ for i in "${!ALL_PACKAGES[@]}"; do
105+ if [[ "${ALL_PACKAGES[$i]}" == "$CURRENT_PKG" ]]; then
106+ CURRENT_IDX=$i
107+ break
108+ fi
109+ done
110+
111+ if [[ $CURRENT_IDX -eq -1 ]]; then
112+ echo "❌ Package $CURRENT_PKG not found in package list"
113+ exit 1
114+ fi
115+
116+ # Find next package with an open release PR
117+ NEXT_PKG=""
118+ for ((i=CURRENT_IDX+1; i<${#ALL_PACKAGES[@]}; i++)); do
119+ PKG="${ALL_PACKAGES[$i]}"
120+ echo "Checking for open release PR for: $PKG"
121+
122+ PR_NUMBER=$(gh pr list --state open --search "release: ${PKG}" --json number,title | jq -r --arg pkg "$PKG" '.[] | select(.title | test("^release: \($pkg) v[0-9]+\\.[0-9]+\\.[0-9]+$")) | .number' | head -n1)
123+
124+ if [[ -n "$PR_NUMBER" ]]; then
125+ echo "✅ Found open release PR #$PR_NUMBER for $PKG"
126+ NEXT_PKG="$PKG"
127+ echo "next_package=$NEXT_PKG" >> $GITHUB_OUTPUT
128+ echo "next_pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
129+ echo "has_next=true" >> $GITHUB_OUTPUT
130+ break
131+ else
132+ echo "ℹ️ No open release PR for $PKG, checking next package..."
133+ fi
134+ done
135+
136+ if [[ -z "$NEXT_PKG" ]]; then
137+ echo "has_next=false" >> $GITHUB_OUTPUT
138+ echo "🎉 No more packages to release - release chain complete!"
139+ else
140+ echo "🎯 Next package to release: $NEXT_PKG (PR #$PR_NUMBER)"
141+ fi
142+
143+ - name : Merge next package PR
144+ if : steps.next_package.outputs.has_next == 'true'
145+ env :
146+ GH_TOKEN : ${{ secrets.RELEASE_PLEASE_TOKEN }}
147+ run : |
148+ NEXT_PKG="${{ steps.next_package.outputs.next_package }}"
149+ PR_NUMBER="${{ steps.next_package.outputs.next_pr_number }}"
150+
151+ echo "🚀 Auto-merging release PR for next package: $NEXT_PKG"
152+ echo "📋 PR Number: #$PR_NUMBER"
153+
154+ # Merge the PR
155+ if ! gh pr merge $PR_NUMBER --squash --admin; then
156+ echo "❌ Failed to merge PR #$PR_NUMBER for $NEXT_PKG"
157+ echo "🛑 Stopping auto-release chain"
158+ exit 1
159+ fi
160+
161+ echo "✅ Successfully merged PR #$PR_NUMBER for $NEXT_PKG"
162+ echo "⏭️ This merge will automatically trigger the release-please workflow for $NEXT_PKG"
163+
164+ - name : Release chain summary
165+ run : |
166+ if [[ "${{ steps.detect_package.outputs.has_release }}" == "true" ]]; then
167+ echo "🎉 Release Chain Status Report"
168+ echo "================================"
169+ echo "✅ Just released: ${{ steps.detect_package.outputs.released_package }}@${{ steps.detect_package.outputs.package_version }}"
170+
171+ if [[ "${{ steps.next_package.outputs.has_next }}" == "true" ]]; then
172+ echo "⏭️ Next in chain: ${{ steps.next_package.outputs.next_package }} (PR #${{ steps.next_package.outputs.next_pr_number }})"
173+ echo "🔄 Auto-release chain continuing..."
174+ else
175+ echo "🏁 Release chain complete - no more packages to release"
176+ fi
177+ else
178+ echo "ℹ️ No package release detected, chain not triggered"
179+ fi
180+
181+ handle-failure :
182+ runs-on : ubuntu-24.04
183+ # Only run if the triggering workflow failed
184+ if : github.event.workflow_run.conclusion == 'failure'
185+ steps :
186+ - name : Report failure
187+ run : |
188+ echo "❌ Release-please workflow failed!"
189+ echo "🛑 Auto-release chain stopped due to failure"
190+ echo "Run ID: ${{ github.event.workflow_run.id }}"
191+ echo "Check the failed workflow for details: ${{ github.event.workflow_run.html_url }}"
0 commit comments