From 0773fe303eb3593452f56f801a2b3b6cc2ddedd1 Mon Sep 17 00:00:00 2001 From: Emruz Hossain Date: Sat, 30 Oct 2021 02:33:40 +0600 Subject: [PATCH] Update project automation workflow for PR (#452) * Update project automation workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz * Update workflow Signed-off-by: hossainemruz --- .github/workflows/project-automation-pr.yaml | 99 +++++++++++++++++++- 1 file changed, 94 insertions(+), 5 deletions(-) diff --git a/.github/workflows/project-automation-pr.yaml b/.github/workflows/project-automation-pr.yaml index 9c1b887..9b65697 100644 --- a/.github/workflows/project-automation-pr.yaml +++ b/.github/workflows/project-automation-pr.yaml @@ -37,8 +37,23 @@ jobs: }' -f org="$ORGANIZATION" -F number=$PROJECT_NUMBER > project_data.json echo 'PROJECT_ID='$(jq -r '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV + + # Read the ID of the "Type" field options echo 'TYPE_ID='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.id' project_data.json) >> $GITHUB_ENV - echo 'OPTION_PR='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.settings | fromjson.options[] | select(.name=="Pull Requests") |.id' project_data.json) >> $GITHUB_ENV + echo 'PROJECT_ID='$(jq -r '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV + echo 'TYPE_ID='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.id' project_data.json) >> $GITHUB_ENV + echo 'TYPE_BUG='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.settings | fromjson.options[] | select(.name=="Bug") |.id' project_data.json) >> $GITHUB_ENV + echo 'TYPE_FEATURE='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.settings | fromjson.options[] | select(.name=="Feature") |.id' project_data.json) >> $GITHUB_ENV + echo 'TYPE_ENHANCEMENT='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.settings | fromjson.options[] | select(.name=="Enhancement") |.id' project_data.json) >> $GITHUB_ENV + echo 'TYPE_DOCUMENTATION='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.settings | fromjson.options[] | select(.name=="Documentation") |.id' project_data.json) >> $GITHUB_ENV + echo 'TYPE_TRANSLATION='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Type") |.settings | fromjson.options[] | select(.name=="Translation") |.id' project_data.json) >> $GITHUB_ENV + + # Read the id of the "Status" field options + echo 'STATUS_ID='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_TODO='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Todo") |.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_IN_PROGRESS='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="In Progress") |.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_READY_FOR_REVIEW='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Ready for Review") |.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_DONE='$(jq -r '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Done") |.id' project_data.json) >> $GITHUB_ENV - name: Add PR to project env: @@ -56,20 +71,94 @@ jobs: echo 'ITEM_ID='$item_id >> $GITHUB_ENV - - name: Set "Type" to the PR + - name: Export Labels + env: + PR_DATA: ${{ toJson(github.event.pull_request) }} + run: | + echo 'LABELS=($(echo "$PR_DATA" | jq '.labels[]' | jq -r '.name'))<> $GITHUB_ENV + + - name: Set "Type" field env: GITHUB_TOKEN: ${{secrets.PROJECT_AUTOMATION}} run: | + # Only execute this step if the PR contains at least one label + if [ "${#LABELS[@]}" -gt 0 ]; then + + # Let by default the type is "Bug" + OPTION_ID=$TYPE_BUG + + # If it has "feature" label then set the type to "Feature" + if [[ "${LABELS[*]}" =~ "feature" ]]; then + OPTION_ID=$TYPE_FEATURE + fi + + # If it has "enhancement" label then set the type to "Enhancement" + if [[ "${LABELS[*]}" =~ "enhancement" ]]; then + OPTION_ID=$TYPE_ENHANCEMENT + fi + + # If it has "documentation" label then set the type to "Documentation" + if [[ "${LABELS[*]}" =~ "documentation" ]]; then + OPTION_ID=$TYPE_DOCUMENTATION + fi + + # If it has "translation" label then set the type to "Translation" + if [[ "${LABELS[*]}" =~ "translation" ]]; then + OPTION_ID=$TYPE_TRANSLATION + fi + + # Set the "Type" field to appropriate option + gh api graphql -f query=' + mutation ($project: ID!, $item: ID!, $field: ID!, $opt_id: ID!) { + updateProjectNextItemField(input: { + projectId: $project + itemId: $item + fieldId: $field + value: $opt_id + }) { + projectNextItem { + id + } + } + }' -f project="$PROJECT_ID" -f item="$ITEM_ID" -f field="$TYPE_ID" -f opt_id="$OPTION_ID" --silent + fi + + - name: Set "Status" field + env: + GITHUB_TOKEN: ${{secrets.PROJECT_AUTOMATION}} + run: | + MERGED=${{github.event.pull_request.merged}} + STATE=${{github.event.pull_request.state}} + REVIEWERS=${{github.event.pull_request.requested_reviewers}} + DRAFT=${{github.event.pull_request.draft}} + + echo "Merged: $MERGED" + echo "State: $STATE" + echo "Draft: $DRAFT" + echo "Reviewer: $REVIEWER" + + OPTION_ID=$STATUS_TODO + + if [[ ("${MERGED}" == "true") || ("${STATUS}" == "closed") ]] + then + OPTION_ID=$STATUS_DONE + elif [[ ${#REVIEWERS[@]} -gt 0 ]] + then + OPTION_ID=$STATUS_READY_FOR_REVIEW + else + OPTION_ID=$STATUS_IN_PROGRESS + fi + gh api graphql -f query=' - mutation ($project: ID!, $item: ID!, $field: ID!, $opt_id: ID!) { + mutation ($project: ID!, $item: ID!, $field: ID!, $status_id: ID!) { updateProjectNextItemField(input: { projectId: $project itemId: $item fieldId: $field - value: $opt_id + value: $status_id }) { projectNextItem { id } } - }' -f project="$PROJECT_ID" -f item="$ITEM_ID" -f field="$TYPE_ID" -f opt_id="$OPTION_PR" --silent + }' -f project="$PROJECT_ID" -f item="$ITEM_ID" -f field="$STATUS_ID" -f status_id="$OPTION_ID" --silent