Skip to content

Commit 3db8609

Browse files
Feat/adding more centralised jobs (#8)
* added auto-assing * added centralised jobs * added centralised jobs
1 parent 635901b commit 3db8609

9 files changed

Lines changed: 814 additions & 0 deletions

.github/workflows/auto-assign.yml

Lines changed: 454 additions & 0 deletions
Large diffs are not rendered by default.

.github/workflows/auto-label.json5

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
labelsSynonyms: {
3+
'ci/cd': ['.github', 'Workflow', 'ci/cd'],
4+
dependencies: [
5+
'dependabot',
6+
'dependency',
7+
'dependencies',
8+
'package',
9+
'packages',
10+
],
11+
security: ['security'],
12+
'ui/ux': ['layout', 'screen', 'design', 'figma'],
13+
},
14+
defaultLabels: ['unapproved'],
15+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
dependabot
2+
noman2002
3+
palisadoes
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Issue Assignment – Remove Unapproved Label
2+
3+
on:
4+
workflow_call:
5+
6+
permissions:
7+
contents: read
8+
issues: write
9+
10+
jobs:
11+
remove-unapproved-label:
12+
name: Remove Unapproved Label when issue is assigned
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- name: Remove unapproved label
17+
uses: actions/github-script@v7
18+
with:
19+
script: |
20+
const { owner, repo } = context.repo;
21+
const issue_number = context.issue.number;
22+
23+
const apiParams = { owner, repo, issue_number };
24+
25+
// Get current labels on the issue
26+
const { data: labelList } = await github.rest.issues.listLabelsOnIssue(apiParams);
27+
28+
const unapprovedLabel = labelList.find(label =>
29+
label.name.toLowerCase().includes('unapprov')
30+
);
31+
32+
// Remove unapproved label if it exists
33+
if (unapprovedLabel) {
34+
try {
35+
await github.rest.issues.removeLabel({
36+
owner,
37+
repo,
38+
issue_number,
39+
name: unapprovedLabel.name,
40+
});
41+
console.log(`Removed label: ${unapprovedLabel.name}`);
42+
} catch (err) {
43+
if (err.status !== 404) throw err;
44+
}
45+
} else {
46+
console.log("No unapproved label found");
47+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Add Unapproved Label on Unassignment (Reusable)
2+
3+
on:
4+
workflow_call:
5+
secrets:
6+
GITHUB_TOKEN:
7+
required: true
8+
9+
jobs:
10+
add-unapproved-label:
11+
runs-on: ubuntu-latest
12+
13+
permissions:
14+
issues: write
15+
contents: read
16+
17+
steps:
18+
- name: Add unapproved label
19+
uses: actions/github-script@v7
20+
with:
21+
github-token: ${{ secrets.GITHUB_TOKEN }}
22+
script: |
23+
const { owner, repo } = context.repo;
24+
const issue_number = context.issue.number;
25+
26+
try {
27+
// Fetch full issue (ensures complete label list)
28+
const { data: issue } = await github.rest.issues.get({
29+
owner,
30+
repo,
31+
issue_number
32+
});
33+
34+
const hasUnapprovedLabel = issue.labels.some(
35+
label => label.name === 'unapproved'
36+
);
37+
38+
if (!hasUnapprovedLabel) {
39+
await github.rest.issues.addLabels({
40+
owner,
41+
repo,
42+
issue_number,
43+
labels: ['unapproved']
44+
});
45+
46+
console.log(`Added 'unapproved' label to issue #${issue_number}`);
47+
} else {
48+
console.log(`Issue #${issue_number} already has 'unapproved' label`);
49+
}
50+
} catch (error) {
51+
console.error(`Error processing issue #${issue_number}:`, error.message);
52+
throw error;
53+
}

.github/workflows/issue.yml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
name: Issue Auto Label (Reusable)
2+
3+
on:
4+
workflow_call:
5+
secrets:
6+
GITHUB_TOKEN:
7+
required: true
8+
9+
jobs:
10+
opened-issue-label:
11+
name: Adding Issue Label
12+
runs-on: ubuntu-latest
13+
14+
permissions:
15+
issues: write
16+
contents: read
17+
18+
steps:
19+
- name: Checkout only label config
20+
uses: actions/checkout@v4
21+
with:
22+
sparse-checkout: |
23+
.github/workflows/auto-label.json5
24+
sparse-checkout-cone-mode: false
25+
26+
- name: Auto label issue based on config
27+
uses: Renato66/auto-label@v3
28+
with:
29+
repo-token: ${{ secrets.GITHUB_TOKEN }}
30+
31+
- name: Post-process labels
32+
uses: actions/github-script@v7
33+
with:
34+
github-token: ${{ secrets.GITHUB_TOKEN }}
35+
script: |
36+
const { owner, repo } = context.repo;
37+
const issue_number = context.issue.number;
38+
39+
const { data: labels } =
40+
await github.rest.issues.listLabelsOnIssue({
41+
owner,
42+
repo,
43+
issue_number
44+
});
45+
46+
const hasAny = (names) =>
47+
labels.some(l => names.includes(l.name));
48+
49+
if (hasAny(["dependencies"])) {
50+
await github.rest.issues.addLabels({
51+
owner,
52+
repo,
53+
issue_number,
54+
labels: ["good first issue", "security"]
55+
});
56+
} else if (hasAny(["security", "ui/ux", "test", "ci/cd"])) {
57+
await github.rest.issues.addLabels({
58+
owner,
59+
repo,
60+
issue_number,
61+
labels: ["good first issue"]
62+
});
63+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: CodeRabbit Review Enforcement (Reusable)
2+
3+
on:
4+
workflow_call:
5+
secrets:
6+
GITHUB_TOKEN:
7+
required: true
8+
9+
jobs:
10+
check-coderabbit-approval:
11+
name: Check CodeRabbit Approval
12+
runs-on: ubuntu-latest
13+
14+
permissions:
15+
pull-requests: read
16+
17+
steps:
18+
- name: Wait for review status propagation
19+
run: sleep 30s
20+
shell: bash
21+
22+
- name: Check CodeRabbit approval
23+
uses: actions/github-script@v7
24+
with:
25+
github-token: ${{ secrets.GITHUB_TOKEN }}
26+
script: |
27+
const { owner, repo } = context.repo;
28+
const pull_number = context.payload.pull_request.number;
29+
30+
// Fetch all PR reviews
31+
const { data: reviews } = await github.rest.pulls.listReviews({
32+
owner,
33+
repo,
34+
pull_number
35+
});
36+
37+
// Identify CodeRabbit reviews (case-insensitive) and ignore COMMENTED
38+
const codeRabbitReviews = reviews.filter(review =>
39+
review.user?.login &&
40+
(
41+
review.user.login.toLowerCase().includes('coderabbit') ||
42+
review.user.login.toLowerCase().includes('coderabbitai')
43+
) &&
44+
review.state !== 'COMMENTED'
45+
);
46+
47+
if (codeRabbitReviews.length === 0) {
48+
core.setFailed('ERROR: CodeRabbit has not reviewed this PR.');
49+
return;
50+
}
51+
52+
// Sort newest → oldest
53+
codeRabbitReviews.sort(
54+
(a, b) => new Date(b.submitted_at) - new Date(a.submitted_at)
55+
);
56+
57+
const latestReview = codeRabbitReviews[0];
58+
59+
if (latestReview.state !== 'APPROVED') {
60+
core.setFailed(
61+
'ERROR: CodeRabbit approval is required before merging this PR.'
62+
);
63+
} else {
64+
console.log('Success: CodeRabbit has approved this PR.');
65+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
name: PR Target Workflow
2+
3+
on:
4+
workflow_call:
5+
secrets:
6+
GITHUB_TOKEN:
7+
required: true
8+
9+
jobs:
10+
PR-Greeting:
11+
name: Pull Request Greeting
12+
runs-on: ubuntu-latest
13+
14+
permissions:
15+
contents: read
16+
issues: read
17+
pull-requests: write
18+
19+
steps:
20+
- name: Add the PR Review Policy
21+
uses: thollander/actions-comment-pull-request@v3
22+
with:
23+
comment-tag: pr_review_policy
24+
message: |
25+
## Our Pull Request Approval Process
26+
27+
This PR will be reviewed according to our:
28+
29+
1. [Palisadoes Contributing Guidelines](https://developer.palisadoes.org/docs/contributor-guide/contributing)
30+
31+
2. [AI Usage Policy](https://developer.palisadoes.org/docs/contributor-guide/ai)
32+
33+
Your PR may be automatically closed if:
34+
35+
1. Our PR template isn't filled in correctly
36+
2. You haven't correctly linked your PR to an issue
37+
38+
👉 https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue
39+
40+
Thanks for contributing!
41+
42+
check-pr-issue:
43+
name: Check Correct PR Issue Assignment
44+
runs-on: ubuntu-latest
45+
needs: [PR-Greeting]
46+
47+
permissions:
48+
contents: read
49+
issues: read
50+
pull-requests: write
51+
52+
steps:
53+
- uses: actions/checkout@v4
54+
55+
- name: Check PR linked issue and assignee
56+
uses: arkid15r/check-pr-issue-action@0.1.3
57+
with:
58+
github_token: ${{ secrets.GITHUB_TOKEN }}
59+
close_pr_on_failure: 'true'
60+
check_issue_reference: 'true'
61+
require_assignee: 'true'
62+
no_assignee_message: 'The linked issue must be assigned to the PR author.'
63+
no_issue_message: 'The PR must be linked to an issue assigned to the PR author.'
64+
skip_users_file_path: '.github/workflows/config/check-pr-issue-skip-usernames.txt'

.github/workflows/stale.yml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
name: Mark stale issues and pull requests
2+
3+
on:
4+
workflow_call:
5+
6+
permissions:
7+
issues: write
8+
pull-requests: write
9+
10+
jobs:
11+
stale:
12+
name: Process Stale Issues and PRs
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- name: Run stale bot
17+
uses: actions/stale@v10
18+
with:
19+
repo-token: ${{ secrets.GITHUB_TOKEN }}
20+
21+
stale-issue-message: >
22+
This issue did not get any activity in the past 10 days and will be
23+
closed in 360 days if no update occurs. Please check if the develop
24+
branch has fixed it and report again or close the issue.
25+
26+
stale-pr-message: >
27+
This pull request did not get any activity in the past 10 days and
28+
will be closed in 360 days if no update occurs. Please verify it has
29+
no conflicts with the develop branch and rebase if needed.
30+
31+
close-issue-message: >
32+
This issue did not get any activity in the past 360 days and thus
33+
has been closed. Please check if the newest release or develop
34+
branch has it fixed.
35+
36+
close-pr-message: >
37+
This pull request did not get any activity in the past 360 days and
38+
thus has been closed.
39+
40+
stale-issue-label: no-issue-activity
41+
stale-pr-label: no-pr-activity
42+
43+
days-before-stale: 10
44+
days-before-close: 360
45+
46+
remove-stale-when-updated: true
47+
exempt-all-milestones: true
48+
exempt-pr-labels: wip
49+
exempt-issue-labels: wip
50+
operations-per-run: 200

0 commit comments

Comments
 (0)