Path: blob/main/build/azure-pipelines/common/releaseBuild.ts
5263 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 { CosmosClient } from '@azure/cosmos';6import { retry } from './retry.ts';7import { checkCopilotChatCompatibility } from './checkCopilotChatCompatibility.ts';89function getEnv(name: string): string {10const result = process.env[name];1112if (typeof result === 'undefined') {13throw new Error('Missing env: ' + name);14}1516return result;17}1819interface Config {20id: string;21frozen: boolean;22}2324function createDefaultConfig(quality: string): Config {25return {26id: quality,27frozen: false28};29}3031async function getConfig(client: CosmosClient, quality: string): Promise<Config> {32const query = `SELECT TOP 1 * FROM c WHERE c.id = "${quality}"`;3334const res = await client.database('builds').container('config').items.query(query).fetchAll();3536if (res.resources.length === 0) {37return createDefaultConfig(quality);38}3940return res.resources[0] as Config;41}4243async function main(force: boolean): Promise<void> {44const commit = getEnv('BUILD_SOURCEVERSION');45const quality = getEnv('VSCODE_QUALITY');4647// Check Copilot Chat compatibility before releasing insider builds48if (quality === 'insider') {49await checkCopilotChatCompatibility();50}5152const { cosmosDBAccessToken } = JSON.parse(getEnv('PUBLISH_AUTH_TOKENS'));53const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, tokenProvider: () => Promise.resolve(`type=aad&ver=1.0&sig=${cosmosDBAccessToken.token}`) });5455if (!force) {56const config = await getConfig(client, quality);5758console.log('Quality config:', config);5960if (config.frozen) {61console.log(`Skipping release because quality ${quality} is frozen.`);62return;63}64}6566console.log(`Releasing build ${commit}...`);6768let rolloutDurationMs = undefined;6970// If the build is insiders or exploration, start a rollout of 4 hours71if (quality === 'insider') {72rolloutDurationMs = 4 * 60 * 60 * 1000; // 4 hours73}7475const scripts = client.database('builds').container(quality).scripts;76await retry(() => scripts.storedProcedure('releaseBuild').execute('', [commit, rolloutDurationMs]));77}7879const [, , force] = process.argv;8081console.log(process.argv);8283main(/^true$/i.test(force)).then(() => {84console.log('Build successfully released');85process.exit(0);86}, err => {87console.error(err);88process.exit(1);89});909192