-
Notifications
You must be signed in to change notification settings - Fork 0
130 lines (115 loc) · 4.78 KB
/
sync-status-across-projects.yml
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
name: Sync Status Across Projects
on:
issues:
types: [edited, labeled, unlabeled, closed, reopened]
jobs:
sync-status:
runs-on: ubuntu-latest
steps:
- name: Sync Status Field
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const orgName = "${{ github.repository_owner }}";
const sourceProjectNumber = 1314;
const sourceProjectId = 'PVT_kwDOAFK5-84Ak8oz';
const targetProjectNumber = 1514;
const targetProjectId = 'PVT_kwDOAFK5-84Ar1s4';
// Function to fetch fields for a project
const fetchProjectFields = async (projectNumber, orgName) => {
const query = `
query($orgName: String!, $projectNumber: Int!) {
organization(login: $orgName) {
projectV2(number: $projectNumber) {
id
fields(first: 20) {
nodes {
... on ProjectV2SingleSelectField {
id
name
options {
id
name
}
}
}
}
}
}
}
`;
console.log("GraphQL Query:", query);
const { data } = await github.graphql(query, {
orgName: orgName,
projectNumber: projectNumber
});
return data;
};
// Fetch fields for the source project
const sourceProjectData = await fetchProjectFields(sourceProjectNumber, orgName);
console.log("Source Project Fields:", sourceProjectData);
// Fetch fields for the target project
const targetProjectData = await fetchProjectFields(targetProjectNumber, orgName);
console.log("Target Project Fields:", targetProjectData);
// Find the 'Status' field ID from the source project
const statusField = sourceProjectData.organization.projectV2.fields.nodes.find(field => field.name === 'Status');
if (!statusField) {
console.log("No 'Status' field found in source project.");
return;
}
const statusFieldId = statusField.id;
console.log(`Found 'Status' field ID in source project: ${statusFieldId}`);
// Fetch the current issue status from the source project
const issueNodeId = context.payload.issue.node_id;
// Fetch the status field value for the current issue in the source project
const { resource } = await github.graphql(`
query($projectId: ID!, $issueId: ID!) {
node(id: $issueId) {
... on Issue {
projectV2Items(first: 10) {
nodes {
fieldValues(first: 10) {
nodes {
projectV2Field {
id
}
value
}
}
}
}
}
}
}
`, {
projectId: sourceProjectId,
issueId: issueNodeId
});
// Extract the current status from the source project
const currentStatus = resource.node.projectV2Items.nodes.find(item => item.fieldValues.nodes.some(field => field.projectV2Field.id === statusFieldId))?.fieldValues.nodes.find(field => field.projectV2Field.id === statusFieldId)?.value;
if (!currentStatus) {
console.log("No status field found or status has not changed.");
return;
}
console.log(`Current status in source project: ${currentStatus}`);
// Now sync the status field in the target project
await github.graphql(`
mutation($projectId: ID!, $contentId: ID!, $status: String!) {
updateProjectV2ItemFieldValue(input: {
projectId: $projectId,
itemId: $contentId,
fieldId: $statusFieldId,
value: $status
}) {
projectV2Item {
id
}
}
}
`, {
projectId: targetProjectId,
contentId: issueNodeId,
status: currentStatus
});
console.log(`Status synced successfully to target project for issue ID: ${issueNodeId}`);