Skip to content

Commit b41d9c7

Browse files
committed
Update roadmap workflow
1 parent a48d5e9 commit b41d9c7

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
name: Update Roadmap Dates
2+
3+
on:
4+
pull_request:
5+
types: [labeled]
6+
7+
jobs:
8+
update-roadmap-dates:
9+
runs-on: ubuntu-latest
10+
if: |
11+
github.event.label.name == 'awaiting_tech_review' ||
12+
github.event.label.name == 'publish'
13+
14+
permissions:
15+
contents: read
16+
pull-requests: read
17+
repository-projects: write
18+
19+
steps:
20+
- name: Checkout repository
21+
uses: actions/checkout@v3
22+
23+
- name: Setup Node.js
24+
uses: actions/setup-node@v3
25+
with:
26+
node-version: '18.x'
27+
28+
- name: Install Octokit
29+
run: npm install @octokit/rest
30+
31+
- name: Debug Token
32+
run: echo "Token is set"
33+
env:
34+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
35+
36+
- name: Update Project Board Dates
37+
uses: actions/github-script@v6
38+
with:
39+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
40+
script: |
41+
const { Octokit } = require('@octokit/rest');
42+
const octokit = new Octokit({ auth:process.env.PROJECT_TOKEN });
43+
44+
const projectNumber = 4; // Your project number
45+
const orgName = 'ArmDeveloperEcosystem';
46+
const prNumber = context.payload.pull_request.number;
47+
const labelName = context.payload.label.name;
48+
49+
async function getProjectItemForPR() {
50+
// Get the project ID
51+
const projectQuery = `
52+
query {
53+
organization(login:"${orgName}") {
54+
projectV2(number:${projectNumber}) {
55+
id
56+
}
57+
}
58+
}
59+
`;
60+
61+
const projectResponse = await octokit.graphql(projectQuery);
62+
const projectId = projectResponse.organization.projectV2.id;
63+
64+
// Find the PR in the project
65+
const prQuery = `
66+
query {
67+
organization(login:"${orgName}") {
68+
projectV2(number:${projectNumber}) {
69+
items(first:100) {
70+
nodes {
71+
id
72+
content {
73+
... on PullRequest {
74+
number
75+
repository {
76+
name
77+
}
78+
}
79+
}
80+
}
81+
}
82+
}
83+
}
84+
}
85+
`;
86+
87+
const prResponse = await octokit.graphql(prQuery);
88+
const items = prResponse.organization.projectV2.items.nodes;
89+
90+
// Find the item that corresponds to this PR
91+
const item = items.find(item =>
92+
item.content &&
93+
item.content.number === prNumber &&
94+
item.content.repository.name === context.repo.repo
95+
);
96+
97+
return { projectId, itemId:item ? item.id:null };
98+
}
99+
100+
async function getFieldId(projectId, fieldName) {
101+
const fieldsQuery = `
102+
query {
103+
node(id:"${projectId}") {
104+
... on ProjectV2 {
105+
fields(first:20) {
106+
nodes {
107+
... on ProjectV2Field {
108+
id
109+
name
110+
}
111+
... on ProjectV2IterationField {
112+
id
113+
name
114+
}
115+
... on ProjectV2SingleSelectField {
116+
id
117+
name
118+
}
119+
... on ProjectV2DateField {
120+
id
121+
name
122+
}
123+
}
124+
}
125+
}
126+
}
127+
}
128+
`;
129+
130+
const fieldsResponse = await octokit.graphql(fieldsQuery);
131+
const fields = fieldsResponse.node.fields.nodes;
132+
const field = fields.find(f => f.name === fieldName);
133+
134+
return field ? field.id :null;
135+
}
136+
137+
async function updateDateField(projectId, itemId, fieldId, date) {
138+
const mutation = `
139+
mutation {
140+
updateProjectV2ItemFieldValue(
141+
input:{
142+
projectId:"${projectId}"
143+
itemId:"${itemId}"
144+
fieldId:"${fieldId}"
145+
value:{
146+
date:"${date}"
147+
}
148+
}
149+
) {
150+
projectV2Item {
151+
id
152+
}
153+
}
154+
}
155+
`;
156+
157+
return await octokit.graphql(mutation);
158+
}
159+
160+
async function main() {
161+
try {
162+
const { projectId, itemId } = await getProjectItemForPR();
163+
if (!itemId) {
164+
console.log('PR not found in project board');
165+
return;
166+
}
167+
168+
const today = new Date().toISOString().split('T')[0]; // YYYY-MM-DD format
169+
170+
if (labelName === 'awaiting_tech_review') {
171+
const startDateFieldId = await getFieldId(projectId, 'Start Date');
172+
if (startDateFieldId) {
173+
await updateDateField(projectId, itemId, startDateFieldId, today);
174+
console.log('Updated Start Date to', today);
175+
} else {
176+
console.log('Start Date field not found');
177+
}
178+
} else if (labelName === 'publish') {
179+
const publishDateFieldId = await getFieldId(projectId, 'Publish Date');
180+
if (publishDateFieldId) {
181+
await updateDateField(projectId, itemId, publishDateFieldId, today);
182+
console.log('Updated Publish Date to', today);
183+
} else {
184+
console.log('Publish Date field not found');
185+
}
186+
}
187+
} catch (error) {
188+
console.error('Error updating project board:', error);
189+
core.setFailed(`Error updating project board:${error.message}`);
190+
}
191+
}

0 commit comments

Comments
 (0)