Skip to content

Commit e3589ca

Browse files
committed
ci: 🔄 amĂ©liore workflow vĂ©rification issue-PR avec nouveaux dĂ©clencheurs
## Pourquoi les changements ont Ă©tĂ© faits : - Augmente la rĂ©activitĂ© du workflow aux changements d'Ă©tat des issues - Permet de re-vĂ©rifier les PR quand des issues sont ouvertes/fermĂ©es - AmĂ©liore la dĂ©tection des liaisons créées via l'interface GitHub - GĂšre mieux les cas oĂč les liaisons changent aprĂšs crĂ©ation de la PR ## Quelles modifications ont Ă©tĂ© apportĂ©es : - Ajoute Ă©vĂ©nements issues (opened, closed, reopened) aux dĂ©clencheurs - Logique conditionnelle pour gĂ©rer PR et issues events diffĂ©remment - VĂ©rification de toutes les PR ouvertes lors d'Ă©vĂ©nements issues - Maintient l'exception pour develop vers main dans tous les cas - Messages d'erreur plus prĂ©cis avec numĂ©ro de PR - Detection GraphQL des liaisons via interface GitHub"
1 parent aec733d commit e3589ca

File tree

1 file changed

+75
-53
lines changed

1 file changed

+75
-53
lines changed

‎.github/workflows/check-pr-linked-issue.yml‎

Lines changed: 75 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,98 @@ name: Check PR linked to issue
22

33
on:
44
pull_request:
5-
types: [opened, edited, synchronize]
5+
types: [opened, edited, synchronize, reopened, ready_for_review]
6+
# Relancer quand une issue est fermée/ouverte (peut affecter les liaisons)
7+
issues:
8+
types: [opened, closed, reopened]
69

