.github/workflows/issue-automation.yml
name: Automate Project Issues on: issues: types: - opened - reopened - assigned - closed jobs: manage_issues: runs-on: ubuntu-24.04-arm steps: - name: Generate token id: generate-token uses: actions/create-github-app-token@v1 with: app-id: ${{ vars.APP_ID }} private-key: ${{ secrets.APP_PEM }} - name: Get project data env: GH_TOKEN: ${{ steps.generate-token.outputs.token }} ORGANIZATION: ohcnetwork PROJECT_NUMBER: 4 run: | gh api graphql -f query=' query($org: String!, $number: Int!) { organization(login: $org) { projectV2(number: $number) { id fields(first: 20) { nodes { ... on ProjectV2Field { id name } ... on ProjectV2SingleSelectField { id name options { id name } } } } } } }' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name=="Status") | .id' project_data.json) >> $GITHUB_ENV echo 'TRIAGE_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name=="Status") | .options[] | select(.name=="Triage") | .id' project_data.json) >> $GITHUB_ENV echo 'IN_PROGRESS_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name=="Status") | .options[] | select(.name=="In Progress") | .id' project_data.json) >> $GITHUB_ENV echo 'DONE_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name=="Status") | .options[] | select(.name=="Done") | .id' project_data.json) >> $GITHUB_ENV - name: Add Issue to Project env: GH_TOKEN: ${{ steps.generate-token.outputs.token }} ISSUE_ID: ${{ github.event.issue.node_id }} run: | item_id="$( gh api graphql -f query=' mutation($project:ID!, $issue:ID!) { addProjectV2ItemById(input: {projectId: $project, contentId: $issue}) { item { id } } }' -f project=$PROJECT_ID -f issue=$ISSUE_ID --jq '.data.addProjectV2ItemById.item.id')" echo 'ITEM_ID='$item_id >> $GITHUB_ENV - name: Update Issue Status env: GH_TOKEN: ${{ steps.generate-token.outputs.token }} run: | if [[ "${{ github.event.action }}" == "opened" || "${{ github.event.action }}" == "reopened" ]]; then gh api graphql -f query=' mutation($project: ID!, $item: ID!, $status_field: ID!, $triage_value: String!) { updateProjectV2ItemFieldValue(input: { projectId: $project itemId: $item fieldId: $status_field value: { singleSelectOptionId: $triage_value } }) { projectV2Item { id } } }' -f project=$PROJECT_ID -f item=$ITEM_ID -f status_field=$STATUS_FIELD_ID -f triage_value=${{ env.TRIAGE_OPTION_ID }} elif [[ "${{ github.event.action }}" == "assigned" ]]; then gh api graphql -f query=' mutation($project: ID!, $item: ID!, $status_field: ID!, $in_progress_value: String!) { updateProjectV2ItemFieldValue(input: { projectId: $project itemId: $item fieldId: $status_field value: { singleSelectOptionId: $in_progress_value } }) { projectV2Item { id } } }' -f project=$PROJECT_ID -f item=$ITEM_ID -f status_field=$STATUS_FIELD_ID -f in_progress_value=${{ env.IN_PROGRESS_OPTION_ID }} elif [[ "${{ github.event.action }}" == "closed" && "${{ github.event.issue.state_reason }}" == "completed" ]]; then gh api graphql -f query=' mutation($project: ID!, $item: ID!, $status_field: ID!, $done_value: String!) { updateProjectV2ItemFieldValue(input: { projectId: $project itemId: $item fieldId: $status_field value: { singleSelectOptionId: $done_value } }) { projectV2Item { id } } }' -f project=$PROJECT_ID -f item=$ITEM_ID -f status_field=$STATUS_FIELD_ID -f done_value=${{ env.DONE_OPTION_ID }} elif [[ "${{ github.event.action }}" == "closed" && \ ("${{ github.event.issue.state_reason }}" == "not_planned" || \ "${{ github.event.issue.state_reason }}" == "duplicate") ]]; then gh api graphql -f query=' mutation($project: ID!, $item: ID!) { deleteProjectV2Item(input: { projectId: $project itemId: $item }) { deletedItemId } }' -f project=$PROJECT_ID -f item=$ITEM_ID fi