chore: Add github action to update discovery artifacts (#1187)

* chore: Add github action to update discovery artifacts

* Add date to branch name

* Remove test code
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..f6df779
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,124 @@
+# Copyright 2021 Google LLC
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     https://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: A workflow for updating discovery artifacts
+# Controls when the action will run.
+
+on:
+  schedule:
+    # * is a special character in YAML so you have to quote this string
+    # Run this Github Action every day at 7 AM UTC
+    - cron:  '* 7 * * *'
+
+jobs:
+  build:
+    name: Update Discovery Artifacts PR
+    runs-on: ubuntu-latest
+    steps:
+      - name: Get current date
+        id: date
+        run: echo "::set-output name=current_date::$(date +'%Y-%m-%d')"
+
+      - name: Check out master branch
+        uses: actions/checkout@v2
+        with:
+          ref: refs/heads/master
+
+      - name: Create branch
+        run: |
+          git checkout -b update-discovery-artifacts-${{ steps.date.outputs.current_date }}
+
+      - name: Set up Python 3.9
+        uses: actions/setup-python@v1
+        with:
+          python-version: 3.9
+
+      - name: Install google-api-python-client
+        run: pip3 install -e .
+
+      - name: Install script dependencies
+        run: pip3 install -r requirements.txt
+        working-directory: ./scripts
+
+      # Apply a workaround to discovery.py to avoid DefaultCredentialsError
+      # which is raised when calling `build_from_document()` as a result of
+      # `google.auth.default()`. The workaround is to bypass the code block that
+      # attempts to load default credentials.
+      - name: Workaround to avoid DefaultCredentialsError in discovery.py
+        run: sed -i -e 's/if credentials is None/if False/g' googleapiclient/discovery.py
+
+      - name: Run Change Summary
+        run: python3 updatediscoveryartifacts.py
+        working-directory: ./scripts
+
+      - name: Commit changes
+        run: ./createcommits.sh
+        working-directory: ./scripts
+
+      - name: Push changes
+        run: git push -f --set-upstream origin update-discovery-artifacts-${{ steps.date.outputs.current_date }}
+
+      - name: Prepare summary for PR Body
+        id: pr_body
+        shell: bash
+        run: |
+          python3 buildprbody.py
+          output=$(cat temp/allapis.summary)
+          output="${output//'%'/'%25'}"
+          output="${output//$'\n'/'%0A'}"
+          output="${output//$'\r'/'%0D'}"
+          echo "::set-output name=change_summary::$output"
+        working-directory: ./scripts
+
+      - name: Create PR
+        uses: actions/github-script@v2.0.0
+        with:
+          github-token: ${{secrets.YOSHI_CODE_BOT_TOKEN}}
+          script: |
+            async function createPR () {
+              const { owner, repo } = context.repo
+              const branch = 'update-discovery-artifacts-${{ steps.date.outputs.current_date }}'
+              let prBody = `${{ steps.pr_body.outputs.change_summary }}`
+              const prTitle = 'chore: Update discovery artifacts'
+              const pullRequests = await github.pulls.list({
+                owner: owner,
+                repo: repo,
+                head: `${owner}:${branch}`,
+                state: 'open'
+              })
+
+              if (pullRequests.data.length === 1) {
+                prNumber = pullRequests.data[0].number
+                await github.pulls.update({
+                  owner: owner,
+                  repo: repo,
+                  pull_number: prNumber,
+                  title: prTitle,
+                  body: prBody
+                })
+                console.log('Updated PR')
+              } else {
+                const createPrResult = await github.pulls.create({
+                  owner: owner,
+                  repo: repo,
+                  base: 'master',
+                  head: `${owner}:${branch}`,
+                  title: prTitle,
+                  body: prBody
+                })
+                prNumber = createPrResult.data.number
+                console.log('Created PR')
+              }
+            }
+            createPR()