710
jobs:
811
check-linked-issue:
912
runs-on: ubuntu-latest
1013
# Exception : les PR de develop vers main n'ont pas besoin d'ĂȘtre liĂ©es Ă  une issue
11-
if: github.head_ref != 'develop' || github.base_ref != 'main'
14+
if: (github.event_name == 'pull_request' && (github.head_ref != 'develop' || github.base_ref != 'main')) || github.event_name == 'issues'
1215
steps:
1316
- name: Check if PR is linked to an issue
1417
uses: actions/github-script@v7
1518
with:
1619
script: |
17-
const { data: pullRequest } = await github.rest.pulls.get({
18-
owner: context.repo.owner,
19-
repo: context.repo.repo,
20-
pull_number: context.issue.number,
21-
});
22-
23-
// Vérifier les issues liées via l'interface GitHub avec GraphQL
24-
const query = `
25-
query($owner: String!, $repo: String!, $number: Int!) {
26-
repository(owner: $owner, name: $repo) {
27-
pullRequest(number: $number) {
28-
closingIssuesReferences(first: 50) {
29-
nodes {
30-
number
31-
title
32-
}
33-
}
34-
}
35-
}
36-
}
37-
`;
38-
39-
let linkedIssuesFromUI = [];
40-
try {
41-
const result = await github.graphql(query, {
20+
let pullRequests = [];
21+
22+
if (context.eventName === 'issues') {
23+
// Si l'événement vient d'une issue, vérifier toutes les PR ouvertes
24+
const { data: prs } = await github.rest.pulls.list({
25+
owner: context.repo.owner,
26+
repo: context.repo.repo,
27+
state: 'open'
28+
});
29+
pullRequests = prs.filter(pr => pr.head.ref !== 'develop' || pr.base.ref !== 'main');
30+
} else {
31+
// ÉvĂ©nement normal de PR
32+
const { data: pullRequest } = await github.rest.pulls.get({
4233
owner: context.repo.owner,
4334
repo: context.repo.repo,
44-
number: context.issue.number,
35+
pull_number: context.issue.number,
4536
});
46-
linkedIssuesFromUI = result.repository.pullRequest.closingIssuesReferences.nodes;
47-
} catch (error) {
48-
console.log('Erreur lors de la récupération des issues liées via GraphQL:', error.message);
37+
pullRequests = [pullRequest];
4938
}
5039
51-
// Vérifier dans le corps de la PR (mots-clés comme "closes #123", "fixes #456")
52-
const prBody = pullRequest.body || '';
53-
const prTitle = pullRequest.title || '';
54-
55-
// Pattern pour détecter les références aux issues
56-
const issueKeywords = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?|ref(?:erences?)?|see|relate[sd]?(?:\s+to)?)\s*(?:#(\d+)|https?:\/\/github\.com\/[^\/]+\/[^\/]+\/issues\/(\d+))/gi;
40+
for (const pullRequest of pullRequests) {
41+
console.log(`🔍 VĂ©rification de la PR #${pullRequest.number}: ${pullRequest.title}`);
42+
43+
// Vérifier les issues liées via l'interface GitHub avec GraphQL
44+
const query = `
45+
query($owner: String!, $repo: String!, $number: Int!) {
46+
repository(owner: $owner, name: $repo) {
47+
pullRequest(number: $number) {
48+
closingIssuesReferences(first: 50) {
49+
nodes {
50+
number
51+
title
52+
}
53+
}
54+
}
55+
}
56+
}
57+
`;
5758
58-
const bodyMatches = prBody.match(issueKeywords);
59-
const titleMatches = prTitle.match(issueKeywords);
59+
let linkedIssuesFromUI = [];
60+
try {
61+
const result = await github.graphql(query, {
62+
owner: context.repo.owner,
63+
repo: context.repo.repo,
64+
number: pullRequest.number,
65+
});
66+
linkedIssuesFromUI = result.repository.pullRequest.closingIssuesReferences.nodes;
67+
} catch (error) {
68+
console.log('Erreur lors de la récupération des issues liées via GraphQL:', error.message);
69+
}
6070
61-
// Vérifier aussi les numéros d'issues simples dans le titre (ex: "feat: #123 - nouvelle fonctionnalité")
62-
const simpleIssueRef = /(?:^|\s)#(\d+)(?:\s|$|-)/g;
63-
const titleIssueRefs = prTitle.match(simpleIssueRef);
71+
// Vérifier dans le corps de la PR (mots-clés comme "closes #123", "fixes #456")
72+
const prBody = pullRequest.body || '';
73+
const prTitle = pullRequest.title || '';
74+
75+
// Pattern pour détecter les références aux issues
76+
const issueKeywords = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?|ref(?:erences?)?|see|relate[sd]?(?:\s+to)?)\s*(?:#(\d+)|https?:\/\/github\.com\/[^\/]+\/[^\/]+\/issues\/(\d+))/gi;
77+
78+
const bodyMatches = prBody.match(issueKeywords);
79+
const titleMatches = prTitle.match(issueKeywords);
80+
81+
// Vérifier aussi les numéros d'issues simples dans le titre (ex: "feat: #123 - nouvelle fonctionnalité")
82+
const simpleIssueRef = /(?:^|\s)#(\d+)(?:\s|$|-)/g;
83+
const titleIssueRefs = prTitle.match(simpleIssueRef);
6484
65-
const hasLinkedIssues = linkedIssuesFromUI.length > 0 || bodyMatches || titleMatches || titleIssueRefs;
85+
const hasLinkedIssues = linkedIssuesFromUI.length > 0 || bodyMatches || titleMatches || titleIssueRefs;
6686
67-
if (!hasLinkedIssues) {
68-
core.setFailed('❌ Cette PR doit ĂȘtre liĂ©e Ă  une issue. Utilisez des mots-clĂ©s comme "closes #123" ou "fixes #456" dans la description, rĂ©fĂ©rencez une issue dans le titre avec "#123", ou liez une issue via l\'interface GitHub.');
69-
} else {
70-
console.log('✅ PR correctement liĂ©e Ă  une ou plusieurs issues');
71-
if (linkedIssuesFromUI.length > 0) {
72-
console.log('Issues liées via l\'interface GitHub:', linkedIssuesFromUI.map(issue => `#${issue.number} - ${issue.title}`));
87+
if (!hasLinkedIssues) {
88+
core.setFailed(`❌ La PR #${pullRequest.number} doit ĂȘtre liĂ©e Ă  une issue. Utilisez des mots-clĂ©s comme "closes #123" ou "fixes #456" dans la description, rĂ©fĂ©rencez une issue dans le titre avec "#123", ou liez une issue via l'interface GitHub.`);
89+
break; // ArrĂȘter au premier Ă©chec
90+
} else {
91+
console.log(`✅ PR #${pullRequest.number} correctement liĂ©e Ă  une ou plusieurs issues`);
92+
if (linkedIssuesFromUI.length > 0) {
93+
console.log('Issues liées via l\'interface GitHub:', linkedIssuesFromUI.map(issue => `#${issue.number} - ${issue.title}`));
94+
}
95+
if (bodyMatches) console.log('Issues trouvées dans le body:', bodyMatches);
96+
if (titleMatches) console.log('Issues trouvées dans le titre:', titleMatches);
97+
if (titleIssueRefs) console.log('Références d\'issues dans le titre:', titleIssueRefs);
7398
}
74-
if (bodyMatches) console.log('Issues trouvées dans le body:', bodyMatches);
75-
if (titleMatches) console.log('Issues trouvées dans le titre:', titleMatches);
76-
if (titleIssueRefs) console.log('Références d\'issues dans le titre:', titleIssueRefs);
77-
}
99+
}

0 commit comments

Comments
 (0)