diff --git a/.github/workflows/check_pr_release_notes.yml b/.github/workflows/check_pr_release_notes.yml index 0ce19ed..20360c3 100644 --- a/.github/workflows/check_pr_release_notes.yml +++ b/.github/workflows/check_pr_release_notes.yml @@ -14,6 +14,7 @@ # limitations under the License. # +# GH workflow source https://github.com/AbsaOSS/generate-release-notes/blob/master/.github/workflows/check_pr_release_notes.yml name: Check PR Release Notes in Description on: @@ -21,67 +22,19 @@ on: types: [opened, synchronize, reopened, edited, labeled, unlabeled] branches: [ master ] -env: - SKIP_LABEL: 'no RN' - RLS_NOTES_TAG_REGEX: 'Release Notes:' - jobs: check-release-notes: runs-on: ubuntu-latest steps: - - name: Get Pull Request Info - id: pr_info - uses: actions/github-script@v7 + - uses: actions/setup-python@v5.1.1 with: - script: | - const pr_number = context.payload.pull_request.number; - const pr = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: pr_number - }); - const labels = pr.data.labels ? pr.data.labels.map(label => label.name) : []; - - if (labels.includes("${{ env.SKIP_LABEL }}")) { - console.log("Skipping release notes check because '${{ env.SKIP_LABEL }}' label is present."); - core.setOutput("skip_check", 'true'); - core.setOutput("pr_body", ""); - return; - } - - const pr_body = pr.data.body; - if (!pr_body) { - core.setFailed("Pull request description is empty."); - core.setOutput("pr_body", ""); - core.setOutput("skip_check", 'false'); - return; - } - core.setOutput("pr_body", pr_body); - core.setOutput("skip_check", 'false'); - return; - - - name: Skip check if SKIP_LABEL is present - if: steps.pr_info.outputs.skip_check == 'true' - run: echo "Skipping release notes validation." + python-version: '3.11' - - name: Check for 'Release Notes:' and bullet list - if: steps.pr_info.outputs.skip_check == 'false' - run: | - # Extract the body from the previous step - PR_BODY="${{ steps.pr_info.outputs.pr_body }}" - - # Check if "Release Notes:" exists - if ! echo "$PR_BODY" | grep -q '${{ env.RLS_NOTES_TAG_REGEX }}'; then - echo "Error: release notes tag not found in pull request description. Has to adhere to format '${{ env.RLS_NOTES_TAG_REGEX }}'." - exit 1 - fi - - # Extract text after "Release Notes:" line - TEXT_BELOW_RELEASE_NOTES_TAG=$(echo "$PR_BODY" | sed -n '/${{ env.RLS_NOTES_TAG_REGEX }}/,$p' | tail -n +2) - - # Check if there's a bullet list (lines starting with '-', '+' or '*') - if ! echo "$TEXT_BELOW_RELEASE_NOTES_TAG" | grep -qE '^\s*[-+*]\s+.+$'; then - echo "Error: No bullet list found under release notes tag." - exit 1 - fi + - name: Check presence of release notes in PR description + uses: AbsaOSS/release-notes-presence-check@v0.1.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + github-repository: ${{ github.repository }} + pr-number: ${{ github.event.number }} diff --git a/.github/workflows/release_draft.yml b/.github/workflows/release_draft.yml index cfbf54c..37b95d3 100644 --- a/.github/workflows/release_draft.yml +++ b/.github/workflows/release_draft.yml @@ -14,7 +14,9 @@ # limitations under the License. # +# GH workflow source https://github.com/AbsaOSS/generate-release-notes/blob/master/.github/workflows/release_draft.yml name: Release - create draft release + on: workflow_dispatch: inputs: @@ -23,64 +25,7 @@ on: required: true jobs: - check-tag: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Validate format of received tag - uses: actions/github-script@v7 - with: - script: | - const newTag = core.getInput('tag-name'); - const regex = /^v[0-9]+\.[0-9]+\.[0-9]+$/; - - if (!regex.test(newTag)) { - core.setFailed('Tag does not match the required format "v[0-9]+.[0-9]+.[0-9]+"'); - return; - } - tag-name: ${{ github.event.inputs.tag-name }} - - # - name: Check tag's correct version increment - # uses: actions/github-script@v7 - # with: - # script: | - # const newTag = core.getInput('tag-name'); - # - # // get latest tag - # const { data: refs } = await github.rest.git.listMatchingRefs({ - # owner: context.repo.owner, - # repo: context.repo.repo, - # ref: 'tags/' - # }); - # - # if (refs.length === 0) { - # // No existing tags, so any new tag is valid - # console.log('No existing tags found. Any new tag is considered valid.'); - # return; - # } - # - # const latestTag = refs.sort((a, b) => new Date(b.object.date) - new Date(a.object.date))[0].ref.replace('refs/tags/', ''); - # const latestVersion = latestTag.replace('v', '').split('.').map(Number); - # const newVersion = newTag.replace('v', '').split('.').map(Number); - # - # // check tag's correct version increase - # const isValid = (latestVersion[0] === newVersion[0] && latestVersion[1] === newVersion[1] && newVersion[2] === latestVersion[2] + 1) || - # (latestVersion[0] === newVersion[0] && newVersion[1] === latestVersion[1] + 1 && newVersion[2] === 0) || - # (newVersion[0] === latestVersion[0] + 1 && newVersion[1] === 0 && newVersion[2] === 0); - # - # if (!isValid) { - # core.setFailed('New tag is not one version higher than the latest tag'); - # return; - # } - # - # tag-name: ${{ github.event.inputs.tag-name }} - release-draft: - needs: check-tag runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -92,6 +37,16 @@ jobs: with: python-version: '3.11' + - name: Check format of received tag + id: check-version-tag + uses: AbsaOSS/version-tag-check@v0.1.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + github-repository: ${{ github.repository }} + branch: 'master' + version-tag: ${{ github.event.inputs.tag-name }} + - name: Generate Release Notes id: generate_release_notes uses: AbsaOSS/generate-release-notes@master @@ -112,9 +67,12 @@ jobs: {"title": "Silent-live 🤫", "label": "silent-live"}, {"title": "Documentation 📜", "label": "documentation"} ]' - warnings: true + skip-release-notes-label: 'no RN' verbose: true + warnings: true + print-empty-chapters: true + - name: Create and Push Tag uses: actions/github-script@v7 with: diff --git a/.github/workflows/release_notes_comments_migration.yml b/.github/workflows/release_notes_comments_migration.yml deleted file mode 100644 index 363621f..0000000 --- a/.github/workflows/release_notes_comments_migration.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Copy Release Notes to Related Issues - -on: - pull_request: - types: [closed] - branches: [ master ] - -jobs: - copy_release_notes: - if: github.event.pull_request.merged == true - 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/static_analysis_and_tests.yml b/.github/workflows/static_analysis_and_tests.yml index dd311d9..7003d5a 100644 --- a/.github/workflows/static_analysis_and_tests.yml +++ b/.github/workflows/static_analysis_and_tests.yml @@ -1,3 +1,19 @@ +# +# Copyright 2024 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: "Static analysis & tests" on: