blob: eabf1a5b3f29f5d677aa226e5a765b9eaf2fdcc4 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://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.
*/
// This function provides registration tokens for windows and linux self-hosted
// runners, a service account with the appropriated permissions should be used to
// invoke the Cloud Function.
import functions from '@google-cloud/functions-framework';
import { Octokit } from "octokit";
import { createAppAuth } from "@octokit/auth-app";
import { REQUIRED_ENV_VARS } from "../shared/constants" ;
function validateEnvSet(envVars) {
envVars.forEach(envVar => {
if (!process.env[envVar]) {
throw new Error(`${envVar} environment variable not set.`)
}
});
}
async function getRunnerToken() {
try {
//Set your GH App values as environment variables
let authOptions = {
appId: process.env.APP_ID,
privateKey: process.env.PEM_KEY,
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
installationId: process.env.APP_INSTALLATION_ID
}
const octokit = new Octokit({
authStrategy: createAppAuth,
auth: authOptions
});
let access = await octokit.request(`POST /app/installations/${process.env.APP_INSTALLATION_ID}}/access_tokens`, {
repositories: [
'beam'
],
permissions: {
organization_self_hosted_runners: "write",
}
});
//In order to access the registration token endpoint, an additional Auth token must be used
let authToken = access.data.token;
let auth = ` token ${authToken}`;
let registrationToken = await octokit.request(`POST https://api.github.com/orgs/${process.env.ORG}/actions/runners/registration-token`, {
headers: {
authorization: auth,
},
});
return registrationToken.data;
} catch (error) {
console.error(error);
}
}
functions.http('generateToken', (req, res) => {
validateEnvSet(REQUIRED_ENV_VARS)
getRunnerToken().then((registrationToken) => {
res.status(200).send(registrationToken);
});
});