diff --git a/.github/workflows/pr_release_note_comment_check.yml b/.github/workflows/pr_release_note_comment_check.yml new file mode 100644 index 000000000..4dc08f526 --- /dev/null +++ b/.github/workflows/pr_release_note_comment_check.yml @@ -0,0 +1,94 @@ +# +# Copyright 2021 ABSA Group Limited +# +# Licensed 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 Release Note Comment Check + +on: + issue_comment: + types: + - created + - edited + - deleted + pull_request: + types: + - opened + - synchronize + - reopened + - edited + - labeled + - unlabeled + branches: [ master ] + +jobs: + check-for-release-notes-comments: + if: ${{ ( github.event_name == 'pull_request') || (github.event.issue.pull_request) }} + name: Check For Release Notes Comments + runs-on: ubuntu-latest + steps: + - name: Get PR branch + uses: xt0rted/pull-request-comment-branch@v1 + id: comment-branch + + - name: Set latest commit status as pending + uses: myrotvorets/set-commit-status-action@master + with: + sha: ${{ steps.comment-branch.outputs.head_sha }} + token: ${{ secrets.GITHUB_TOKEN }} + status: pending + + - name: Fetch all PR comments + if: ${{ ! contains( github.event.pull_request.labels.*.name, 'no RN') }} + id: get-comments + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const issueNumber = context.issue.number; + const repoName = context.repo.repo; + const repoOwner = context.repo.owner; + + const comments = await github.rest.issues.listComments({ + owner: repoOwner, + repo: repoName, + issue_number: issueNumber, + }); + + return comments.data.map(comment => comment.body); + + - name: Check for 'Release Notes' in comments + if: ${{ ! contains( github.event.pull_request.labels.*.name, 'no RN') }} + uses: actions/github-script@v7 + with: + script: | + const comments = ${{ steps.get-comments.outputs.result }}; + console.log("Comments:"); + console.log(comments); + const releaseNotesRegex = /release notes?:?/i; + const hasReleaseNotes = comments.some(comment => releaseNotesRegex.test(comment)); + + if (!hasReleaseNotes) { + console.log('No "Release notes" found in PR comments'); + core.setFailed('No "Release notes" found in PR comments') + } else { + console.log('"Release notes" found in comments'); + } + - name: Set latest commit status as ${{ job.status }} + uses: myrotvorets/set-commit-status-action@master + if: always() + with: + sha: ${{ steps.comment-branch.outputs.head_sha }} + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} diff --git a/.github/workflows/release_draft.yml b/.github/workflows/release_draft.yml index 164c4e5d2..aef2e423b 100644 --- a/.github/workflows/release_draft.yml +++ b/.github/workflows/release_draft.yml @@ -119,6 +119,7 @@ jobs: {"title": "Bugfixes 🛠", "label": "bug"} ] warnings: true + skip-release-notes: "no RN" - name: Create draft release uses: softprops/action-gh-release@v1 env: diff --git a/.github/workflows/release_notes_comments_copy_from_pr_to_linked_issues.yml b/.github/workflows/release_notes_comments_copy_from_pr_to_linked_issues.yml new file mode 100644 index 000000000..712268242 --- /dev/null +++ b/.github/workflows/release_notes_comments_copy_from_pr_to_linked_issues.yml @@ -0,0 +1,111 @@ +# +# Copyright 2021 ABSA Group Limited +# +# Licensed 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: Release Notes Comments Copy from PR to Linked Issues + +on: + pull_request: + types: [closed] + branches: [ master ] + +jobs: + copy_release_notes: + if: github.event.pull_request.merged == true + name: Copy Release Notes + runs-on: ubuntu-latest + steps: + - name: Fetch PR Comments + id: get-comments + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const prNumber = context.payload.pull_request.number; + const repoName = context.repo.repo; + const repoOwner = context.repo.owner; + const releaseNotesRegex = /release notes?:?/i; + + const comments = await github.rest.issues.listComments({ + owner: repoOwner, + repo: repoName, + issue_number: prNumber, + }); + + const releaseNoteComment = comments.data.find(comment => releaseNotesRegex.test(comment.body)); + const releaseNoteBody = releaseNoteComment ? releaseNoteComment.body : ''; + console.log(`Release Note Body: ${releaseNoteBody}`); + core.setOutput('releaseNoteBody', releaseNoteBody); + + - name: Print Extracted releaseNoteBody + run: | + echo "Extracted Release Note Body:" + echo "${{ steps.get-comments.outputs.releaseNoteBody }}" + echo "RELEASE_NOTE_BODY<> $GITHUB_ENV + echo "${{ steps.get-comments.outputs.releaseNoteBody }}" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Parse PR Description for Related Issues + id: find-issues + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const description = context.payload.pull_request.body; + const issueNumbers = []; + const regexPattern = /([Cc]los(e|es|ed)|[Ff]ix(es|ed)?|[Rr]esolv(e|es|ed))\s*#\s*([0-9]+)/g; + + let match; + while ((match = regexPattern.exec(description)) !== null) { + // This is necessary to avoid infinite loops with zero-width matches + if (match.index === regexPattern.lastIndex) { + regexPattern.lastIndex++; + } + + // The actual issue number is in the last group of the match + const issueNumber = match[match.length - 1]; + if (issueNumber) { + issueNumbers.push(issueNumber); + } + } + + core.setOutput('issueNumbers', issueNumbers.join(', ')); + + - name: Print Extracted Issue Numbers + run: | + echo "Extracted Issue Numbers: ${{ steps.find-issues.outputs.issueNumbers }}" + echo "ISSUE_NUMBERS=${{ steps.find-issues.outputs.issueNumbers }}" >> $GITHUB_ENV + + - name: Post Comment to Issues + if: ${{ (steps.get-comments.outputs.releaseNoteBody) && (steps.find-issues.outputs.issueNumbers) }} + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const issueNumbers = process.env.ISSUE_NUMBERS; + const commentBody = process.env.RELEASE_NOTE_BODY; + const repoName = context.repo.repo; + const repoOwner = context.repo.owner; + + for (const issueNumber of issueNumbers.split(', ')) { + if (issueNumber && commentBody) { + await github.rest.issues.createComment({ + owner: repoOwner, + repo: repoName, + issue_number: issueNumber, + body: commentBody + }); + } + } diff --git a/.github/workflows/test_filenames_check.yml b/.github/workflows/test_filenames_check.yml new file mode 100644 index 000000000..aeaa01d4f --- /dev/null +++ b/.github/workflows/test_filenames_check.yml @@ -0,0 +1,41 @@ +# +# Copyright 2021 ABSA Group Limited +# +# Licensed 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: Test Filenames Check + +on: + pull_request: + branches: [ master ] + types: [ opened, synchronize, reopened ] + +jobs: + test_filenames_check: + name: Test Filenames Check + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Filename Inspector + id: scan-test-files + uses: AbsaOSS/filename-inspector@master + with: + name-patterns: '*UnitTests.*,*IntegrationTests.*' + paths: '**/src/test/scala/**' + report-format: 'console' + excludes: 'server/src/test/scala/za/co/absa/atum/server/api/TestData.scala,server/src/test/scala/za/co/absa/atum/server/api/TestTransactorProvider.scala,server/src/test/scala/za/co/absa/atum/server/ConfigProviderTest.scala' + verbose-logging: 'false' + fail-on-violation: 'true'