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

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new c835310c9 ci: Add full ci promote for testing PRs (#6845)
c835310c9 is described below

commit c835310c95da3796192b0bf3877ef4c83c55c87a
Author: Xuanwo <[email protected]>
AuthorDate: Mon Dec 1 17:28:17 2025 +0800

    ci: Add full ci promote for testing PRs (#6845)
    
    Signed-off-by: Xuanwo <[email protected]>
---
 .github/workflows/full-ci-promote.yml | 123 ++++++++++++++++++++++++++++++++++
 1 file changed, 123 insertions(+)

diff --git a/.github/workflows/full-ci-promote.yml 
b/.github/workflows/full-ci-promote.yml
new file mode 100644
index 000000000..7ca1e0234
--- /dev/null
+++ b/.github/workflows/full-ci-promote.yml
@@ -0,0 +1,123 @@
+# 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: Full CI Promote
+
+on:
+  pull_request_target:
+    types:
+      - labeled
+
+concurrency:
+  group: full-ci-promote-${{ github.event.pull_request.number }}
+  cancel-in-progress: false
+
+permissions:
+  contents: write
+  pull-requests: write
+  issues: write
+
+jobs:
+  promote:
+    if: |
+      github.event.label.name == 'run-with-secrets' &&
+      github.event.pull_request.head.repo.full_name != github.repository
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout main
+        uses: actions/checkout@v5
+        with:
+          ref: main
+
+      - name: Fetch contributor branch
+        env:
+          PR_HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
+          PR_HEAD_REF: ${{ github.event.pull_request.head.ref }}
+          TARGET_BRANCH: ci/pr-${{ github.event.pull_request.number }}
+        run: |
+          git config user.name "opendal-bot"
+          git config user.email "[email protected]"
+          git fetch https://github.com/${PR_HEAD_REPO} 
${PR_HEAD_REF}:refs/remotes/contrib/head
+          git checkout -B "${TARGET_BRANCH}" remotes/contrib/head
+          git push --force origin "${TARGET_BRANCH}"
+
+      - name: Create or update internal PR
+        id: create_internal_pr
+        uses: actions/github-script@v7
+        env:
+          TARGET_BRANCH: ci/pr-${{ github.event.pull_request.number }}
+        with:
+          script: |
+            const targetBranch = process.env.TARGET_BRANCH;
+            const base = 'main';
+            const owner = context.repo.owner;
+            const repo = context.repo.repo;
+            const headParam = `${owner}:${targetBranch}`;
+
+            const { data: existing } = await github.rest.pulls.list({
+              owner,
+              repo,
+              state: 'open',
+              head: headParam,
+              base,
+              per_page: 1,
+            });
+
+            let internalPr = existing[0];
+            if (!internalPr) {
+              const title = `[CI] Full run for 
#${context.payload.pull_request.number}`;
+              const body = [
+                `Mirrored branch for PR 
#${context.payload.pull_request.number}.`,
+                'This PR is created automatically to run full CI with 
repository secrets after maintainer approval.',
+                'Do not edit manually.',
+              ].join('\n');
+
+              const createResp = await github.rest.pulls.create({ owner, repo, 
head: headParam, base, title, body });
+              internalPr = createResp.data;
+            }
+
+            core.setOutput('internal_pr_number', internalPr.number);
+            core.setOutput('internal_pr_html_url', internalPr.html_url);
+
+      - name: Comment on PR
+        uses: actions/github-script@v7
+        env:
+          INTERNAL_PR: ${{ steps.create_internal_pr.outputs.internal_pr_number 
|| '' }}
+          INTERNAL_PR_URL: ${{ 
steps.create_internal_pr.outputs.internal_pr_html_url || '' }}
+        with:
+          script: |
+            const marker = '<!-- ci-bot:full-ci -->';
+            const prNumber = context.payload.pull_request.number;
+            const owner = context.repo.owner;
+            const repo = context.repo.repo;
+            const internalUrl = process.env.INTERNAL_PR_URL;
+
+            const body = [
+              marker,
+              'Maintainer triggered full CI with repository secrets.',
+              `Please monitor the mirrored CI PR for results: ${internalUrl}`,
+              'Re-applying the label will refresh this mirror.',
+            ].join('\n');
+
+            const { data: comments } = await github.rest.issues.listComments({ 
owner, repo, issue_number: prNumber, per_page: 100 });
+            const existing = comments.find((c) => c.body && 
c.body.includes(marker));
+
+            if (existing) {
+              await github.rest.issues.updateComment({ owner, repo, 
comment_id: existing.id, body });
+            } else {
+              await github.rest.issues.createComment({ owner, repo, 
issue_number: prNumber, body });
+            }

Reply via email to