This is an automated email from the ASF dual-hosted git repository.

pkarwasz pushed a commit to branch feat/dependabot-add-changelog2
in repository https://gitbox.apache.org/repos/asf/logging-parent.git

commit 57f5ae9cfd4bf9961b8e487b593464be14f2ed37
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Mon Jun 16 14:39:57 2025 +0200

    feat: add `process-dependabot-reusable` workflow (Bash-based alternative)
    
    This PR introduces a **reusable GitHub Actions workflow**, 
`process-dependabot-reusable`, designed to streamline the handling of 
Dependabot pull requests across repositories — implemented entirely with 
**shell scripts**.
    
    This serves as a Bash-based alternative to #418, which uses TypeScript.
    
    ### 🔄 Key Differences from #418
    
    * **Trigger**: Runs on `pull_request_target` (not `push`), which is 
required by the `dependabot/fetch-metadata` action.
    * **Implementation**: Written using **standard POSIX tools** with a few 
dependencies:
    
      * **`bash`** – some Bash-specific constructs are used
      * **`jq`** – for processing JSON output from `dependabot/fetch-metadata`
      * **`xmlstarlet`** – for parsing `pom.xml` and generating a changelog XML 
file
      * **`git`** – to commit and push any changes
      * **`gh`** – to enable "auto-merge" on the pull request
    
    This approach avoids the Node.js/TypeScript toolchain and relies only on 
standard CLI tools commonly available in CI environments.
---
 .github/workflows/merge-dependabot.yaml            |  42 ------
 .github/workflows/process-dependabot-reusable.yaml | 150 +++++++++++++++++++++
 src/changelog/.12.x.x/add-deploy-profile.xml       |  10 ++
 .../modules/ROOT/examples/process-dependabot.yaml  |  45 +++++++
 src/site/antora/modules/ROOT/pages/workflows.adoc  |  15 ++-
 5 files changed, 217 insertions(+), 45 deletions(-)

