diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 82ff3239..d0e67e93 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -24,7 +24,7 @@ Detailed instructions may help reviewers test this PR quickly and provide quicke ## Checklist - [ ] For each Chart updated, version bumped in the corresponding `Chart.yaml` according to [Semantic Versioning](http://semver.org/). -- [ ] For each Chart updated, variables are documented in the `values.yaml` and added to the corresponding README.md. The [pre-commit](https://pre-commit.com/) utility can be used to generate the necessary content. Use `pre-commit run -a` to apply changes. The [pre-commit Workflow](./workflows/pre-commit.yaml) will do this automatically for you if needed. +- [ ] For each Chart updated, variables are documented in the `values.yaml` and added to the corresponding README.md. The [pre-commit](https://pre-commit.com/) utility can be used to generate the necessary content. Run `pre-commit run --all-files` to run the hooks and then push any resulting changes. The [pre-commit Workflow](./workflows/pre-commit.yaml) will enforce this and warn you if needed. - [ ] JSON Schema template updated and re-generated the raw schema via the `pre-commit` hook. - [ ] Tests pass using the [Chart Testing](https://github.com/helm/chart-testing) tool and the `ct lint` command. - [ ] If you updated the [orchestrator-infra](../charts/orchestrator-infra) chart, make sure the versions of the [Knative CRDs](../charts/orchestrator-infra/crds) are aligned with the versions of the CRDs installed by the OpenShift Serverless operators declared in the [values.yaml](../charts/orchestrator-infra/values.yaml) file. See [Installing Knative Eventing and Knative Serving CRDs](../charts/orchestrator-infra/README.md#installing-knative-eventing-and-knative-serving-crds) for more details. diff --git a/.github/workflows/pre-commit-comment.yaml b/.github/workflows/pre-commit-comment.yaml new file mode 100644 index 00000000..3f9bea8c --- /dev/null +++ b/.github/workflows/pre-commit-comment.yaml @@ -0,0 +1,103 @@ +name: Pre-commit comment + +on: + workflow_run: + workflows: ["Pre-commit"] + types: + - completed + +jobs: + comment: + name: Comment on PR + runs-on: ubuntu-latest + if: github.event.workflow_run.event == 'pull_request' + permissions: + pull-requests: write + + steps: + + - name: Get the PR number from the workflow run + id: pr-number + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const prs = context.payload.workflow_run.pull_requests; + if (prs.length > 0) { + const num = prs[0].number; + if (Number.isInteger(num)) { + core.setOutput('number', num); + } else { + core.setFailed(`Invalid PR number detected: ${num}`); + } + } + + - name: Delete previous pre-commit failure comments + if: steps.pr-number.outputs.number + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + PR_NUMBER: ${{ steps.pr-number.outputs.number }} + with: + script: | + const prNumber = parseInt(process.env.PR_NUMBER, 10); + + // Get all comments on the PR + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + }); + + console.log(`Found ${comments.length} total comments on PR #${prNumber}`); + + const botComments = comments.filter(comment => { + return comment.user.login === 'github-actions[bot]' && + comment.body && + comment.body.includes('⚠️ Pre-commit hook failures'); + }); + + for (const comment of botComments) { + try { + await github.rest.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: comment.id, + }); + } catch (error) { + console.warn(`Failed to delete comment ${comment.id}:`, error.message); + } + } + + - name: Post comment + if: steps.pr-number.outputs.number && github.event.workflow_run.conclusion == 'failure' + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + PR_NUMBER: ${{ steps.pr-number.outputs.number }} + with: + script: | + const prNumber = parseInt(process.env.PR_NUMBER, 10); + + const body = ` + ## ⚠️ Pre-commit hook failures + + The pre-commit hooks detected issues that need to be fixed. + + **To fix these issues:** + + 1. Install the required dependencies: + - [pre-commit](https://pre-commit.com/#install) + - [helm-docs](https://github.com/norwoodj/helm-docs#installation) + + 2. Run pre-commit on all files: + \`\`\`bash + pre-commit run --all-files + \`\`\` + + 3. Commit and push any resulting changes + `.trim().replace(/^ {12}/gm, ''); + + await github.rest.issues.createComment({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + body: body + }); diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index f64dacd4..45f638ef 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -1,39 +1,23 @@ name: Pre-commit on: - # pull_request_target needed to be able to commit and push pre-commit diffs to external fork PRs. - # But we included a manual authorization safeguard to prevent PWN requests. See the 'authorize' job below. - pull_request_target: + pull_request: branches: - main - - rhdh-1.[0-9]+ - - 1.[0-9]+.x - release-1.[0-9]+ concurrency: group: ${{ github.workflow }}-${{ github.event.number }} cancel-in-progress: true -jobs: - authorize: - # The 'external' environment is configured with the maintainers team as required reviewers. - # All the subsequent jobs in this workflow 'need' this job, which will require manual approval for PRs coming from external forks. - # see list of approvers in OWNERS file - environment: - ${{ (github.event.pull_request.head.repo.full_name == github.repository || - contains(fromJSON('["gazarenkov","kadel","nickboldt","rm3l","kim-tsao","Fortune-Ndlovu","subhashkhileri","zdrapela","openshift-cherrypick-robot"]'), github.event.pull_request.user.login)) && 'internal' || 'external' }} - runs-on: ubuntu-latest - steps: - - name: approved - run: echo "✓" +# Revoke all permissions by default, then grant only what is needed +permissions: + contents: read +jobs: pre-commit: name: Pre-commit runs-on: ubuntu-latest - needs: authorize - permissions: - contents: write - pull-requests: write env: GO111MODULE: on steps: @@ -41,8 +25,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: fetch-depth: 0 - repository: ${{github.event.pull_request.head.repo.full_name}} - ref: ${{ github.event.pull_request.head.sha }} + persist-credentials: false # Avoid token leakage to hooks - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: @@ -57,41 +40,5 @@ jobs: - name: Run pre-commit uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 - continue-on-error: true # Don't fail immediately; we'll handle it below with: extra_args: --verbose --all-files --show-diff-on-failure - - - name: Check for changes after pre-commit - id: diff-checker - run: | - echo "CHANGED=$(if git diff --quiet; then echo "false"; else echo "true"; fi)" >> $GITHUB_OUTPUT - - - name: Commit and push any manifest changes - if: ${{ steps.diff-checker.outputs.CHANGED == 'true' }} - run: | - git remote add fork "https://github.com/${{ github.event.pull_request.head.repo.full_name }}.git" - git fetch fork ${{ github.event.pull_request.head.ref }} - git checkout -B pr-branch fork/${{ github.event.pull_request.head.ref }} - - git config user.name 'github-actions[bot]' - git config user.email 'github-actions[bot]@users.noreply.github.com' - - git add -A . - git commit \ - -m "chore(pre-commit): Auto-fix hooks" \ - -m "Co-authored-by: $GITHUB_ACTOR <$GITHUB_ACTOR@users.noreply.github.com>" - - git push fork pr-branch:${{ github.event.pull_request.head.ref }} - - - name: Comment on PR if manifests were updated - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - if: ${{ !cancelled() && steps.diff-checker.outputs.CHANGED == 'true' }} - continue-on-error: true - with: - script: | - await github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: '⚠️ Files changed after running the pre-commit hooks

Those changes should have been pushed automatically to your PR branch.

NOTE: If the PR checks are stuck after this additional commit, manually close the PR and immediately reopen it to trigger the checks again.' - })