From cc47ddcb9c3754cf76b5c9c6d0f592402a7a4787 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Tue, 28 Oct 2025 09:50:15 +0200 Subject: [PATCH 1/7] feat: Enable release-please release setup --- .github/actions/merge-release-pr/action.yml | 45 +++++ .github/auto-release-chain.yml | 54 ++++++ .github/relase-packages.yml | 67 ++++++++ .github/release-please.yml | 174 ++++++++++++++++++++ 4 files changed, 340 insertions(+) create mode 100644 .github/actions/merge-release-pr/action.yml create mode 100644 .github/auto-release-chain.yml create mode 100644 .github/relase-packages.yml create mode 100644 .github/release-please.yml diff --git a/.github/actions/merge-release-pr/action.yml b/.github/actions/merge-release-pr/action.yml new file mode 100644 index 00000000000..8e10cc0db5b --- /dev/null +++ b/.github/actions/merge-release-pr/action.yml @@ -0,0 +1,45 @@ +name: 'Merge Release PR' +description: 'Find and merge a release PR for a specific package' +inputs: + package: + description: 'Package name to find and merge PR for' + required: true + github-token: + description: 'GitHub token for API access' + required: true +outputs: + pr-number: + description: 'PR number that was merged' + value: ${{ steps.merge.outputs.pr-number }} + merged: + description: 'Whether a PR was found and merged' + value: ${{ steps.merge.outputs.merged }} + +runs: + using: 'composite' + steps: + - name: Find and merge release PR + id: merge + shell: bash + env: + GH_TOKEN: ${{ inputs.github-token }} + run: | + PACKAGE="${{ inputs.package }}" + echo "🔍 Looking for release PR for: $PACKAGE" + + # Find release PR + PR_NUMBER=$(gh pr list --state open --json number,title | jq -r '.[] | select(.title | startswith("release: @ui5/ '$PACKAGE' v")) | .number' | head -n1) + + if [[ -n "$PR_NUMBER" ]]; then + echo "✅ Found PR #$PR_NUMBER for $PACKAGE" + echo "🔄 Merging..." + + gh pr merge $PR_NUMBER --squash --admin + + echo "✅ Merged PR #$PR_NUMBER for $PACKAGE" + echo "pr-number=$PR_NUMBER" >> $GITHUB_OUTPUT + echo "merged=true" >> $GITHUB_OUTPUT + else + echo "❌ No release PR found for $PACKAGE" + echo "merged=false" >> $GITHUB_OUTPUT + fi \ No newline at end of file diff --git a/.github/auto-release-chain.yml b/.github/auto-release-chain.yml new file mode 100644 index 00000000000..d11a7549604 --- /dev/null +++ b/.github/auto-release-chain.yml @@ -0,0 +1,54 @@ +name: auto-release-chain + +on: + workflow_run: + workflows: ["release-please"] + types: [completed] + branches: [main] + +permissions: + contents: write + pull-requests: write + +jobs: + continue-chain: + runs-on: ubuntu-24.04 + if: github.event.workflow_run.conclusion == 'success' + steps: + - uses: actions/checkout@v5 + + - name: Find next package + id: next-pkg + run: | + ALL_PACKAGES=("logger" "fs" "builder" "server" "project" "cli") + + # Find what was just released + RELEASED_PKG="" + if git log -1 --pretty=format:"%s" | grep -q "^release: @ui5/"; then + RELEASED_PKG=$(git log -1 --pretty=format:"%s" | sed -n 's/^release: @ui5\/ \([a-z-]*\) v.*/\1/p') + echo "đŸ“Ļ Detected release: $RELEASED_PKG" + else + echo "â„šī¸ No release detected" + exit 0 + fi + + # Find next package + for i in "${!ALL_PACKAGES[@]}"; do + if [[ "${ALL_PACKAGES[$i]}" == "$RELEASED_PKG" ]] && [[ $((i+1)) -lt ${#ALL_PACKAGES[@]} ]]; then + NEXT_PKG="${ALL_PACKAGES[$((i+1))]}" + echo "đŸŽ¯ Next package: $NEXT_PKG" + echo "next_package=$NEXT_PKG" >> $GITHUB_OUTPUT + echo "has_next=true" >> $GITHUB_OUTPUT + exit 0 + fi + done + + echo "īŋŊ Chain complete" + echo "has_next=false" >> $GITHUB_OUTPUT + + - name: Merge next PR + if: steps.next-pkg.outputs.has_next == 'true' + uses: ./.github/actions/merge-release-pr + with: + package: ${{ steps.next-pkg.outputs.next_package }} + github-token: ${{ secrets.RELEASE_PLEASE_TOKEN }} \ No newline at end of file diff --git a/.github/relase-packages.yml b/.github/relase-packages.yml new file mode 100644 index 00000000000..ad87b5158cd --- /dev/null +++ b/.github/relase-packages.yml @@ -0,0 +1,67 @@ +name: release-packages + +on: + # Manually trigger the release chain starting from a specific package + workflow_dispatch: + inputs: + package: + description: "🚀 Start AUTOMATIC release chain from this package (will auto-release this and all packages after it)" + required: true + type: choice + options: + - logger + - fs + - builder + - server + - project + - cli + default: logger + +permissions: + contents: write + pull-requests: write + actions: write + +jobs: + start-release-chain: + runs-on: ubuntu-24.04 + outputs: + started_package: ${{ steps.start_chain.outputs.started_package }} + chain_length: ${{ steps.start_chain.outputs.chain_length }} + steps: + - uses: actions/checkout@v5 + + - name: Start release chain + id: start_chain + run: | + ALL_PACKAGES=("logger" "fs" "builder" "server" "project" "cli") + SELECTED_PKG="${{ github.event.inputs.package }}" + + echo "🚀 Starting release chain from: $SELECTED_PKG" + + # Find position and show chain + for i in "${!ALL_PACKAGES[@]}"; do + [[ "${ALL_PACKAGES[$i]}" == "$SELECTED_PKG" ]] && START_IDX=$i && break + done + + [[ -z "$START_IDX" ]] && echo "❌ Package not found" && exit 1 + + CHAIN_LENGTH=$((${#ALL_PACKAGES[@]} - START_IDX)) + echo "đŸ“Ļ Will release $CHAIN_LENGTH packages: ${ALL_PACKAGES[@]:$START_IDX}" + echo "started_package=$SELECTED_PKG" >> $GITHUB_OUTPUT + echo "chain_length=$CHAIN_LENGTH" >> $GITHUB_OUTPUT + + - name: Merge first PR + id: merge-pr + uses: ./.github/actions/merge-release-pr + with: + package: ${{ github.event.inputs.package }} + github-token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Check merge result + run: | + if [[ "${{ steps.merge-pr.outputs.merged }}" != "true" ]]; then + echo "❌ Failed to start chain - no PR found" + exit 1 + fi + echo "✅ Chain started successfully!" diff --git a/.github/release-please.yml b/.github/release-please.yml new file mode 100644 index 00000000000..4be1e287f1a --- /dev/null +++ b/.github/release-please.yml @@ -0,0 +1,174 @@ +name: release-please + +on: + push: + # Detects when a release PR is merged and publishes the package + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-24.04 + outputs: + releases_created: ${{ steps.release.outputs.releases_created }} + prs_created: ${{ steps.release.outputs.prs_created }} + package_released: ${{ steps.detect_package.outputs.is_release }} + package_name: ${{ steps.detect_package.outputs.package_name }} + package_version: ${{ steps.detect_package.outputs.package_version }} + package_path: ${{ steps.detect_package.outputs.package_path }} + steps: + - uses: actions/checkout@v5 + + - name: Node.js LTS + uses: actions/setup-node@v5 + with: + node-version: 24.x + + - name: Run Release Please to update PRs and create releases + uses: googleapis/release-please-action@v4 + id: release + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} # TODO: Change token on prod + + # This step is mandatory because release-please nor its plugin + # node-workspace does not update the manifest automatically. + # Also adds missing release tags that node-workspace plugin doesn't create. + - name: Update manifest and add tags to release PRs + env: + GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} + run: | + # Configure git identity + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Create label if needed + gh label create "autorelease: pending" --description "Release PR pending merge" --color "fbca04" || true + + # Process each release PR + for pr_info in $(gh pr list --state open --json number,headRefName,title | jq -r '.[] | select(.title | startswith("release: @ui5/")) | "\(.number):\(.headRefName)"'); do + pr_number=$(echo "$pr_info" | cut -d: -f1) + branch_name=$(echo "$pr_info" | cut -d: -f2) + + echo "đŸ“Ļ Processing PR #$pr_number" + + # Extract package name + pkg_name=$(echo "$branch_name" | sed -n 's/.*release-please--branches--main--components--\([^-]*\).*/\1/p') + + if [ -z "$pkg_name" ]; then + echo "âš ī¸ Could not determine package from branch: $branch_name" + continue + fi + + # Update manifest in PR branch + git fetch origin main + git fetch origin "$branch_name" && git checkout "$branch_name" + + # Clean any uncommitted changes before starting + git reset --hard HEAD + git clean -fd + + # FIRST: Read the current package version that release-please set + current_version=$(jq -r --arg p "packages/$pkg_name" '.[$p]' .release-please-manifest.json) + echo "đŸ“Ļ Found release-please version for $pkg_name: $current_version" + + # THEN: Sync with main's manifest structure + echo "⚡ Syncing manifest with main..." + git checkout origin/main -- .release-please-manifest.json + echo "⚡ Sync complete." + + # FINALLY: Restore the release-please version for this package + jq --arg p "packages/$pkg_name" --arg v "$current_version" '.[$p] = $v' .release-please-manifest.json > tmp.json && mv tmp.json .release-please-manifest.json + + echo "đŸ“Ļ Updated manifest for $pkg_name to version $current_version" + cat .release-please-manifest.json + + # Commit and push the changes + git add .release-please-manifest.json + if git diff --staged --quiet; then + echo "â„šī¸ No changes to manifest file" + else + git commit -m "fix: Sync .release-please-manifest.json" + git push origin "$branch_name" --force + echo "✅ Committed manifest changes" + fi + + # Add label + gh pr edit "$pr_number" --add-label "autorelease: pending" || true + + git checkout main + echo "✅ Updated PR #$pr_number" + done + + - name: Detect which package was released + id: detect_package + run: | + echo "🔍 Checking if a release PR was just merged..." + + # Get the commit message of the merge + COMMIT_MSG=$(git log -1 --pretty=format:"%s") + echo "Latest commit: $COMMIT_MSG" + + # Check if this is a release PR merge based on the configured pattern "release: @ui5/ {component} v${version}" + # This matches commits like "release: @ui5/ logger v1.2.3" or "release: @ui5/ fs v4.0.3" (note the space after @ui5/) + if [[ "$COMMIT_MSG" =~ ^release:\ @ui5/\ ([a-z-]+)\ v([0-9]+\.[0-9]+\.[0-9]+) ]]; then + PACKAGE_NAME="${BASH_REMATCH[1]}" + PACKAGE_VERSION="${BASH_REMATCH[2]}" + + echo "🎉 Detected release for package: $PACKAGE_NAME@$PACKAGE_VERSION" + echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT + echo "package_version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT + echo "package_path=packages/$PACKAGE_NAME" >> $GITHUB_OUTPUT + echo "is_release=true" >> $GITHUB_OUTPUT + else + echo "â„šī¸ This commit is not a release PR merge" + echo "â„šī¸ Expected format: 'release: @ui5/ v'" + echo "is_release=false" >> $GITHUB_OUTPUT + fi + + publish-package: + runs-on: ubuntu-24.04 + needs: release-please + if: needs.release-please.outputs.package_released == 'true' + steps: + - uses: actions/checkout@v5 + + - name: Node.js LTS + uses: actions/setup-node@v5 + with: + node-version: 24.x + + - name: Verify package directory exists + run: | + PACKAGE_PATH="${{ needs.release-please.outputs.package_path }}" + if [ ! -d "$PACKAGE_PATH" ]; then + echo "❌ Package directory $PACKAGE_PATH does not exist!" + exit 1 + fi + + if [ ! -f "$PACKAGE_PATH/package.json" ]; then + echo "❌ No package.json found in $PACKAGE_PATH!" + exit 1 + fi + + echo "✅ Package directory $PACKAGE_PATH exists and contains package.json" + + - name: Install dependencies + run: | + cd "${{ needs.release-please.outputs.package_path }}" + echo "đŸ“Ļ Installing dependencies for ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" + # TODO: Uncomment the following lines when ready to publish + # npm ci + + - name: Publish to NPM + run: | + cd "${{ needs.release-please.outputs.package_path }}" + echo "🚀 Publishing ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }} to NPM..." + + # TODO: Uncomment the following lines when ready to publish + # npm publish --access public + + echo "✅ Successfully published ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" From c4a80803bccf6b73ce76c718f917f394801401c0 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Tue, 28 Oct 2025 09:58:37 +0200 Subject: [PATCH 2/7] refactor: Update placeholders --- .github/auto-release-chain.yml | 2 +- .github/relase-packages.yml | 2 +- .github/release-please.yml | 14 ++++++-------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/auto-release-chain.yml b/.github/auto-release-chain.yml index d11a7549604..e7fb582bb02 100644 --- a/.github/auto-release-chain.yml +++ b/.github/auto-release-chain.yml @@ -51,4 +51,4 @@ jobs: uses: ./.github/actions/merge-release-pr with: package: ${{ steps.next-pkg.outputs.next_package }} - github-token: ${{ secrets.RELEASE_PLEASE_TOKEN }} \ No newline at end of file + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/relase-packages.yml b/.github/relase-packages.yml index ad87b5158cd..a2cad96c529 100644 --- a/.github/relase-packages.yml +++ b/.github/relase-packages.yml @@ -56,7 +56,7 @@ jobs: uses: ./.github/actions/merge-release-pr with: package: ${{ github.event.inputs.package }} - github-token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Check merge result run: | diff --git a/.github/release-please.yml b/.github/release-please.yml index 4be1e287f1a..49c8474ea33 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -32,14 +32,14 @@ jobs: uses: googleapis/release-please-action@v4 id: release with: - token: ${{ secrets.RELEASE_PLEASE_TOKEN }} # TODO: Change token on prod + token: ${{ secrets.GITHUB_TOKEN }} # This step is mandatory because release-please nor its plugin # node-workspace does not update the manifest automatically. # Also adds missing release tags that node-workspace plugin doesn't create. - name: Update manifest and add tags to release PRs env: - GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # Configure git identity git config user.name "github-actions[bot]" @@ -160,15 +160,13 @@ jobs: run: | cd "${{ needs.release-please.outputs.package_path }}" echo "đŸ“Ļ Installing dependencies for ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" - # TODO: Uncomment the following lines when ready to publish - # npm ci + npm ci - name: Publish to NPM run: | cd "${{ needs.release-please.outputs.package_path }}" echo "🚀 Publishing ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }} to NPM..." - - # TODO: Uncomment the following lines when ready to publish - # npm publish --access public - + + npm publish --access public + echo "✅ Successfully published ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" From b0f6de994491c9dacb3726fc566bb675b024568d Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Tue, 28 Oct 2025 10:02:11 +0200 Subject: [PATCH 3/7] feat: Introduce release-please-manifest.json --- .github/.release-please-manifest.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/.release-please-manifest.json diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json new file mode 100644 index 00000000000..8c7ff6c7518 --- /dev/null +++ b/.github/.release-please-manifest.json @@ -0,0 +1,8 @@ +{ + "packages/logger": "4.0.2", + "packages/fs": "4.0.2", + "packages/builder": "4.0.11", + "packages/server": "4.0.7", + "packages/project": "4.0.6", + "packages/cli": "4.0.26" +} From 1d538cff84d841e4dce23b4e6fd1ff28e3610a70 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Tue, 28 Oct 2025 14:02:57 +0200 Subject: [PATCH 4/7] fix: License --- packages/logger/LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/logger/LICENSE.txt b/packages/logger/LICENSE.txt index 261eeb9e9f8..769b9d4326b 100644 --- a/packages/logger/LICENSE.txt +++ b/packages/logger/LICENSE.txt @@ -5,7 +5,7 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. From 336eec35333a371674e5ec48518af96cdd8c86e8 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 30 Oct 2025 10:34:40 +0200 Subject: [PATCH 5/7] refactor: Update release-please workflow --- .github/actions/merge-release-pr/action.yml | 38 ++-- .github/auto-release-chain.yml | 54 ------ .github/relase-packages.yml | 67 ------- .github/release-please.yml | 172 ------------------ .github/workflows/auto-release-chain.yml | 184 ++++++++++++++++++++ .github/workflows/relase-packages.yml | 69 ++++++++ .github/workflows/release-please.yml | 66 +++++++ 7 files changed, 340 insertions(+), 310 deletions(-) delete mode 100644 .github/auto-release-chain.yml delete mode 100644 .github/relase-packages.yml delete mode 100644 .github/release-please.yml create mode 100644 .github/workflows/auto-release-chain.yml create mode 100644 .github/workflows/relase-packages.yml create mode 100644 .github/workflows/release-please.yml diff --git a/.github/actions/merge-release-pr/action.yml b/.github/actions/merge-release-pr/action.yml index 8e10cc0db5b..cabb94998b6 100644 --- a/.github/actions/merge-release-pr/action.yml +++ b/.github/actions/merge-release-pr/action.yml @@ -1,24 +1,26 @@ name: 'Merge Release PR' -description: 'Find and merge a release PR for a specific package' +description: 'Merges a release PR for a specific package' + inputs: package: - description: 'Package name to find and merge PR for' + description: 'Package name to merge release PR for' required: true github-token: - description: 'GitHub token for API access' + description: 'GitHub token for authentication' required: true + outputs: - pr-number: - description: 'PR number that was merged' - value: ${{ steps.merge.outputs.pr-number }} - merged: - description: 'Whether a PR was found and merged' - value: ${{ steps.merge.outputs.merged }} + pr_merged: + description: 'Whether the PR was successfully merged' + value: ${{ steps.merge.outputs.pr_merged }} + pr_number: + description: 'The PR number that was merged' + value: ${{ steps.merge.outputs.pr_number }} runs: using: 'composite' steps: - - name: Find and merge release PR + - name: Merge release PR id: merge shell: bash env: @@ -27,19 +29,21 @@ runs: PACKAGE="${{ inputs.package }}" echo "🔍 Looking for release PR for: $PACKAGE" - # Find release PR - PR_NUMBER=$(gh pr list --state open --json number,title | jq -r '.[] | select(.title | startswith("release: @ui5/ '$PACKAGE' v")) | .number' | head -n1) + # Find the release PR for this package + PR_NUMBER=$(gh pr list --state open --json number,title | jq -r ".[] | select(.title | contains(\"release: @ui5/ $PACKAGE\")) | .number") if [[ -n "$PR_NUMBER" ]]; then echo "✅ Found PR #$PR_NUMBER for $PACKAGE" echo "🔄 Merging..." - gh pr merge $PR_NUMBER --squash --admin + # Merge the PR + gh pr merge $PR_NUMBER --squash echo "✅ Merged PR #$PR_NUMBER for $PACKAGE" - echo "pr-number=$PR_NUMBER" >> $GITHUB_OUTPUT - echo "merged=true" >> $GITHUB_OUTPUT + echo "pr_merged=true" >> $GITHUB_OUTPUT + echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT else - echo "❌ No release PR found for $PACKAGE" - echo "merged=false" >> $GITHUB_OUTPUT + echo "❌ No open release PR found for $PACKAGE" + echo "pr_merged=false" >> $GITHUB_OUTPUT + echo "pr_number=" >> $GITHUB_OUTPUT fi \ No newline at end of file diff --git a/.github/auto-release-chain.yml b/.github/auto-release-chain.yml deleted file mode 100644 index e7fb582bb02..00000000000 --- a/.github/auto-release-chain.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: auto-release-chain - -on: - workflow_run: - workflows: ["release-please"] - types: [completed] - branches: [main] - -permissions: - contents: write - pull-requests: write - -jobs: - continue-chain: - runs-on: ubuntu-24.04 - if: github.event.workflow_run.conclusion == 'success' - steps: - - uses: actions/checkout@v5 - - - name: Find next package - id: next-pkg - run: | - ALL_PACKAGES=("logger" "fs" "builder" "server" "project" "cli") - - # Find what was just released - RELEASED_PKG="" - if git log -1 --pretty=format:"%s" | grep -q "^release: @ui5/"; then - RELEASED_PKG=$(git log -1 --pretty=format:"%s" | sed -n 's/^release: @ui5\/ \([a-z-]*\) v.*/\1/p') - echo "đŸ“Ļ Detected release: $RELEASED_PKG" - else - echo "â„šī¸ No release detected" - exit 0 - fi - - # Find next package - for i in "${!ALL_PACKAGES[@]}"; do - if [[ "${ALL_PACKAGES[$i]}" == "$RELEASED_PKG" ]] && [[ $((i+1)) -lt ${#ALL_PACKAGES[@]} ]]; then - NEXT_PKG="${ALL_PACKAGES[$((i+1))]}" - echo "đŸŽ¯ Next package: $NEXT_PKG" - echo "next_package=$NEXT_PKG" >> $GITHUB_OUTPUT - echo "has_next=true" >> $GITHUB_OUTPUT - exit 0 - fi - done - - echo "īŋŊ Chain complete" - echo "has_next=false" >> $GITHUB_OUTPUT - - - name: Merge next PR - if: steps.next-pkg.outputs.has_next == 'true' - uses: ./.github/actions/merge-release-pr - with: - package: ${{ steps.next-pkg.outputs.next_package }} - github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/relase-packages.yml b/.github/relase-packages.yml deleted file mode 100644 index a2cad96c529..00000000000 --- a/.github/relase-packages.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: release-packages - -on: - # Manually trigger the release chain starting from a specific package - workflow_dispatch: - inputs: - package: - description: "🚀 Start AUTOMATIC release chain from this package (will auto-release this and all packages after it)" - required: true - type: choice - options: - - logger - - fs - - builder - - server - - project - - cli - default: logger - -permissions: - contents: write - pull-requests: write - actions: write - -jobs: - start-release-chain: - runs-on: ubuntu-24.04 - outputs: - started_package: ${{ steps.start_chain.outputs.started_package }} - chain_length: ${{ steps.start_chain.outputs.chain_length }} - steps: - - uses: actions/checkout@v5 - - - name: Start release chain - id: start_chain - run: | - ALL_PACKAGES=("logger" "fs" "builder" "server" "project" "cli") - SELECTED_PKG="${{ github.event.inputs.package }}" - - echo "🚀 Starting release chain from: $SELECTED_PKG" - - # Find position and show chain - for i in "${!ALL_PACKAGES[@]}"; do - [[ "${ALL_PACKAGES[$i]}" == "$SELECTED_PKG" ]] && START_IDX=$i && break - done - - [[ -z "$START_IDX" ]] && echo "❌ Package not found" && exit 1 - - CHAIN_LENGTH=$((${#ALL_PACKAGES[@]} - START_IDX)) - echo "đŸ“Ļ Will release $CHAIN_LENGTH packages: ${ALL_PACKAGES[@]:$START_IDX}" - echo "started_package=$SELECTED_PKG" >> $GITHUB_OUTPUT - echo "chain_length=$CHAIN_LENGTH" >> $GITHUB_OUTPUT - - - name: Merge first PR - id: merge-pr - uses: ./.github/actions/merge-release-pr - with: - package: ${{ github.event.inputs.package }} - github-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Check merge result - run: | - if [[ "${{ steps.merge-pr.outputs.merged }}" != "true" ]]; then - echo "❌ Failed to start chain - no PR found" - exit 1 - fi - echo "✅ Chain started successfully!" diff --git a/.github/release-please.yml b/.github/release-please.yml deleted file mode 100644 index 49c8474ea33..00000000000 --- a/.github/release-please.yml +++ /dev/null @@ -1,172 +0,0 @@ -name: release-please - -on: - push: - # Detects when a release PR is merged and publishes the package - branches: - - main - -permissions: - contents: write - pull-requests: write - -jobs: - release-please: - runs-on: ubuntu-24.04 - outputs: - releases_created: ${{ steps.release.outputs.releases_created }} - prs_created: ${{ steps.release.outputs.prs_created }} - package_released: ${{ steps.detect_package.outputs.is_release }} - package_name: ${{ steps.detect_package.outputs.package_name }} - package_version: ${{ steps.detect_package.outputs.package_version }} - package_path: ${{ steps.detect_package.outputs.package_path }} - steps: - - uses: actions/checkout@v5 - - - name: Node.js LTS - uses: actions/setup-node@v5 - with: - node-version: 24.x - - - name: Run Release Please to update PRs and create releases - uses: googleapis/release-please-action@v4 - id: release - with: - token: ${{ secrets.GITHUB_TOKEN }} - - # This step is mandatory because release-please nor its plugin - # node-workspace does not update the manifest automatically. - # Also adds missing release tags that node-workspace plugin doesn't create. - - name: Update manifest and add tags to release PRs - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Configure git identity - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Create label if needed - gh label create "autorelease: pending" --description "Release PR pending merge" --color "fbca04" || true - - # Process each release PR - for pr_info in $(gh pr list --state open --json number,headRefName,title | jq -r '.[] | select(.title | startswith("release: @ui5/")) | "\(.number):\(.headRefName)"'); do - pr_number=$(echo "$pr_info" | cut -d: -f1) - branch_name=$(echo "$pr_info" | cut -d: -f2) - - echo "đŸ“Ļ Processing PR #$pr_number" - - # Extract package name - pkg_name=$(echo "$branch_name" | sed -n 's/.*release-please--branches--main--components--\([^-]*\).*/\1/p') - - if [ -z "$pkg_name" ]; then - echo "âš ī¸ Could not determine package from branch: $branch_name" - continue - fi - - # Update manifest in PR branch - git fetch origin main - git fetch origin "$branch_name" && git checkout "$branch_name" - - # Clean any uncommitted changes before starting - git reset --hard HEAD - git clean -fd - - # FIRST: Read the current package version that release-please set - current_version=$(jq -r --arg p "packages/$pkg_name" '.[$p]' .release-please-manifest.json) - echo "đŸ“Ļ Found release-please version for $pkg_name: $current_version" - - # THEN: Sync with main's manifest structure - echo "⚡ Syncing manifest with main..." - git checkout origin/main -- .release-please-manifest.json - echo "⚡ Sync complete." - - # FINALLY: Restore the release-please version for this package - jq --arg p "packages/$pkg_name" --arg v "$current_version" '.[$p] = $v' .release-please-manifest.json > tmp.json && mv tmp.json .release-please-manifest.json - - echo "đŸ“Ļ Updated manifest for $pkg_name to version $current_version" - cat .release-please-manifest.json - - # Commit and push the changes - git add .release-please-manifest.json - if git diff --staged --quiet; then - echo "â„šī¸ No changes to manifest file" - else - git commit -m "fix: Sync .release-please-manifest.json" - git push origin "$branch_name" --force - echo "✅ Committed manifest changes" - fi - - # Add label - gh pr edit "$pr_number" --add-label "autorelease: pending" || true - - git checkout main - echo "✅ Updated PR #$pr_number" - done - - - name: Detect which package was released - id: detect_package - run: | - echo "🔍 Checking if a release PR was just merged..." - - # Get the commit message of the merge - COMMIT_MSG=$(git log -1 --pretty=format:"%s") - echo "Latest commit: $COMMIT_MSG" - - # Check if this is a release PR merge based on the configured pattern "release: @ui5/ {component} v${version}" - # This matches commits like "release: @ui5/ logger v1.2.3" or "release: @ui5/ fs v4.0.3" (note the space after @ui5/) - if [[ "$COMMIT_MSG" =~ ^release:\ @ui5/\ ([a-z-]+)\ v([0-9]+\.[0-9]+\.[0-9]+) ]]; then - PACKAGE_NAME="${BASH_REMATCH[1]}" - PACKAGE_VERSION="${BASH_REMATCH[2]}" - - echo "🎉 Detected release for package: $PACKAGE_NAME@$PACKAGE_VERSION" - echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT - echo "package_version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT - echo "package_path=packages/$PACKAGE_NAME" >> $GITHUB_OUTPUT - echo "is_release=true" >> $GITHUB_OUTPUT - else - echo "â„šī¸ This commit is not a release PR merge" - echo "â„šī¸ Expected format: 'release: @ui5/ v'" - echo "is_release=false" >> $GITHUB_OUTPUT - fi - - publish-package: - runs-on: ubuntu-24.04 - needs: release-please - if: needs.release-please.outputs.package_released == 'true' - steps: - - uses: actions/checkout@v5 - - - name: Node.js LTS - uses: actions/setup-node@v5 - with: - node-version: 24.x - - - name: Verify package directory exists - run: | - PACKAGE_PATH="${{ needs.release-please.outputs.package_path }}" - if [ ! -d "$PACKAGE_PATH" ]; then - echo "❌ Package directory $PACKAGE_PATH does not exist!" - exit 1 - fi - - if [ ! -f "$PACKAGE_PATH/package.json" ]; then - echo "❌ No package.json found in $PACKAGE_PATH!" - exit 1 - fi - - echo "✅ Package directory $PACKAGE_PATH exists and contains package.json" - - - name: Install dependencies - run: | - cd "${{ needs.release-please.outputs.package_path }}" - echo "đŸ“Ļ Installing dependencies for ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" - npm ci - - - name: Publish to NPM - run: | - cd "${{ needs.release-please.outputs.package_path }}" - echo "🚀 Publishing ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }} to NPM..." - - npm publish --access public - - echo "✅ Successfully published ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" diff --git a/.github/workflows/auto-release-chain.yml b/.github/workflows/auto-release-chain.yml new file mode 100644 index 00000000000..b430d4b6275 --- /dev/null +++ b/.github/workflows/auto-release-chain.yml @@ -0,0 +1,184 @@ +name: auto-release-chain + +on: + workflow_run: + workflows: ["release-please"] + types: [completed] + branches: [main] + +permissions: + contents: write + pull-requests: write + +jobs: + continue-chain: + runs-on: ubuntu-24.04 + if: github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' + + # Job-level outputs for reuse across steps + outputs: + all_packages: ${{ steps.setup.outputs.all_packages }} + released_package: ${{ steps.detect-release.outputs.released_package }} + has_release: ${{ steps.detect-release.outputs.has_release }} + next_package: ${{ steps.find-next.outputs.next_package }} + has_next: ${{ steps.find-next.outputs.has_next }} + has_changes: ${{ steps.update-deps.outputs.has_changes }} + is_chain_mode: ${{ steps.detect-release.outputs.is_chain_mode }} + + # Environment variables for reuse + env: + GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} + NODE_VERSION: 24.x + REGISTRY_URL: https://registry.npmjs.org/ + GIT_USER_NAME: "github-actions[bot]" + GIT_USER_EMAIL: "github-actions[bot]@users.noreply.github.com" + + steps: + - uses: actions/checkout@v5 + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + fetch-depth: 0 + + - name: Detect released package and mode + id: detect-release + run: | + # Detect released package from commit + if git log -1 --pretty=format:"%s" | grep -q "^release: @ui5/"; then + RELEASED_PKG=$(git log -1 --pretty=format:"%s" | sed -n 's/^release: @ui5\/ \([a-z-]*\) v.*/\1/p') + echo "đŸ“Ļ Detected release: $RELEASED_PKG" + echo "released_package=$RELEASED_PKG" >> $GITHUB_OUTPUT + echo "has_release=true" >> $GITHUB_OUTPUT + else + echo "â„šī¸ No release detected" + echo "has_release=false" >> $GITHUB_OUTPUT + exit 0 + fi + + # Check if chain mode is active + CHAIN_MODE=$(gh variable get CHAIN_MODE 2>/dev/null || echo "false") + echo "is_chain_mode=$CHAIN_MODE" >> $GITHUB_OUTPUT + echo "🔗 Chain mode: $CHAIN_MODE" + env: + GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Setup Node.js + if: steps.detect-release.outputs.has_release == 'true' + uses: actions/setup-node@v5 + with: + node-version: ${{ env.NODE_VERSION }} + registry-url: ${{ env.REGISTRY_URL }} + + - name: Setup git and packages array + if: steps.detect-release.outputs.has_release == 'true' + id: setup + run: | + git config user.name "${{ env.GIT_USER_NAME }}" + git config user.email "${{ env.GIT_USER_EMAIL }}" + + # Define packages array for reuse + ALL_PACKAGES="logger fs builder server project cli" + echo "all_packages=$ALL_PACKAGES" >> $GITHUB_OUTPUT + echo "đŸ“Ļ Package chain: $ALL_PACKAGES" + + - name: Find next package in chain + id: find-next + if: steps.detect-release.outputs.has_release == 'true' + run: | + ALL_PACKAGES_ARRAY=(${{ steps.setup.outputs.all_packages }}) + RELEASED_PKG="${{ steps.detect-release.outputs.released_package }}" + IS_CHAIN_MODE="${{ steps.detect-release.outputs.is_chain_mode }}" + + echo "🔍 Looking for next package after: $RELEASED_PKG (Chain mode: $IS_CHAIN_MODE)" + + if [[ "$IS_CHAIN_MODE" == "true" ]]; then + # CHAIN MODE: Find next package in sequence + NEXT_PKG="" + for i in "${!ALL_PACKAGES_ARRAY[@]}"; do + if [[ "${ALL_PACKAGES_ARRAY[$i]}" == "$RELEASED_PKG" ]] && [[ $((i+1)) -lt ${#ALL_PACKAGES_ARRAY[@]} ]]; then + NEXT_PKG="${ALL_PACKAGES_ARRAY[$((i+1))]}" + break + fi + done + + # If no next package and not CLI, fallback to CLI + if [[ -z "$NEXT_PKG" && "$RELEASED_PKG" != "cli" ]]; then + NEXT_PKG="cli" + fi + + # If we just processed CLI, clear the chain mode + if [[ "$RELEASED_PKG" == "cli" ]]; then + echo "🎉 Chain complete - clearing chain mode" + gh variable delete CHAIN_MODE 2>/dev/null || true + gh variable delete CHAIN_START_PACKAGE 2>/dev/null || true + fi + else + # MANUAL MODE: Only release CLI if not CLI itself + if [[ "$RELEASED_PKG" != "cli" ]]; then + NEXT_PKG="cli" + fi + fi + + # Set outputs + if [[ -n "$NEXT_PKG" ]]; then + echo "đŸŽ¯ Found next package: $NEXT_PKG" + echo "next_package=$NEXT_PKG" >> $GITHUB_OUTPUT + echo "has_next=true" >> $GITHUB_OUTPUT + else + echo "🏁 No next package found" + echo "has_next=false" >> $GITHUB_OUTPUT + fi + env: + GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Update dependencies in next package + id: update-deps + if: steps.find-next.outputs.has_next == 'true' + run: | + NEXT_PKG="${{ steps.find-next.outputs.next_package }}" + RELEASED_PKG="${{ steps.detect-release.outputs.released_package }}" + + # Install npm-check-updates + npm install -g npm-check-updates + + echo "🔄 Processing package: $NEXT_PKG" + cd "packages/$NEXT_PKG" + + echo "đŸ“Ļ Updating @ui5/* dependencies to latest minor/patch versions (respecting major)" + + # Update @ui5/* packages respecting major version boundaries + ncu -u --filter "@ui5/*" --target minor --dep dev,prod,peer,optional + + # Check if there were actual changes + if git diff --quiet package.json; then + echo "â„šī¸ No dependency updates needed for $NEXT_PKG" + echo "has_changes=false" >> $GITHUB_OUTPUT + else + echo "✅ Dependencies updated for $NEXT_PKG" + echo "has_changes=true" >> $GITHUB_OUTPUT + fi + + - name: Commit dependency updates + if: steps.update-deps.outputs.has_changes == 'true' + run: | + NEXT_PKG="${{ steps.find-next.outputs.next_package }}" + + git add "packages/$NEXT_PKG/" + git commit -m "deps($NEXT_PKG): Update @ui5 dependencies to latest versions" + git push origin main + + echo "✅ Committed dependency updates for $NEXT_PKG" + + - name: Trigger release-please for updated package + if: steps.update-deps.outputs.has_changes == 'true' + uses: googleapis/release-please-action@v4 + id: trigger-release + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Merge release PR + if: steps.update-deps.outputs.has_changes == 'true' + id: merge-pr + uses: ./.github/actions/merge-release-pr + with: + package: ${{ steps.find-next.outputs.next_package }} + github-token: ${{ secrets.RELEASE_PLEASE_TOKEN }} diff --git a/.github/workflows/relase-packages.yml b/.github/workflows/relase-packages.yml new file mode 100644 index 00000000000..d87a3fbe87a --- /dev/null +++ b/.github/workflows/relase-packages.yml @@ -0,0 +1,69 @@ +name: release-packages + +on: + # Manually trigger the release chain starting from a specific package + workflow_dispatch: + inputs: + package: + description: "🚀 Start AUTOMATIC release chain from this package" + required: true + type: choice + options: + - logger + - fs + - builder + - server + - project + - cli + default: logger + +permissions: + contents: write + pull-requests: write + actions: write + +jobs: + start-release-chain: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v5 + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Setup git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Merge first PR to start chain + id: merge-pr + uses: ./.github/actions/merge-release-pr + with: + package: ${{ github.event.inputs.package }} + github-token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Trigger auto-release-chain with chain mode + if: steps.merge-pr.outputs.pr_merged == 'true' + run: | + SELECTED_PKG="${{ github.event.inputs.package }}" + echo "🚀 Setting chain mode flag for release chain starting from: $SELECTED_PKG" + + # Set repository variable to indicate chain mode is active + gh variable set CHAIN_MODE --body "true" + gh variable set CHAIN_START_PACKAGE --body "$SELECTED_PKG" + + echo "✅ Chain mode activated" + env: + GH_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Check result + run: | + if [[ "${{ steps.merge-pr.outputs.pr_merged }}" == "true" ]]; then + echo "🎉 Release chain started successfully!" + echo "📋 Started from package: ${{ github.event.inputs.package }}" + echo "🔗 Chain mode activated" + else + echo "❌ Failed to start release chain" + echo "📋 No PR found for package: ${{ github.event.inputs.package }}" + exit 1 + fi diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000000..7b18939f38a --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,66 @@ +name: release-please + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-24.04 + outputs: + package_released: ${{ steps.detect_package.outputs.is_release }} + package_name: ${{ steps.detect_package.outputs.package_name }} + package_version: ${{ steps.detect_package.outputs.package_version }} + package_path: ${{ steps.detect_package.outputs.package_path }} + steps: + - uses: actions/checkout@v5 + + - name: Node.js LTS + uses: actions/setup-node@v5 + with: + node-version: 24.x + + - name: Run Release Please to update PRs and create releases + uses: googleapis/release-please-action@v4 + id: release + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + + - name: Detect which package was released + id: detect_package + run: | + COMMIT_MSG=$(git log -1 --pretty=format:"%s") + if [[ "$COMMIT_MSG" =~ ^release:\ @ui5/\ ([a-z-]+)\ v([0-9]+\.[0-9]+\.[0-9]+) ]]; then + echo "package_name=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT + echo "package_version=${BASH_REMATCH[2]}" >> $GITHUB_OUTPUT + echo "package_path=packages/${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT + echo "is_release=true" >> $GITHUB_OUTPUT + else + echo "is_release=false" >> $GITHUB_OUTPUT + fi + + publish-package: + runs-on: ubuntu-24.04 + needs: release-please + if: needs.release-please.outputs.package_released == 'true' + steps: + - uses: actions/checkout@v5 + + - name: Node.js LTS + uses: actions/setup-node@v5 + with: + node-version: 24.x + + - name: Install and publish package + run: | + cd "${{ needs.release-please.outputs.package_path }}" + echo "🚀 Publishing ${{ needs.release-please.outputs.package_name }}@${{ needs.release-please.outputs.package_version }}" + + # TODO: Uncomment when ready to publish + # npm ci + # npm publish --access public From 3113d05d0e4ec40a68634aa3c73f0bfc9a40ad8c Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 30 Oct 2025 10:36:09 +0200 Subject: [PATCH 6/7] fix: Logger License whitespaces --- packages/logger/LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/logger/LICENSE.txt b/packages/logger/LICENSE.txt index 769b9d4326b..261eeb9e9f8 100644 --- a/packages/logger/LICENSE.txt +++ b/packages/logger/LICENSE.txt @@ -5,7 +5,7 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. From 6427c3fca2bf3358b63af55a72a59586a6a4840c Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 13 Nov 2025 14:12:05 +0200 Subject: [PATCH 7/7] fix: CI Pipeline --- .github/workflows/github-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/github-ci.yml b/.github/workflows/github-ci.yml index 2917bc42480..c88b1294cfd 100644 --- a/.github/workflows/github-ci.yml +++ b/.github/workflows/github-ci.yml @@ -40,10 +40,12 @@ jobs: run: npm run coverage - name: Generate JSDoc documentation + working-directory: internal/documentation run: npm run jsdoc-generate - name: Generate merged JSON schema run: npm run schema-generate - name: Generate CLI documentation + working-directory: internal/documentation run: npm run generate-cli-doc