Path: blob/main/build/azure-pipelines/update-dependencies-check.ts
13379 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import crypto from 'crypto';6import https from 'https';78function createJwt(appId: string, privateKey: string): string {9const now = Math.floor(Date.now() / 1000);10const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');11const payload = Buffer.from(JSON.stringify({ iat: now - 60, exp: now + 600, iss: appId })).toString('base64url');12const signature = crypto.sign('sha256', Buffer.from(`${header}.${payload}`), privateKey).toString('base64url');13return `${header}.${payload}.${signature}`;14}1516function request(options: https.RequestOptions, body?: object): Promise<Record<string, unknown>> {17return new Promise((resolve, reject) => {18const req = https.request(options, res => {19let data = '';20res.on('data', chunk => data += chunk);21res.on('end', () => {22if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {23resolve(JSON.parse(data));24} else {25reject(new Error(`HTTP ${res.statusCode}: ${data}`));26}27});28});29req.on('error', reject);30if (body) {31req.write(JSON.stringify(body));32}33req.end();34});35}3637async function getInstallationToken(jwt: string, installationId: string): Promise<string> {38const result = await request({39hostname: 'api.github.com',40path: `/app/installations/${encodeURIComponent(installationId)}/access_tokens`,41method: 'POST',42headers: {43'Authorization': `Bearer ${jwt}`,44'Accept': 'application/vnd.github+json',45'User-Agent': 'VSCode-ADO-Pipeline',46'X-GitHub-Api-Version': '2022-11-28'47}48});49return result.token as string;50}5152function updateCheckRun(token: string, checkRunId: string, conclusion: string, detailsUrl: string) {53return request({54hostname: 'api.github.com',55path: `/repos/microsoft/vscode/check-runs/${encodeURIComponent(checkRunId)}`,56method: 'PATCH',57headers: {58'Authorization': `token ${token}`,59'Accept': 'application/vnd.github+json',60'User-Agent': 'VSCode-ADO-Pipeline',61'X-GitHub-Api-Version': '2022-11-28'62}63}, {64status: 'completed',65conclusion,66completed_at: new Date().toISOString(),67details_url: detailsUrl68});69}7071async function main() {72const appId = process.env.GITHUB_APP_ID;73const privateKey = process.env.GITHUB_APP_PRIVATE_KEY;74const installationId = process.env.GITHUB_APP_INSTALLATION_ID;75const checkRunId = process.env.CHECK_RUN_ID;76const jobStatus = process.env.AGENT_JOBSTATUS;77const detailsUrl = `${process.env.SYSTEM_COLLECTIONURI}${process.env.SYSTEM_TEAMPROJECT}/_build/results?buildId=${process.env.BUILD_BUILDID}`;7879if (!appId || !privateKey || !installationId || !checkRunId) {80throw new Error('Missing required environment variables');81}8283const jwt = createJwt(appId, privateKey);84const token = await getInstallationToken(jwt, installationId);8586let conclusion: string;87switch (jobStatus) {88case 'Succeeded':89case 'SucceededWithIssues':90conclusion = 'success';91break;92case 'Canceled':93conclusion = 'cancelled';94break;95default:96conclusion = 'failure';97break;98}99100await updateCheckRun(token, checkRunId, conclusion, detailsUrl);101console.log(`Updated check run ${checkRunId} with conclusion: ${conclusion}`);102}103104main().catch(err => {105console.error(err);106process.exit(1);107});108109110