Skip to content

Commit 8fd63ce

Browse files
authored
Merge pull request #2 from d3xter666/feat-package-release
Feat package release
2 parents 6092458 + d8c406d commit 8fd63ce

File tree

4 files changed

+396
-0
lines changed

4 files changed

+396
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
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 }}"
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
name: release-packages
2+
3+
on:
4+
# Manually trigger the release chain starting from a specific package
5+
workflow_dispatch:
6+
inputs:
7+
package:
8+
description: "🚀 Start AUTOMATIC release chain from this package (will auto-release this and all packages after it)"
9+
required: true
10+
type: choice
11+
options:
12+
- logger
13+
- fs
14+
- builder
15+
- server
16+
- project
17+
- cli
18+
default: logger
19+
20+
permissions:
21+
contents: write
22+
pull-requests: write
23+
actions: write
24+
25+
jobs:
26+
start-release-chain:
27+
runs-on: ubuntu-24.04
28+
outputs:
29+
started_package: ${{ steps.start_chain.outputs.started_package }}
30+
chain_length: ${{ steps.start_chain.outputs.chain_length }}
31+
steps:
32+
- uses: actions/checkout@v5
33+
34+
- name: Start release chain
35+
id: start_chain
36+
env:
37+
GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }}
38+
run: |
39+
# Define the complete package order (dependency order: base packages first)
40+
ALL_PACKAGES=("logger" "fs" "builder" "server" "project" "cli")
41+
SELECTED_PKG="${{ github.event.inputs.package }}"
42+
43+
echo "🚀 Starting AUTOMATIC release chain from package: $SELECTED_PKG"
44+
45+
# Find the index of the selected package
46+
START_IDX=-1
47+
for i in "${!ALL_PACKAGES[@]}"; do
48+
if [[ "${ALL_PACKAGES[$i]}" == "$SELECTED_PKG" ]]; then
49+
START_IDX=$i
50+
break
51+
fi
52+
done
53+
54+
if [[ $START_IDX -eq -1 ]]; then
55+
echo "❌ Package $SELECTED_PKG not found in package list"
56+
exit 1
57+
fi
58+
59+
# Calculate how many packages will be in the chain
60+
CHAIN_LENGTH=$((${#ALL_PACKAGES[@]} - START_IDX))
61+
echo "📦 Release chain will include $CHAIN_LENGTH packages: ${ALL_PACKAGES[@]:$START_IDX}"
62+
63+
# Check if there's an open release PR for the selected package
64+
PR_NUMBER=$(gh pr list --state open --search "release: ${SELECTED_PKG}" --json number,title | jq -r --arg pkg "$SELECTED_PKG" '.[] | select(.title | test("^release: \($pkg) v[0-9]+\\.[0-9]+\\.[0-9]+$")) | .number' | head -n1)
65+
66+
if [[ -n "$PR_NUMBER" ]]; then
67+
echo "✅ Found open release PR #$PR_NUMBER for $SELECTED_PKG"
68+
69+
# Merge the first PR to start the chain
70+
echo "🔄 Merging PR #$PR_NUMBER for $SELECTED_PKG to start the chain..."
71+
if ! gh pr merge $PR_NUMBER --squash --admin; then
72+
echo "❌ Failed to merge PR #$PR_NUMBER for $SELECTED_PKG"
73+
echo "🛑 Cannot start release chain"
74+
exit 1
75+
fi
76+
77+
echo "✅ Successfully merged PR #$PR_NUMBER for $SELECTED_PKG"
78+
echo "🔗 This will trigger release-please → auto-release-chain → continues automatically"
79+
80+
echo "started_package=$SELECTED_PKG" >> $GITHUB_OUTPUT
81+
echo "chain_length=$CHAIN_LENGTH" >> $GITHUB_OUTPUT
82+
echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
83+
84+
else
85+
echo "❌ No open release PR found for $SELECTED_PKG"
86+
echo "🛑 Cannot start release chain - no PR to merge"
87+
exit 1
88+
fi
89+
90+
- name: Chain initiation summary
91+
run: |
92+
echo "🎉 Release Chain Initiated!"
93+
echo "================================"
94+
echo "� Started from: ${{ steps.start_chain.outputs.started_package }}"
95+
echo "� Chain length: ${{ steps.start_chain.outputs.chain_length }} packages"
96+
echo "🔗 Flow: release-please.yml → auto-release-chain.yml → (repeats automatically)"
97+
echo ""
98+
echo "ℹ️ The chain will now continue automatically:"
99+
echo " 1. release-please.yml publishes ${{ steps.start_chain.outputs.started_package }} to NPM"
100+
echo " 2. auto-release-chain.yml detects completion and merges next package PR"
101+
echo " 3. Repeats until all packages in chain are released"
102+
echo ""
103+
echo "✅ You can monitor progress in the Actions tab"
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
name: release-please
2+
3+
on:
4+
push:
5+
# Detects when a release PR is merged and publishes the package
6+
branches:
7+
- main
8+
9+
permissions:
10+
contents: write
11+
pull-requests: write
12+
13+
jobs:
14+
detect-and-publish:
15+
runs-on: ubuntu-24.04
16+
outputs:
17+
package_released: ${{ steps.detect_package.outputs.package_name }}
18+
package_version: ${{ steps.detect_package.outputs.package_version }}
19+
steps:
20+
- uses: actions/checkout@v5
21+
22+
- name: Node.js LTS
23+
uses: actions/setup-node@v5
24+
with:
25+
node-version: 24.x
26+
27+
- name: Run Release Please to update PRs and create releases
28+
uses: googleapis/release-please-action@v4
29+
id: release
30+
with:
31+
token: ${{ secrets.RELEASE_PLEASE_TOKEN }} # TODO: Change token on prod
32+
33+
- name: Detect which package was released
34+
id: detect_package
35+
run: |
36+
echo "🔍 Checking if a release PR was just merged..."
37+
38+
# Get the commit message of the merge
39+
COMMIT_MSG=$(git log -1 --pretty=format:"%s")
40+
echo "Latest commit: $COMMIT_MSG"
41+
42+
# Check if this is a release PR merge (release-please creates commits like "chore(main): release cli 4.1.2")
43+
if [[ "$COMMIT_MSG" =~ ^chore\(main\):\ release\ ([a-z-]+)\ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then
44+
PACKAGE_NAME="${BASH_REMATCH[1]}"
45+
PACKAGE_VERSION="${BASH_REMATCH[2]}"
46+
47+
echo "🎉 Detected release for package: $PACKAGE_NAME@$PACKAGE_VERSION"
48+
echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT
49+
echo "package_version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT
50+
echo "package_path=packages/$PACKAGE_NAME" >> $GITHUB_OUTPUT
51+
echo "is_release=true" >> $GITHUB_OUTPUT
52+
else
53+
echo "ℹ️ This commit is not a release PR merge"
54+
echo "is_release=false" >> $GITHUB_OUTPUT
55+
fi
56+
57+
- name: Verify package directory exists
58+
if: steps.detect_package.outputs.is_release == 'true'
59+
run: |
60+
PACKAGE_PATH="${{ steps.detect_package.outputs.package_path }}"
61+
if [ ! -d "$PACKAGE_PATH" ]; then
62+
echo "❌ Package directory $PACKAGE_PATH does not exist!"
63+
exit 1
64+
fi
65+
66+
if [ ! -f "$PACKAGE_PATH/package.json" ]; then
67+
echo "❌ No package.json found in $PACKAGE_PATH!"
68+
exit 1
69+
fi
70+
71+
echo "✅ Package directory $PACKAGE_PATH exists and contains package.json"
72+
73+
- name: Install dependencies
74+
if: steps.detect_package.outputs.is_release == 'true'
75+
run: |
76+
cd "${{ steps.detect_package.outputs.package_path }}"
77+
echo "📦 Installing dependencies for ${{ steps.detect_package.outputs.package_name }}@${{ steps.detect_package.outputs.package_version }}"
78+
npm ci
79+
80+
- name: Publish to NPM
81+
if: steps.detect_package.outputs.is_release == 'true'
82+
run: |
83+
cd "${{ steps.detect_package.outputs.package_path }}"
84+
echo "🚀 Publishing ${{ steps.detect_package.outputs.package_name }}@${{ steps.detect_package.outputs.package_version }} to NPM..."
85+
86+
# TODO: Uncomment the following lines when ready to publish
87+
# npm publish --access public
88+
89+
echo "✅ Successfully published ${{ steps.detect_package.outputs.package_name }}@${{ steps.detect_package.outputs.package_version }}"
90+
91+
create-release:
92+
runs-on: ubuntu-24.04
93+
needs: detect-and-publish
94+
if: needs.detect-and-publish.outputs.package_released != ''
95+
steps:
96+
- uses: actions/checkout@v5
97+
98+
- name: Run Release Please to create tags
99+
uses: googleapis/release-please-action@v4
100+
id: release
101+
with:
102+
token: ${{ secrets.RELEASE_PLEASE_TOKEN }} # TODO: Change token on prod

docs/images/UI5_logo_wide.png

65.4 KB
Loading

0 commit comments

Comments
 (0)