diff --git a/.github/workflows/merge-dependabot.yaml 
b/.github/workflows/merge-dependabot.yaml
deleted file mode 100644
index 2d611cc..0000000
--- a/.github/workflows/merge-dependabot.yaml
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to you under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-name: merge-dependabot
-
-on:
-  pull_request_target:
-    paths-ignore:
-      - "**.adoc"
-      - "**.md"
-      - "**.txt"
-
-permissions: read-all
-
-jobs:
-
-  build:
-    if: github.repository == 'apache/logging-parent' && github.event_name == 
'pull_request_target' && github.actor == 'dependabot[bot]'
-    uses: ./.github/workflows/build-reusable.yaml
-
-  merge-dependabot:
-    needs: build
-    uses: ./.github/workflows/merge-dependabot-reusable.yaml
-    permissions:
-      contents: write                                             # to push 
changelog commits
-      pull-requests: write                                        # to close 
the PR
-    secrets:
-      GPG_SECRET_KEY: ${{ secrets.LOGGING_GPG_SECRET_KEY }}       # to sign 
commits
diff --git a/.github/workflows/process-dependabot-reusable.yaml 
b/.github/workflows/process-dependabot-reusable.yaml
new file mode 100644
index 0000000..8214640
--- /dev/null
+++ b/.github/workflows/process-dependabot-reusable.yaml
@@ -0,0 +1,150 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+name: Dependabot Process PR
+
+on:
+  workflow_call:
+    inputs:
+      user_name:
+        description: The name of the user to use for the commit
+        default: 'ASF Logging Services RM'
+        type: string
+      user_email:
+        description: The email of the user to use for the commit
+        default: '[email protected]'
+        type: string
+      ref:
+        description: The branch, tag or SHA to checkout
+        default: ${{ github.ref }}
+        type: string
+    secrets:
+      AUTO_MERGE_TOKEN:
+        description: GitHub token to enable auto-merge on PR
+        required: true
+      CONTENT_WRITE_TOKEN:
+        description: GitHub token to push changes
+        required: true
+      GPG_PASSPHRASE:
+        description: GPG passphrase for signing commits
+        required: false
+      GPG_PRIVATE_KEY:
+        description: GPG secret key for signing commits
+        required: true
+
+jobs:
+
+  generate-changelog:
+    # Skip this workflow on commits not pushed by Dependabot
+    if: ${{ github.actor == 'dependabot[bot]' }}
+    runs-on: ubuntu-latest
+
+    steps:
+
+      - name: Fetch Dependabot metadata
+        id: dependabot
+        uses: 
dependabot/fetch-metadata@08eff52bf64351f401fb50d4972fa95b9f2c2d1b # 2.4.0
+        with:
+          github-token: ${{ github.token }}
+
+      - name: Check out repository
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
+        with:
+          ref: ${{ inputs.ref }}
+          token: ${{ secrets.CONTENT_WRITE_TOKEN }}
+
+      #
+      - name: Find the release version major
+        shell: bash
+        run: |
+          revision=$(
+            xmlstarlet sel \
+            -N m=http://maven.apache.org/POM/4.0.0 \
+            --template --value-of /m:project/m:properties/m:revision \
+            pom.xml
+          )
+          if [[ ! $revision =~ ^[0-9]+\.[0-9]+\.[0-9]+(-SNAPSHOT)?$ ]]; then
+            echo "Invalid version format: $version"
+          exit 1
+          fi
+          parts=(${revision//./ })
+          echo "RELEASE_VERSION_MAJOR=${parts[0]}" >> $GITHUB_ENV
+
+      - name: Create changelog entries
+        shell: bash
+        env:
+          PR_ID: ${{ github.event.pull_request.number }}
+          PR_URL: ${{ github.event.pull_request.html_url }}
+          RELEASE_VERSION_MAJOR: ${{ env.RELEASE_VERSION_MAJOR }}
+          UPDATED_DEPENDENCIES: ${{ 
steps.dependabot.outputs.updated-dependencies-json }}
+        run: |
+          function generate_changelog_entry() {
+            local dependency="$1"
+            local dependency_name=$(echo "$dependency" | jq -r 
'.dependencyName' | xmlstarlet esc)
+            local new_version=$(echo "$dependency" | jq -r '.newVersion' | 
xmlstarlet esc)
+            local issue_id=$(xmlstarlet esc "$PR_ID")
+            local issue_link=$(xmlstarlet esc "$PR_URL")
+            cat << CHANGELOG_ENTRY
+          <?xml version="1.0" encoding="UTF-8"?>
+          <!-- SPDX-License-Identifier: Apache-2.0 -->
+          <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                 xmlns="https://logging.apache.org/xml/ns";
+                 xsi:schemaLocation="https://logging.apache.org/xml/ns 
https://logging.apache.org/xml/ns/log4j-changelog-0.xsd";
+                 type="updated">
+            <issue id="$issue_id" link="$issue_link"/>
+            <description format="asciidoc">Update \`$dependency_name\` to 
version \`$new_version\`.</description>
+          </entry>
+          CHANGELOG_ENTRY
+          }
+          # Ensure the changelog directory exists
+          release_changelog_path="src/changelog/.${RELEASE_VERSION_MAJOR}.x.x"
+          mkdir -p "$release_changelog_path"
+          cd "$release_changelog_path"
+          # Generate the changelog entries for each updated dependency
+          echo $UPDATED_DEPENDENCIES | jq --compact-output '.[]' | while read 
-r dependency; do
+            # Extract the dependency name and version
+            dependency_name=$(echo "$dependency" | jq -r '.dependencyName')
+            changelog_file_name=$(echo "update_${dependency_name,,}.xml" | sed 
-r -e 's/[^a-z0-9.-]/_/g' -e 's/_+/_/g')
+            generate_changelog_entry "$dependency" > "$changelog_file_name"
+          done
+
+      - name: Set up GPG
+        uses: 
crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # 6.3.0
+        with:
+          gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
+          passphrase: ${{ secrets.GPG_PASSPHRASE }}
+
+      - name: Add & commit changes
+        shell: bash
+        env:
+          COMMIT_MSG: "Generate changelog entries for PR #${{ 
github.event.pull_request.number }}"
+          USER_NAME: ${{ inputs.user_name }}
+          USER_EMAIL: ${{ inputs.user_email }}
+        run: |
+          git add src/changelog
+          git config user.name "$USER_NAME"
+          git config user.email "$USER_EMAIL"
+          git commit -S -m "$COMMIT_MSG"
+          git push origin
+
+      - name: Enable auto-merge on PR
+        shell: bash
+        env:
+          PR_URL: ${{ github.event.pull_request.html_url }}
+          GH_TOKEN: ${{ github.token }}
+        run: |
+          gh pr merge --squash --auto "$PR_HTML_URL"
diff --git a/src/changelog/.12.x.x/add-deploy-profile.xml 
b/src/changelog/.12.x.x/add-deploy-profile.xml
new file mode 100644
index 0000000..a34ffff
--- /dev/null
+++ b/src/changelog/.12.x.x/add-deploy-profile.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xmlns="https://logging.apache.org/xml/ns";
+       xsi:schemaLocation="https://logging.apache.org/xml/ns 
https://logging.apache.org/xml/ns/log4j-changelog-0.xsd";
+       type="added">
+  <issue id="417" link="https://github.com/apache/logging-parent/issues/417"/>
+  <description format="asciidoc">
+    Added `process-dependabot-reusable` to handle Dependabot PRs under RTC 
restrictions.
+  </description>
+</entry>
diff --git a/src/site/antora/modules/ROOT/examples/process-dependabot.yaml 
b/src/site/antora/modules/ROOT/examples/process-dependabot.yaml
new file mode 100644
index 0000000..6f7d204
--- /dev/null
+++ b/src/site/antora/modules/ROOT/examples/process-dependabot.yaml
@@ -0,0 +1,45 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+name: Dependabot Process PR
+
+on:
+  pull_request_target: {}
+
+permissions: read-all
+
+jobs:
+
+# tag::process-dependabot[]
+  process-dependabot:
+    # Skip this workflow on commits not pushed by Dependabot
+    if: ${{ github.actor == 'dependabot[bot]' }}
+    uses: 
apache/logging-parent/.github/workflows/process-dependabot-reusable.yaml@rel/{project-version}
+    permissions:
+      # The default GITHUB_TOKEN will be used to enable the "auto-merge" on 
the PR
+      pull-requests: write
+    secrets:
+      AUTO_MERGE_TOKEN: ${{ github.token }}
+      CONTENT_WRITE_TOKEN: ${{ secrets.DEPENDABOT_TOKEN }}
+      GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
+      GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
+    with:
+      user_name: 'Release Manager'
+      user_email: [email protected]
+      # Necessary to let the reusable workflow reference itself
+      reusable_ref: rel/{project-version}
+# end::process-dependabot[]
diff --git a/src/site/antora/modules/ROOT/pages/workflows.adoc 
b/src/site/antora/modules/ROOT/pages/workflows.adoc
index e9ed9f9..2369dd3 100644
--- a/src/site/antora/modules/ROOT/pages/workflows.adoc
+++ b/src/site/antora/modules/ROOT/pages/workflows.adoc
@@ -104,10 +104,19 @@ To verify the reproducibility of a release, you can use:
 include::example$build.yaml[tag=verify-reproducibility-release,indent=0]
 ----
 
-[#merge-dependabot]
-== 
{project-github-url}/blob/main/.github/workflows/merge-dependabot-reusable.yaml[`merge-dependabot-reusable.yaml`]
+[#process-dependabot]
+== 
{project-github-url}/blob/main/.github/workflows/process-dependabot-reusable.yaml[`process-dependabot-reusable.yaml`]
 
-Merges Dependabot PRs along with changelog entries.
+Helps to process Dependabot pull requests by:
+
+* Generating changelog entries for the updated dependencies.
+* Enabling the "auto-merge" option for the pull request.
+
+.Snippet from an {examples-base-link}/process-dependabot.yaml[example 
`process-dependabot.yaml`] using this workflow
+[source,yaml,subs=+attributes]
+----
+include::example$process-dependabot.yaml[tag=process-dependabot,indent=0]
+----
 
 [#deploy-site]
 == 
{project-github-url}/blob/main/.github/workflows/deploy-site-reusable.yaml[`deploy-site-reusable.yaml`]

Reply via email to