stefanvodita commented on code in PR #14738:
URL: https://github.com/apache/lucene/pull/14738#discussion_r2895351702


##########
.github/workflows/backport.sh:
##########
@@ -0,0 +1,229 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+echo "📊 Fetching PR data..."
+PR_DATA=$(gh pr view "$PR_NUMBER" --json labels,milestone,title)
+PR_LABELS=$(echo "$PR_DATA" | jq -r '.labels[].name | 
select(test("^backport/"; "i"))')
+PR_MILESTONE=$(echo "$PR_DATA" | jq -r '.milestone.title // ""')
+PR_TITLE=$(echo "$PR_DATA" | jq -r '.title // "Unknown title"')
+PR_MERGE_COMMIT_SHA="${PR_MERGE_COMMIT_SHA:-unknown}"
+DRY_RUN="${BACKPORT_DRY_RUN:-true}"
+
+normalize_version() {
+  local raw="$1"
+  local trimmed
+  local normalized=""
+  trimmed=$(echo "$raw" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')
+  if [[ $trimmed =~ ([0-9]+(\.[0-9]+)*) ]]; then
+    normalized="${BASH_REMATCH[1]}"
+  fi
+  echo "$normalized"
+}
+
+is_valid_sha() {
+  local sha="$1"
+  [[ "$sha" =~ ^[0-9a-f]{7,40}$ ]]
+}
+
+create_comment() {
+  if [ "$DRY_RUN" = "true" ]; then
+    echo "[dry-run] Would comment on PR #$PR_NUMBER:"
+    echo "$1"
+    return 0
+  fi
+  gh pr comment "$PR_NUMBER" --body "$1"
+}
+
+add_label() {
+  if [ "$DRY_RUN" = "true" ]; then
+    echo "[dry-run] Would add label '$1' on PR #$PR_NUMBER"
+    return 0
+  fi
+  gh pr edit "$PR_NUMBER" --add-label "$1" 2>/dev/null || true
+}
+
+publish_outputs() {
+  local has_targets="$1"
+  local targets_json="$2"
+
+  if [ -n "${GITHUB_OUTPUT:-}" ]; then
+    {
+      echo "dry_run=$DRY_RUN"
+      echo "has_targets=$has_targets"
+      echo "targets<<EOF"
+      echo "$targets_json"
+      echo "EOF"
+    } >> "$GITHUB_OUTPUT"
+  fi
+}
+
+if [ -z "$PR_LABELS" ] && [ -z "$PR_MILESTONE" ]; then
+  echo "â„šī¸ No backport labels or milestone found. Nothing to do."
+  publish_outputs "false" "[]"
+  exit 0
+fi
+
+if [ "$DRY_RUN" != "true" ] && ! is_valid_sha "$PR_MERGE_COMMIT_SHA"; then
+  create_comment "❌ **Automatic backports skipped**
+
+Invalid merge commit SHA was provided by workflow context: 
\`$PR_MERGE_COMMIT_SHA\`.
+
+Backports are skipped for safety."
+  add_label "backport-failed"
+  publish_outputs "false" "[]"
+  exit 0
+fi
+
+echo "đŸˇī¸ Ensuring backport labels exist..."
+if [ "$DRY_RUN" = "true" ]; then
+  echo "[dry-run] Skipping label creation"
+else
+  gh label create "backport" --description "Automated backport workflow" 
--color "0366d6" 2>/dev/null || true
+  gh label create "backport-failed" --description "Backport failed" --color 
"d73a49" 2>/dev/null || true
+fi
+
+echo "đŸŒŋ Caching branch information..."
+ALL_BRANCHES=$(git for-each-ref --format='%(refname:strip=3)' 
refs/remotes/origin | grep -v '^HEAD$' | sort)
+declare -ra TARGET_BRANCH_TEMPLATES=(

Review Comment:
   Are these all relevant for Lucene?



##########
.github/workflows/backport.yml:
##########
@@ -0,0 +1,106 @@
+name: Backport PR
+
+on:
+  pull_request:
+    types: [closed]
+
+permissions: {}
+
+jobs:
+  prepare:
+    name: Prepare Backport Targets
+    if: github.event.pull_request.merged == true
+    timeout-minutes: 15
+    runs-on: ubuntu-latest
+    permissions:
+      contents: read # Reads repository workflow script and remote branch refs.
+      pull-requests: write # Adds comments/labels to the source pull request.
+    outputs:
+      dry_run: ${{ steps.plan.outputs.dry_run }}
+      has_targets: ${{ steps.plan.outputs.has_targets }}
+      targets: ${{ steps.plan.outputs.targets }}
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 
v6.0.2
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GITHUB_TOKEN }}
+          persist-credentials: false
+
+      - name: Plan backports
+        id: plan
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          PR_NUMBER: ${{ github.event.pull_request.number }}
+          PR_MERGE_COMMIT_SHA: ${{ github.event.pull_request.merge_commit_sha 
}}
+          BACKPORT_DRY_RUN: ${{ vars.BACKPORT_DRY_RUN || 'true' }}
+        run: ./.github/workflows/backport.sh
+
+  backport:
+    name: Create Backport Pull Requests
+    needs: prepare
+    if: needs.prepare.outputs.has_targets == 'true' && 
needs.prepare.outputs.dry_run != 'true'
+    timeout-minutes: 30
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write # Pushes generated backport branches.
+      pull-requests: write # Creates backport pull requests and comments on 
failures.
+    strategy:
+      fail-fast: false
+      matrix:
+        include: ${{ fromJSON(needs.prepare.outputs.targets) }}
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 
v6.0.2
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GITHUB_TOKEN }}
+          persist-credentials: false
+
+      - name: Cherry-pick with approved action
+        id: cherry_pick
+        continue-on-error: true
+        uses: 
carloscastrojumo/github-cherry-pick-action@503773289f4a459069c832dc628826685b75b4b3
 # v1.0.10
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
+          branch: ${{ matrix.target }}
+          cherry-pick-branch: backport-${{ github.event.pull_request.number 
}}-to-${{ matrix.target }}
+          title: '[Backport ${{ matrix.target }}] {old_title}'
+          body: |
+            ## 🔄 Automatic Backport
+
+            Backport of #{old_pull_request_id} to `${{ matrix.target }}`.
+
+            **Target:** `${{ matrix.target }}`
+            **Version:** `${{ matrix.version }}`
+          labels: |
+            backport
+          inherit_labels: 'false'
+
+      - name: Handle failed action backport
+        if: steps.cherry_pick.outcome != 'success'
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          PR_NUMBER: ${{ github.event.pull_request.number }}
+          TARGET_BRANCH: ${{ matrix.target }}
+        run: |
+          body="❌ **Backport to \`${TARGET_BRANCH}\` 
failed**"$'\n\n'"Automatic cherry-pick action failed for this target. Please 
inspect workflow logs and backport manually if needed."
+          gh pr comment "$PR_NUMBER" --body "$body"

Review Comment:
   I see we've added a dry run option. Is this a place where we could take 
actions on the PR even when dry run is enabled?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to