Browse Source

chore: add Projects Beta GitHub Action

Marc Cornellà 3 years ago
parent
commit
d1c07f9569
1 changed files with 134 additions and 0 deletions
  1. 134 0
      .github/workflows/project.yml

+ 134 - 0
.github/workflows/project.yml

@@ -0,0 +1,134 @@
+name: Project tracking
+on:
+  issues:
+    types: [opened]
+  pull_request_target:
+    types: [opened, synchronize]
+
+jobs:
+  add-to-project:
+    name: Add to project
+    runs-on: ubuntu-latest
+    steps:
+      - name: Generate token
+        id: generate_token
+        uses: tibdex/github-app-token@36464acb844fc53b9b8b2401da68844f6b05ebb0
+        with:
+          app_id: ${{ secrets.OHMYZSH_BOT_APP_ID }}
+          private_key: ${{ secrets.OHMYZSH_BOT_APP_PEM }}
+      - name: Read project data
+        env:
+          GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
+          ORGANIZATION: ohmyzsh
+          PROJECT_NUMBER: "1"
+        run: |
+          # Get Project data
+          gh api graphql -f query='
+            query($org: String!, $number: Int!) {
+              organization(login: $org){
+                projectNext(number: $number) {
+                  id
+                  fields(first:20) {
+                    nodes {
+                      id
+                      name
+                    }
+                  }
+                }
+              }
+            }
+          ' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
+
+          # Parse project data
+          cat >> $GITHUB_ENV <<EOF
+          PROJECT_ID=$(jq '.data.organization.projectNext.id' project_data.json)
+          PLUGIN_FIELD_ID=$(jq '.data.organization.projectNext.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
+          THEME_FIELD_ID=$(jq '.data.organization.projectNext.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
+          EOF
+      - name: Add to project
+        env:
+          GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
+          ISSUE_ID: ${{ github.event.issue.node_id }}
+          PR_ID: ${{ github.event.pull_request.node_id }}
+        run: |
+          item_id="$(gh api graphql -f query='
+            mutation($project: ID!, $item: ID!) {
+              addProjectNextItem(input: {projectId: $project, contentId: $item}) {
+                projectNextItem {
+                  id
+                }
+              }
+            }
+          ' -f project=$PROJECT_ID -f item=${ISSUE_ID:-$PR_ID} --jq '.data.addProjectNextItem.projectNextItem.id')"
+
+          echo "ITEM_ID=$item_id" >> $GITHUB_ENV
+      - name: Classify Pull Request
+        if: github.event_name == 'pull_request_target'
+        env:
+          GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
+        run: |
+          gh pr view ${{ github.event.pull_request.number }} --json files --jq '.files.[].path' | awk -F/ '
+            /^plugins\// {
+              plugins[$2] = 1
+            }
+            /^themes\// {
+              gsub(/\.zsh-theme$/, "", $2)
+              themes[$2] = 1
+            }
+            END {
+              for (plugin in plugins) {
+                print plugin >> "plugins.list"
+              }
+              for (theme in themes) {
+                print theme >> "themes.list"
+              }
+            }
+          '
+          # If only one plugin is modified, add it to the plugin field
+          if [[ $(wc -l < plugins.list) = 1 ]]; then
+            echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
+          fi
+          # If only one theme is modified, add it to the theme field
+          if [[ $(wc -l < themes.list) = 1 ]]; then
+            echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
+          fi
+      - name: Fill Pull Request fields in project
+        if: github.event_name == 'pull_request_target'
+        env:
+          GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
+        run: |
+          gh api graphql -f query='
+            mutation (
+              $project: ID!
+              $item: ID!
+              $plugin_field: ID!
+              $plugin_value: String!
+              $theme_field: ID!
+              $theme_value: String!
+            ) {
+              set_plugin: updateProjectNextItemField(input: {
+                projectId: $project
+                itemId: $item
+                fieldId: $plugin_field
+                value: $plugin_value
+              }) {
+                projectNextItem {
+                  id
+                }
+              }
+              set_theme: updateProjectNextItemField(input: {
+                projectId: $project
+                itemId: $item
+                fieldId: $theme_field
+                value: $theme_value
+              }) {
+                projectNextItem {
+                  id
+                }
+              }
+            }
+          ' -f project=$PROJECT_ID -f item=$ITEM_ID \
+            -f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
+            -f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
+            --silent
+