build: add support for fetching github token from sudowoodo (#43886)

* build: add support for fetching github token from sudowoodo

Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>

* chore: update release notes cache for tests

Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>

* build: support nightlies repo correctly

Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>

* build: post token

Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>
This commit is contained in:
trop[bot] 2024-09-23 11:07:20 -07:00 committed by GitHub
parent dddcc09185
commit ff65b58e2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 123 additions and 35 deletions

View file

@ -4,8 +4,9 @@ const assert = require('node:assert');
const got = require('got');
const { Octokit } = require('@octokit/rest');
const { createGitHubTokenStrategy } = require('./github-token');
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
authStrategy: createGitHubTokenStrategy('electron')
});
const BUILD_APPVEYOR_URL = 'https://ci.appveyor.com/api/builds';

View file

@ -1,9 +1,7 @@
if (!process.env.CI) require('dotenv-safe').load();
const { Octokit } = require('@octokit/rest');
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
});
const { createGitHubTokenStrategy } = require('./github-token');
if (process.argv.length < 3) {
console.log('Usage: find-release version');
@ -13,6 +11,10 @@ if (process.argv.length < 3) {
const version = process.argv[2];
const targetRepo = findRepo();
const octokit = new Octokit({
authStrategy: createGitHubTokenStrategy(targetRepo)
});
function findRepo () {
return version.indexOf('nightly') > 0 ? 'nightlies' : 'electron';
}

View file

@ -1,12 +1,13 @@
const { Octokit } = require('@octokit/rest');
const got = require('got');
const octokit = new Octokit({
userAgent: 'electron-asset-fetcher',
auth: process.env.ELECTRON_GITHUB_TOKEN
});
const { createGitHubTokenStrategy } = require('./github-token');
async function getAssetContents (repo, assetId) {
const octokit = new Octokit({
userAgent: 'electron-asset-fetcher',
authStrategy: createGitHubTokenStrategy(repo)
});
const requestOptions = octokit.repos.getReleaseAsset.endpoint({
owner: 'electron',
repo,
@ -17,7 +18,7 @@ async function getAssetContents (repo, assetId) {
});
const { url, headers } = requestOptions;
headers.authorization = `token ${process.env.ELECTRON_GITHUB_TOKEN}`;
headers.authorization = `token ${(await octokit.auth()).token}`;
const response = await got(url, {
followRedirect: false,

View file

@ -0,0 +1,57 @@
const { createTokenAuth } = require('@octokit/auth-token');
const got = require('got').default;
const cachedTokens = Object.create(null);
async function ensureToken (repo) {
if (!cachedTokens[repo]) {
cachedTokens[repo] = await (async () => {
const { ELECTRON_GITHUB_TOKEN, SUDOWOODO_EXCHANGE_URL, SUDOWOODO_EXCHANGE_TOKEN } = process.env;
if (ELECTRON_GITHUB_TOKEN) {
return ELECTRON_GITHUB_TOKEN;
}
if (SUDOWOODO_EXCHANGE_URL && SUDOWOODO_EXCHANGE_TOKEN) {
const resp = await got.post(SUDOWOODO_EXCHANGE_URL + '?repo=' + repo, {
headers: {
Authorization: SUDOWOODO_EXCHANGE_TOKEN
},
throwHttpErrors: false
});
if (resp.statusCode !== 200) {
console.error('bad sudowoodo exchange response code:', resp.statusCode);
throw new Error('non-200 status code received from sudowoodo exchange function');
}
try {
return JSON.parse(resp.body).token;
} catch {
// Swallow as the error could include the token
throw new Error('Unexpected error parsing sudowoodo exchange response');
}
}
throw new Error('Could not find or fetch a valid GitHub Auth Token');
})();
}
}
module.exports.createGitHubTokenStrategy = (repo) => () => {
let tokenAuth = null;
async function ensureTokenAuth () {
if (!tokenAuth) {
await ensureToken(repo);
tokenAuth = createTokenAuth(cachedTokens[repo]);
}
}
async function auth () {
await ensureTokenAuth();
return await tokenAuth();
}
auth.hook = async (...args) => {
await ensureTokenAuth();
return await tokenAuth.hook(...args);
};
return auth;
};

View file

@ -9,8 +9,9 @@ const { ELECTRON_DIR } = require('../../lib/utils');
const notesGenerator = require('./notes.js');
const { Octokit } = require('@octokit/rest');
const { createGitHubTokenStrategy } = require('../github-token');
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
authStrategy: createGitHubTokenStrategy('electron')
});
const semverify = version => version.replace(/^origin\//, '').replace(/[xy]/g, '0').replace(/-/g, '.');

View file

@ -8,11 +8,13 @@ const path = require('node:path');
const { GitProcess } = require('dugite');
const { Octokit } = require('@octokit/rest');
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
});
const { ELECTRON_DIR } = require('../../lib/utils');
const { createGitHubTokenStrategy } = require('../github-token');
const octokit = new Octokit({
authStrategy: createGitHubTokenStrategy('electron')
});
const MAX_FAIL_COUNT = 3;
const CHECK_INTERVAL = 5000;

View file

@ -13,6 +13,7 @@ const path = require('node:path');
const readline = require('node:readline');
const releaseNotesGenerator = require('./notes/index.js');
const { getCurrentBranch, ELECTRON_DIR } = require('../lib/utils.js');
const { createGitHubTokenStrategy } = require('./github-token');
const bumpType = args._[0];
const targetRepo = getRepo();
@ -21,7 +22,7 @@ function getRepo () {
}
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
authStrategy: createGitHubTokenStrategy(getRepo())
});
require('colors');

View file

@ -10,10 +10,7 @@ const rootPackageJson = require('../../package.json');
const { Octokit } = require('@octokit/rest');
const { getAssetContents } = require('./get-asset');
const octokit = new Octokit({
userAgent: 'electron-npm-publisher',
auth: process.env.ELECTRON_GITHUB_TOKEN
});
const { createGitHubTokenStrategy } = require('./github-token');
if (!process.env.ELECTRON_NPM_OTP) {
console.error('Please set ELECTRON_NPM_OTP');
@ -47,6 +44,11 @@ const currentElectronVersion = getElectronVersion();
const isNightlyElectronVersion = currentElectronVersion.includes('nightly');
const targetRepo = getRepo();
const octokit = new Octokit({
userAgent: 'electron-npm-publisher',
authStrategy: createGitHubTokenStrategy(targetRepo)
});
function getRepo () {
return isNightlyElectronVersion ? 'nightlies' : 'electron';
}

View file

@ -6,16 +6,17 @@ const args = require('minimist')(process.argv.slice(2), {
default: { releaseID: '' }
});
const { Octokit } = require('@octokit/rest');
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
});
const { createGitHubTokenStrategy } = require('./github-token');
require('colors');
const pass = '✓'.green;
const fail = '✗'.red;
async function deleteDraft (releaseId, targetRepo) {
const octokit = new Octokit({
authStrategy: createGitHubTokenStrategy(targetRepo)
});
try {
const result = await octokit.repos.getRelease({
owner: 'electron',
@ -41,6 +42,10 @@ async function deleteDraft (releaseId, targetRepo) {
}
async function deleteTag (tag, targetRepo) {
const octokit = new Octokit({
authStrategy: createGitHubTokenStrategy(targetRepo)
});
try {
await octokit.git.deleteRef({
owner: 'electron',

View file

@ -25,13 +25,10 @@ const fail = '✗'.red;
const { ELECTRON_DIR } = require('../lib/utils');
const { getElectronVersion } = require('../lib/get-version');
const getUrlHash = require('./get-url-hash');
const { createGitHubTokenStrategy } = require('./github-token');
const pkgVersion = `v${getElectronVersion()}`;
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN
});
function getRepo () {
return pkgVersion.indexOf('nightly') > 0 ? 'nightlies' : 'electron';
}
@ -39,6 +36,10 @@ function getRepo () {
const targetRepo = getRepo();
let failureCount = 0;
const octokit = new Octokit({
authStrategy: createGitHubTokenStrategy(targetRepo)
});
async function getDraftRelease (version, skipValidation) {
const releaseInfo = await octokit.repos.listReleases({
owner: 'electron',
@ -392,7 +393,7 @@ async function verifyDraftGitHubReleaseAssets (release) {
});
const { url, headers } = requestOptions;
headers.authorization = `token ${process.env.ELECTRON_GITHUB_TOKEN}`;
headers.authorization = `token ${(await octokit.auth()).token}`;
const response = await got(url, {
followRedirect: false,

View file

@ -1,10 +1,6 @@
import { Octokit } from '@octokit/rest';
import * as fs from 'node:fs';
const octokit = new Octokit({
auth: process.env.ELECTRON_GITHUB_TOKEN,
log: console
});
import { createGitHubTokenStrategy } from '../github-token';
if (!process.env.CI) require('dotenv-safe').load();
@ -51,6 +47,11 @@ const targetRepo = getRepo();
const uploadUrl = `https://uploads.github.com/repos/electron/${targetRepo}/releases/${releaseId}/assets{?name,label}`;
let retry = 0;
const octokit = new Octokit({
authStrategy: createGitHubTokenStrategy(targetRepo),
log: console
});
function uploadToGitHub () {
console.log(`in uploadToGitHub for ${filePath}, ${fileName}`);
const fileData = fs.createReadStream(filePath);