diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 3942e752579a..a5d68ff079b5 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -30,8 +30,26 @@ concurrency: # in the (very rare) event of a hash failure or sqlite library query failure. on: push: + branches: + - main + workflow_dispatch: + inputs: + pr_number: + description: 'Pull request number' + type: string + check_run_id: + description: 'Check run ID for status updates' + type: string + pr_head_sha: + description: 'PR head SHA' + type: string +permissions: + contents: read + checks: write + jobs: + # Check crate compiles and base cargo check passes linux-build-lib: name: linux build test @@ -57,7 +75,7 @@ jobs: # Run extended tests (with feature 'extended_tests') linux-test-extended: name: cargo test 'extended_tests' (amd64) - needs: linux-build-lib + needs: [linux-build-lib] runs-on: ubuntu-latest # note: do not use amd/rust container to preserve disk space steps: @@ -127,4 +145,44 @@ jobs: cargo test --features backtrace --profile release-nonlto --test sqllogictests -- --include-sqlite cargo clean + # If the workflow was triggered by the PR comment (through pr_comment_commands.yml action) we need to manually update check status to display in UI + update-check-status: + needs: [linux-build-lib, linux-test-extended, hash-collisions, sqllogictest-sqlite] + runs-on: ubuntu-latest + if: ${{ always() && github.event_name == 'workflow_dispatch' }} + steps: + - name: Determine workflow status + id: status + run: | + if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}" == "true" ]]; then + echo "workflow_status=failure" >> $GITHUB_OUTPUT + echo "conclusion=failure" >> $GITHUB_OUTPUT + else + echo "workflow_status=completed" >> $GITHUB_OUTPUT + echo "conclusion=success" >> $GITHUB_OUTPUT + fi + + - name: Update check run + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const workflowRunUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + + await github.rest.checks.update({ + owner: context.repo.owner, + repo: context.repo.repo, + check_run_id: ${{ github.event.inputs.check_run_id }}, + status: 'completed', + conclusion: '${{ steps.status.outputs.conclusion }}', + output: { + title: '${{ steps.status.outputs.conclusion == 'success' && 'Extended Tests Passed' || 'Extended Tests Failed' }}', + summary: `Extended tests have completed with status: ${{ steps.status.outputs.conclusion }}.\n\n[View workflow run](${workflowRunUrl})` + }, + details_url: workflowRunUrl + }); + + + + diff --git a/.github/workflows/pr_comment_commands.yml b/.github/workflows/pr_comment_commands.yml new file mode 100644 index 000000000000..a20a5b15965d --- /dev/null +++ b/.github/workflows/pr_comment_commands.yml @@ -0,0 +1,89 @@ +# 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: PR commands + +on: + issue_comment: + types: [created] + +permissions: + contents: read + pull-requests: write + actions: write + checks: write + +jobs: + # Starts the extended_tests on a PR branch when someone leaves a `Run extended tests` comment + run_extended_tests: + runs-on: ubuntu-latest + if: ${{ github.event_name == 'issue_comment' && github.event.issue.pull_request && contains(github.event.comment.body, 'Run extended tests') }} + steps: + - name: Dispatch extended tests for a PR branch with comment + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + // Get PR details to fetch the branch name + const { data: pullRequest } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.payload.issue.number + }); + + // Extract the branch name + const branchName = pullRequest.head.ref; + const headSha = pullRequest.head.sha; + const workflowRunsUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions?query=workflow%3A%22Datafusion+extended+tests%22+branch%3A${branchName}`; + + // Create a check run that links to the Actions tab so the run will be visible in GitHub UI + const check = await github.rest.checks.create({ + owner: context.repo.owner, + repo: context.repo.repo, + name: 'Extended Tests', + head_sha: headSha, + status: 'in_progress', + output: { + title: 'Extended Tests Running', + summary: `Extended tests have been triggered for this PR.\n\n[View workflow runs](${workflowRunsUrl})` + }, + details_url: workflowRunsUrl + }); + + // Dispatch the workflow with the PR branch name + await github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'extended.yml', + ref: branchName, + inputs: { + pr_number: context.payload.issue.number.toString(), + check_run_id: check.data.id.toString(), + pr_head_sha: headSha + } + }); + + - name: Add reaction to comment + uses: actions/github-script@v7 + with: + script: | + await github.rest.reactions.createForIssueComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: context.payload.comment.id, + content: 'rocket' + }); \ No newline at end of file