From 0ce8210a8ccbd887b4ad46411a82eb1e3c9e359d Mon Sep 17 00:00:00 2001 From: Alvaro Viebrantz Date: Mon, 3 Jun 2024 16:14:17 -0400 Subject: [PATCH] ci: move away from external action to create PR --- .github/workflows/discovery.yaml | 15 ++---- package.json | 1 + scripts/submit-discovery-pr.js | 83 ++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 scripts/submit-discovery-pr.js diff --git a/.github/workflows/discovery.yaml b/.github/workflows/discovery.yaml index 4b31d1b7..c965ce17 100644 --- a/.github/workflows/discovery.yaml +++ b/.github/workflows/discovery.yaml @@ -1,6 +1,7 @@ on: schedule: - cron: '0 12 * * *' + workflow_dispatch: name: Update Discovery Generated Types jobs: sync: @@ -14,14 +15,8 @@ jobs: - run: npm install # Generate types - run: npm run types - - name: Create Pull Request - uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v6.0.5 - with: - base: main - branch: update-discovery/patch - add-paths: src/types.d.ts - commit-message: "chore: update types from Discovery" - title: "chore: update types from Discovery" - body: | - Automated pull-request to keep BigQuery Discovery types up-to-date. + # Submit pull request + - run: npm run submit-discovery-pr + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index b5545d1b..db0122d8 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "docs-test": "linkinator docs", "predocs-test": "npm run docs", "types": "node scripts/gen-types.js", + "submit-discovery-pr": "node scripts/submit-discovery-pr.js", "prelint": "cd samples; npm link ../; npm install", "precompile": "gts clean" }, diff --git a/scripts/submit-discovery-pr.js b/scripts/submit-discovery-pr.js new file mode 100644 index 00000000..23e3bff3 --- /dev/null +++ b/scripts/submit-discovery-pr.js @@ -0,0 +1,83 @@ +// Copyright 2024 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. + +const execa = require('execa'); +const path = require('path'); +const fs = require('fs'); +const gaxios = require('gaxios'); + +const REPO = 'googleapis/bigquery-nodejs'; +const BRANCH = 'update-discovery/patch'; +const TRACK_PATHS = ['src/types.d.ts']; +const COMMIT_MESSAGE = 'chore: update types from Discovery'; +const COMMIT_BODY = + 'Automated pull-request to keep BigQuery Discovery types up-to-date.'; + +async function submitDiscoveryPR() { + const statusResult = await execa('git', ['status', '--porcelain']); + const status = statusResult.stdout; + const statusFiles = status.split('\n').map(x => x.slice(3)); + + const foundChanges = statusFiles.filter(f => { + return TRACK_PATHS.some(filename => f.startsWith(filename)); + }); + console.log(`Changes found in ${foundChanges.length} files`); + console.log(foundChanges.join('\n')); + + if (foundChanges.length === 0) { + console.log('No changes found'); + return; + } + + await execa('git', ['checkout', '-B', BRANCH]); + for (const filename of foundChanges) { + await execa('git', ['add', filename]); + } + await execa('git', ['commit', '-m', COMMIT_MESSAGE, '-m', COMMIT_BODY]); + await execa('git', ['push', 'origin', BRANCH, '--force']); + + + const githubToken = process.env.GITHUB_TOKEN; + if (!githubToken) { + throw new Error('please include a GITHUB_TOKEN'); + } + + if (process.env.GITHUB_ACTIONS) { + await execa('git', ['config', 'user.email', 'yoshi-automation@google.com']); + await execa('git', ['config', 'user.name', 'Yoshi Automation']); + } + + try { + // Open the pull request with the YOSHI_CODE_BOT_TOKEN + await gaxios.request({ + method: 'POST', + headers: { + Authorization: `token ${githubToken}`, + }, + url: `https://api.github.com/repos/${REPO}/pulls`, + data: { + title: COMMIT_MESSAGE, + head: BRANCH, + base: 'main', + body: COMMIT_BODY, + }, + }); + } catch (err) { + console.error('failed to submit Pull Request', err); + throw err; + } + await execa('git', ['checkout', 'main']); +} + +submitDiscoveryPR();