diff --git a/.github/workflows/check-changeset.yml b/.github/workflows/check-changeset.yml new file mode 100644 index 00000000..90e0cbe0 --- /dev/null +++ b/.github/workflows/check-changeset.yml @@ -0,0 +1,167 @@ +# ------------------------------------------------------------------------------------- +# +# Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). +# +# WSO2 LLC. 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. +# +# -------------------------------------------------------------------------------------- + +# This workflow will check if a submitted PR has changesets. + +name: đĻ Check for Changeset + +on: + workflow_run: + workflows: ["đŠ Receive PR"] + types: + - completed + +env: + GH_TOKEN: ${{ secrets.ASGARDEO_GITHUB_BOT_TOKEN }} + IS_RELEASE_MODE: false + +jobs: + check-changeset: + runs-on: ubuntu-latest + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' + steps: + - name: đĨ Download PR Number Artifact + uses: actions/download-artifact@v4 + with: + name: pr-number + github-token: ${{ env.GH_TOKEN }} + repository: ${{ github.repository }} + run-id: ${{ github.event.workflow_run.id }} + + - name: đ Display PR Number + run: cat ./PR_NUMBER + + - name: đŦ Remove Existing Changeset Comment + uses: actions/github-script@v7 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const fs = require('fs'); + const PR_NUMBER = Number(fs.readFileSync('./PR_NUMBER', 'utf8').trim()); + const REPO_OWNER = context.repo.owner; + const REPO_NAME = context.repo.repo; + + const comments = await github.rest.issues.listComments({ + owner: REPO_OWNER, + repo: REPO_NAME, + issue_number: PR_NUMBER, + }); + + console.log("COMMENTS_URL: https://api.github.com/repos/" + REPO_NAME + "/issues/" + PR_NUMBER + "/comments"); + + for (const comment of comments.data) { + console.log("COMMENT_OWNER: " + comment.user.login); + + if ( + comment.body.includes("đĻ Changeset detected") || + comment.body.includes("â ī¸ No Changeset found") || + comment.body.includes("â Invalid Changeset detected") + ) { + console.log("COMMENT_ID_TO_DELETE: " + comment.id); + + await github.rest.issues.deleteComment({ + owner: REPO_OWNER, + repo: REPO_NAME, + comment_id: comment.id, + }); + } + } + + - name: đŦ Add Changeset Comment + uses: actions/github-script@v7 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const fs = require('fs'); + const PR_NUMBER = Number(fs.readFileSync('./PR_NUMBER', 'utf8').trim()); + const REPO_OWNER = context.repo.owner; + const REPO_NAME = context.repo.repo; + const IS_RELEASE_MODE = process.env.IS_RELEASE_MODE === 'true'; + + const files = await github.rest.pulls.listFiles({ + owner: REPO_OWNER, + repo: REPO_NAME, + pull_number: PR_NUMBER, + }); + + const CHANGED_FILES = files.data.map(file => file.filename); + console.log("CHANGED_FILES_URL: https://api.github.com/repos/" + REPO_NAME + "/pulls/" + PR_NUMBER + "/files"); + console.log("CHANGED_FILES:", CHANGED_FILES); + + const CHANGESET_FILES = CHANGED_FILES.filter(filename => /^\.changeset\/.*\.md$/.test(filename)); + const CHANGES_COUNT = CHANGESET_FILES.length; + console.log("CHANGES_COUNT:", CHANGES_COUNT); + console.log("IS_RELEASE_MODE:", IS_RELEASE_MODE); + + let invalidChangesets = []; + + if (IS_RELEASE_MODE && CHANGES_COUNT > 0) { + for (const changesetFile of CHANGESET_FILES) { + try { + const fileResponse = await github.rest.repos.getContent({ + owner: REPO_OWNER, + repo: REPO_NAME, + path: changesetFile, + ref: `refs/pull/${PR_NUMBER}/head` + }); + + const content = Buffer.from(fileResponse.data.content, 'base64').toString('utf8'); + console.log("CHANGESET_CONTENT:", changesetFile, content); + + const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/); + if (frontmatterMatch) { + const frontmatter = frontmatterMatch[1]; + if (frontmatter.includes(': major') || frontmatter.includes(': minor')) { + invalidChangesets.push({ + file: changesetFile, + type: frontmatter.includes(': major') ? 'major' : 'minor' + }); + } + } + } catch (error) { + console.log("Error reading changeset file:", changesetFile, error.message); + } + } + } + + let COMMENT; + if (CHANGES_COUNT > 0) { + if (IS_RELEASE_MODE && invalidChangesets.length > 0) { + console.log("Invalid changesets detected in release mode:", invalidChangesets); + const invalidFiles = invalidChangesets.map(cs => `- \`${cs.file}\` (${cs.type})`).join('\n'); + COMMENT = `
đ WSO2 Identity Server release mode is currently activated!
The following changesets contain major/minor versions, but the master branch only allows patch releases:
\n${invalidFiles}\nđ Action Required:
next
branch for minor/major releasesđ Refer Release Documentation to learn about our release strategy.
`; + } else { + console.log("Changeset detected"); + COMMENT = `The changes in this PR will be included in the next version bump.
Not sure what this means? Click here to learn what changesets are.
`; + } + } else { + console.log("No changeset detected"); + COMMENT = `If these changes should result in a version bump, you need to add a changeset.
Refer Release Documentation to learn how to add a changeset.`; + } + + await github.rest.issues.createComment({ + owner: REPO_OWNER, + repo: REPO_NAME, + issue_number: PR_NUMBER, + body: COMMENT, + }); + diff --git a/.github/workflows/receive-pr.yml b/.github/workflows/receive-pr.yml new file mode 100644 index 00000000..e5b00e76 --- /dev/null +++ b/.github/workflows/receive-pr.yml @@ -0,0 +1,46 @@ +# ------------------------------------------------------------------------------------- +# +# Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). +# +# WSO2 LLC. 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. +# +# -------------------------------------------------------------------------------------- + +# This workflow will receive a PR and save the PR number for later use. + +name: đŠ Receive PR + +on: + pull_request: + branches: [main] + +jobs: + save-pr-information: + runs-on: ubuntu-latest + steps: + - name: âŦī¸ Checkout + uses: actions/checkout@v4 + + - name: âšī¸ Display PR Information + run: echo "PR Number \#${{github.event.number}}" + + - name: đž Save PR Number for Later Use + run: echo "${{github.event.number}}" > PR_NUMBER + + - name: đĻ Upload PR Number as Artifact + uses: actions/upload-artifact@v4 + with: + name: pr-number + path: PR_NUMBER