Skip to content

Test for sync-status-across-projects GH action #26

Test for sync-status-across-projects GH action

Test for sync-status-across-projects GH action #26

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
}
}
}
}
}
}
}
`;
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}`);