1818 - name : Checkout
1919 uses : actions/checkout@v4
2020
21- # Step 1: Extract linked issue(s) from PR
21+ # Step 1: Extract linked issues
2222 - name : Extract linked issue(s)
2323 id : extract-issues
2424 uses : actions/github-script@v7
4545 }
4646 }
4747
48- // ✅ Set output safely as JSON string
4948 core.setOutput('result', JSON.stringify({ issues: Array.from(issueNumbers), pr: prNumber }));
5049
51- # Step 2: Sync metadata to PR
50+ # Step 2: Sync metadata
5251 - name : Sync Issue Metadata to PR
5352 uses : actions/github-script@v7
5453 env :
5857 script : |
5958 const core = require('@actions/core');
6059
61- // Safely parse JSON
60+ // Parse JSON safely
6261 let data;
6362 try {
6463 data = JSON.parse(process.env.RESULT_JSON);
@@ -72,58 +71,60 @@ jobs:
7271 const issueNumbers = data.issues || [];
7372
7473 if (!issueNumbers.length) {
75- console.log("No linked issues found");
74+ console.log("No linked issues found. ");
7675 return;
7776 }
7877
7978 for (const issueNumber of issueNumbers) {
79+ let issue;
8080 try {
81- const { data: issue } = await github.rest.issues.get({
81+ const res = await github.rest.issues.get({
8282 owner: context.repo.owner,
8383 repo: context.repo.repo,
8484 issue_number: parseInt(issueNumber)
8585 });
86+ issue = res.data;
87+ } catch (err) {
88+ console.warn(`Cannot access Issue #${issueNumber}, skipping sync.`);
89+ continue; // skip to next issue
90+ }
8691
87- console.log(`Syncing metadata from Issue #${issueNumber} to PR #${prNumber}`);
88-
89- // --- Sync Labels ---
90- const issueLabels = issue.labels.map(l => l.name);
91- const { data: pr } = await github.rest.pulls.get({
92- owner: context.repo.owner,
93- repo: context.repo.repo,
94- pull_number: prNumber
95- });
96- const currentPRLabels = pr.labels.map(l => l.name);
97- const combinedLabels = Array.from(new Set([...currentPRLabels, ...issueLabels]));
98-
99- await github.rest.issues.addLabels({
92+ console.log(`Syncing metadata from Issue #${issueNumber} to PR #${prNumber}`);
93+
94+ // --- Sync Labels ---
95+ const issueLabels = issue.labels.map(l => l.name);
96+ const { data: pr } = await github.rest.pulls.get({
97+ owner: context.repo.owner,
98+ repo: context.repo.repo,
99+ pull_number: prNumber
100+ });
101+ const currentPRLabels = pr.labels.map(l => l.name);
102+ const combinedLabels = Array.from(new Set([...currentPRLabels, ...issueLabels]));
103+
104+ await github.rest.issues.addLabels({
105+ owner: context.repo.owner,
106+ repo: context.repo.repo,
107+ issue_number: prNumber,
108+ labels: combinedLabels
109+ });
110+ console.log(`Labels applied: ${combinedLabels.join(', ')}`);
111+
112+ // --- Sync Milestone ---
113+ if (issue.milestone) {
114+ await github.rest.issues.update({
100115 owner: context.repo.owner,
101116 repo: context.repo.repo,
102117 issue_number: prNumber,
103- labels: combinedLabels
118+ milestone: issue.milestone.number
104119 });
105- console.log(`Labels applied: ${combinedLabels.join(', ')}`);
106-
107- // --- Sync Milestone ---
108- if (issue.milestone) {
109- await github.rest.issues.update({
110- owner: context.repo.owner,
111- repo: context.repo.repo,
112- issue_number: prNumber,
113- milestone: issue.milestone.number
114- });
115- console.log(`Milestone synced: ${issue.milestone.title}`);
116- }
117-
118- // --- Optional: Add a comment on PR ---
119- await github.rest.issues.createComment({
120- owner: context.repo.owner,
121- repo: context.repo.repo,
122- issue_number: prNumber,
123- body: `✅ Synchronized metadata from Issue #${issueNumber}:\nLabels: ${issueLabels.join(', ')}\nMilestone: ${issue.milestone ? issue.milestone.title : 'None'}`
124- });
125-
126- } catch (error) {
127- console.error(`Error syncing issue #${issueNumber} to PR #${prNumber}:`, error.message);
120+ console.log(`Milestone synced: ${issue.milestone.title}`);
128121 }
122+
123+ // --- Add a comment on PR ---
124+ await github.rest.issues.createComment({
125+ owner: context.repo.owner,
126+ repo: context.repo.repo,
127+ issue_number: prNumber,
128+ body: `✅ Synchronized metadata from Issue #${issueNumber}:\nLabels: ${issueLabels.join(', ')}\nMilestone: ${issue.milestone ? issue.milestone.title : 'None'}`
129+ });
129130 }
0 commit comments