Skip to content

Commit 944c84f

Browse files
committed
WIP
1 parent 1ad36a5 commit 944c84f

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed
+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
name: Sync Project Status
2+
3+
on:
4+
projects_v2_item:
5+
types: [edited]
6+
7+
jobs:
8+
sync-status:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/github-script@v6
12+
with:
13+
github-token: ${{ secrets.PROJECTS_PAT }}
14+
script: |
15+
// 프로젝트 정보 가져오기
16+
const getProjectInfo = async (orgName, projectNumber) => {
17+
const query = `
18+
query($orgName: String!, $projectNumber: Int!) {
19+
organization(login: $orgName) {
20+
projectV2(number: $projectNumber) {
21+
id
22+
field(name: "Status") {
23+
... on ProjectV2SingleSelectField {
24+
id
25+
options {
26+
id
27+
name
28+
}
29+
}
30+
}
31+
}
32+
}
33+
}
34+
`;
35+
36+
const variables = {
37+
orgName: orgName,
38+
projectNumber: projectNumber
39+
};
40+
41+
return await github.graphql(query, variables);
42+
};
43+
44+
// 아이템의 현재 상태 가져오기
45+
const getItemStatus = async (projectId, itemId) => {
46+
const query = `
47+
query($projectId: ID!, $itemId: ID!) {
48+
node(id: $projectId) {
49+
... on ProjectV2 {
50+
item(id: $itemId) {
51+
id
52+
fieldValues(first: 100) {
53+
nodes {
54+
... on ProjectV2ItemFieldSingleSelectValue {
55+
field {
56+
... on ProjectV2SingleSelectField {
57+
name
58+
}
59+
}
60+
optionId
61+
}
62+
}
63+
}
64+
}
65+
}
66+
}
67+
}
68+
`;
69+
70+
const variables = {
71+
projectId: projectId,
72+
itemId: itemId
73+
};
74+
75+
return await github.graphql(query, variables);
76+
};
77+
78+
// 상태 업데이트
79+
const updateStatus = async (projectId, itemId, fieldId, optionId) => {
80+
const mutation = `
81+
mutation($input: UpdateProjectV2ItemFieldValueInput!) {
82+
updateProjectV2ItemFieldValue(input: $input) {
83+
projectV2Item {
84+
id
85+
}
86+
}
87+
}
88+
`;
89+
90+
const variables = {
91+
input: {
92+
projectId: projectId,
93+
itemId: itemId,
94+
fieldId: fieldId,
95+
value: {
96+
singleSelectOptionId: optionId
97+
}
98+
}
99+
};
100+
101+
return await github.graphql(mutation, variables);
102+
};
103+
104+
try {
105+
// 조직과 프로젝트 정보 설정
106+
const orgName = 'NineChronicles';
107+
const sourceProjectNumber = 97; // 소스 프로젝트 번호
108+
const targetProjectNumber = 121; // 대상 프로젝트 번호
109+
110+
// 프로젝트 정보 가져오기
111+
const sourceProject = await getProjectInfo(orgName, sourceProjectNumber);
112+
const targetProject = await getProjectInfo(orgName, targetProjectNumber);
113+
114+
// 현재 아이템의 상태 가져오기
115+
const itemStatus = await getItemStatus(
116+
sourceProject.organization.projectV2.id,
117+
context.payload.projects_v2_item.id
118+
);
119+
120+
// 상태 필드 값 찾기
121+
const statusValue = itemStatus.node.item.fieldValues.nodes.find(
122+
node => node.field?.name === 'Status'
123+
);
124+
125+
if (statusValue) {
126+
// 대상 프로젝트에 상태 업데이트
127+
await updateStatus(
128+
targetProject.organization.projectV2.id,
129+
context.payload.projects_v2_item.id,
130+
targetProject.organization.projectV2.field.id,
131+
statusValue.optionId
132+
);
133+
134+
console.log('프로젝트 상태가 성공적으로 동기화되었습니다.');
135+
}
136+
} catch (error) {
137+
console.error('상태 동기화 중 오류 발생:', error);
138+
console.error(error.message);
139+
}

0 commit comments

Comments
 (0)