@@ -2,76 +2,98 @@ name: Check PR linked to issue
22
33on :
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
710jobs :
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