-
Notifications
You must be signed in to change notification settings - Fork 51
167 lines (144 loc) · 8.08 KB
/
check-changeset.yml
File metadata and controls
167 lines (144 loc) · 8.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# -------------------------------------------------------------------------------------
#
# 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 = `<h3>❌ Invalid Changeset detected</h3><p><b>🚀 WSO2 Identity Server release mode is currently activated!</b></p><p>The following changesets contain major/minor versions, but the master branch only allows patch releases:</p>\n${invalidFiles}\n<p><b>📋 Action Required:</b></p><ul><li>🔧 Update these changesets to use patch versions only, OR</li><li>🎯 Target the <code>next</code> branch for minor/major releases</li></ul><p>📚 Refer <a href="https://github.com/wso2/identity-apps/blob/master/docs/release/README.md">Release Documentation</a> to learn about our release strategy.</p>`;
} else {
console.log("Changeset detected");
COMMENT = `<h3>🦋 Changeset detected</h3><p><b>The changes in this PR will be included in the next version bump.</b></p><p>Not sure what this means? <a href="https://github.com/changesets/changesets/blob/master/docs/adding-a-changeset.md">Click here to learn what changesets are</a>.</p>`;
}
} else {
console.log("No changeset detected");
COMMENT = `<h3>⚠️ No Changeset found</h3>Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go.</p><p><b>If these changes should result in a version bump, you need to add a changeset.</b></p><p>Refer <a href="https://github.com/wso2/identity-apps/blob/master/docs/release/README.md">Release Documentation</a> to learn how to add a changeset.`;
}
await github.rest.issues.createComment({
owner: REPO_OWNER,
repo: REPO_NAME,
issue_number: PR_NUMBER,
body: COMMENT,
});