Explorar o código

Update project automation workflow for PR (#452)

* Update project automation workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>

* Update workflow

Signed-off-by: hossainemruz <hossainemruz@gmail.com>
Emruz Hossain %!s(int64=3) %!d(string=hai) anos
pai
achega
0773fe303e
Modificáronse 1 ficheiros con 94 adicións e 5 borrados
  1. 94 5
      .github/workflows/project-automation-pr.yaml

+ 94 - 5
.github/workflows/project-automation-pr.yaml

@@ -37,8 +37,23 @@ jobs:
             }' -f org="$ORGANIZATION" -F number=$PROJECT_NUMBER > project_data.json
             }' -f org="$ORGANIZATION" -F number=$PROJECT_NUMBER > project_data.json
 
 
           echo 'PROJECT_ID='$(jq -r '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV
           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 '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_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 '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
       - name: Add PR to project
         env:
         env:
@@ -56,20 +71,94 @@ jobs:
 
 
           echo 'ITEM_ID='$item_id >> $GITHUB_ENV
           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'))<<EOF' >> $GITHUB_ENV
+
+      - name: Set "Type" field
         env:
         env:
           GITHUB_TOKEN: ${{secrets.PROJECT_AUTOMATION}}
           GITHUB_TOKEN: ${{secrets.PROJECT_AUTOMATION}}
         run: |
         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='
           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: {
               updateProjectNextItemField(input: {
                 projectId: $project
                 projectId: $project
                 itemId: $item
                 itemId: $item
                 fieldId: $field
                 fieldId: $field
-                value: $opt_id
+                value: $status_id
               }) {
               }) {
                 projectNextItem {
                 projectNextItem {
                   id
                   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