Remove CLI version lookup based on release assets
This is now superseded by semantically versioned bundles
This commit is contained in:
parent
48c11ed2ba
commit
0407820509
6 changed files with 10 additions and 158 deletions
26
lib/codeql.test.js
generated
26
lib/codeql.test.js
generated
|
|
@ -141,46 +141,26 @@ function mockApiDetails(apiDetails) {
|
||||||
});
|
});
|
||||||
const EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES = [
|
const EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES = [
|
||||||
{
|
{
|
||||||
cliVersion: "2.17.6",
|
|
||||||
tagName: "codeql-bundle-2.17.6",
|
tagName: "codeql-bundle-2.17.6",
|
||||||
expectedToolcacheVersion: "2.17.6",
|
expectedToolcacheVersion: "2.17.6",
|
||||||
shouldCallReleasesApi: false,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cliVersion: "2.17.6-pre",
|
|
||||||
tagName: "codeql-bundle-20240805",
|
tagName: "codeql-bundle-20240805",
|
||||||
expectedToolcacheVersion: "0.0.0-20240805",
|
expectedToolcacheVersion: "0.0.0-20240805",
|
||||||
shouldCallReleasesApi: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cliVersion: "2.17.6+202006100101",
|
|
||||||
tagName: "codeql-bundle-20240805",
|
|
||||||
expectedToolcacheVersion: "0.0.0-20240805",
|
|
||||||
shouldCallReleasesApi: true,
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
for (const { cliVersion, tagName, expectedToolcacheVersion, shouldCallReleasesApi, } of EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES) {
|
for (const { tagName, expectedToolcacheVersion, } of EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES) {
|
||||||
(0, ava_1.default)(`caches an explicitly requested bundle containing CLI ${cliVersion} as ${expectedToolcacheVersion}`, async (t) => {
|
(0, ava_1.default)(`caches explicitly requested bundle ${tagName} as ${expectedToolcacheVersion}`, async (t) => {
|
||||||
await util.withTmpDir(async (tmpDir) => {
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
(0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir);
|
(0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir);
|
||||||
mockApiDetails(testing_utils_1.SAMPLE_DOTCOM_API_DETAILS);
|
mockApiDetails(testing_utils_1.SAMPLE_DOTCOM_API_DETAILS);
|
||||||
sinon.stub(actionsUtil, "isRunningLocalAction").returns(true);
|
sinon.stub(actionsUtil, "isRunningLocalAction").returns(true);
|
||||||
const releaseApiMock = mockReleaseApi({
|
|
||||||
assetNames: [`cli-version-${cliVersion}.txt`],
|
|
||||||
tagName,
|
|
||||||
});
|
|
||||||
const url = (0, testing_utils_1.mockBundleDownloadApi)({
|
const url = (0, testing_utils_1.mockBundleDownloadApi)({
|
||||||
tagName,
|
tagName,
|
||||||
});
|
});
|
||||||
const result = await codeql.setupCodeQL(url, testing_utils_1.SAMPLE_DOTCOM_API_DETAILS, tmpDir, util.GitHubVariant.DOTCOM, testing_utils_1.SAMPLE_DEFAULT_CLI_VERSION, (0, logging_1.getRunnerLogger)(true), false);
|
const result = await codeql.setupCodeQL(url, testing_utils_1.SAMPLE_DOTCOM_API_DETAILS, tmpDir, util.GitHubVariant.DOTCOM, testing_utils_1.SAMPLE_DEFAULT_CLI_VERSION, (0, logging_1.getRunnerLogger)(true), false);
|
||||||
if (shouldCallReleasesApi) {
|
|
||||||
t.assert(releaseApiMock.isDone(), "Releases API should have been called");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
t.false(releaseApiMock.isDone(), "Releases API should not have been called");
|
|
||||||
}
|
|
||||||
t.assert(toolcache.find("CodeQL", expectedToolcacheVersion));
|
t.assert(toolcache.find("CodeQL", expectedToolcacheVersion));
|
||||||
t.deepEqual(result.toolsVersion, cliVersion);
|
t.deepEqual(result.toolsVersion, expectedToolcacheVersion);
|
||||||
t.is(result.toolsSource, setup_codeql_1.ToolsSource.Download);
|
t.is(result.toolsSource, setup_codeql_1.ToolsSource.Download);
|
||||||
t.assert(Number.isInteger(result.toolsDownloadDurationMs));
|
t.assert(Number.isInteger(result.toolsDownloadDurationMs));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
43
lib/setup-codeql.js
generated
43
lib/setup-codeql.js
generated
|
|
@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.downloadCodeQL = exports.CODEQL_DEFAULT_ACTION_REPOSITORY = exports.ToolsSource = void 0;
|
exports.downloadCodeQL = exports.CODEQL_DEFAULT_ACTION_REPOSITORY = exports.ToolsSource = void 0;
|
||||||
exports.getCodeQLActionRepository = getCodeQLActionRepository;
|
exports.getCodeQLActionRepository = getCodeQLActionRepository;
|
||||||
exports.tryFindCliVersionDotcomOnly = tryFindCliVersionDotcomOnly;
|
|
||||||
exports.tryGetBundleVersionFromUrl = tryGetBundleVersionFromUrl;
|
exports.tryGetBundleVersionFromUrl = tryGetBundleVersionFromUrl;
|
||||||
exports.convertToSemVer = convertToSemVer;
|
exports.convertToSemVer = convertToSemVer;
|
||||||
exports.getCodeQLSource = getCodeQLSource;
|
exports.getCodeQLSource = getCodeQLSource;
|
||||||
|
|
@ -86,38 +85,6 @@ function getCodeQLActionRepository(logger) {
|
||||||
}
|
}
|
||||||
return util.getRequiredEnvParam("GITHUB_ACTION_REPOSITORY");
|
return util.getRequiredEnvParam("GITHUB_ACTION_REPOSITORY");
|
||||||
}
|
}
|
||||||
function tryGetCodeQLCliVersionForRelease(release, logger) {
|
|
||||||
const cliVersionsFromMarkerFiles = release.assets
|
|
||||||
.map((asset) => asset.name.match(/cli-version-(.*)\.txt/)?.[1])
|
|
||||||
.filter((v) => v)
|
|
||||||
.map((v) => v);
|
|
||||||
if (cliVersionsFromMarkerFiles.length > 1) {
|
|
||||||
logger.warning(`Ignoring release ${release.tag_name} with multiple CLI version marker files.`);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
else if (cliVersionsFromMarkerFiles.length === 0) {
|
|
||||||
logger.debug(`Failed to find the CodeQL CLI version for release ${release.tag_name}.`);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
return cliVersionsFromMarkerFiles[0];
|
|
||||||
}
|
|
||||||
async function tryFindCliVersionDotcomOnly(tagName, logger) {
|
|
||||||
try {
|
|
||||||
logger.debug(`Fetching the GitHub Release for the CodeQL bundle tagged ${tagName}.`);
|
|
||||||
const apiClient = api.getApiClient();
|
|
||||||
const codeQLActionRepository = getCodeQLActionRepository(logger);
|
|
||||||
const release = await apiClient.rest.repos.getReleaseByTag({
|
|
||||||
owner: codeQLActionRepository.split("/")[0],
|
|
||||||
repo: codeQLActionRepository.split("/")[1],
|
|
||||||
tag: tagName,
|
|
||||||
});
|
|
||||||
return tryGetCodeQLCliVersionForRelease(release.data, logger);
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
logger.debug(`Failed to find the CLI version for the CodeQL bundle tagged ${tagName}. ${(0, util_1.wrapError)(e).message}`);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function getCodeQLBundleDownloadURL(tagName, apiDetails, logger) {
|
async function getCodeQLBundleDownloadURL(tagName, apiDetails, logger) {
|
||||||
const codeQLActionRepository = getCodeQLActionRepository(logger);
|
const codeQLActionRepository = getCodeQLActionRepository(logger);
|
||||||
const potentialDownloadSources = [
|
const potentialDownloadSources = [
|
||||||
|
|
@ -399,7 +366,7 @@ async function tryGetFallbackToolcacheVersion(cliVersion, tagName, logger) {
|
||||||
}
|
}
|
||||||
// Exported using `export const` for testing purposes. Specifically, we want to
|
// Exported using `export const` for testing purposes. Specifically, we want to
|
||||||
// be able to stub this function and have other functions in this file use that stub.
|
// be able to stub this function and have other functions in this file use that stub.
|
||||||
const downloadCodeQL = async function (codeqlURL, maybeBundleVersion, maybeCliVersion, apiDetails, variant, tempDir, logger) {
|
const downloadCodeQL = async function (codeqlURL, maybeBundleVersion, maybeCliVersion, apiDetails, tempDir, logger) {
|
||||||
const parsedCodeQLURL = new URL(codeqlURL);
|
const parsedCodeQLURL = new URL(codeqlURL);
|
||||||
const searchParams = new URLSearchParams(parsedCodeQLURL.search);
|
const searchParams = new URLSearchParams(parsedCodeQLURL.search);
|
||||||
const headers = {
|
const headers = {
|
||||||
|
|
@ -444,12 +411,6 @@ const downloadCodeQL = async function (codeqlURL, maybeBundleVersion, maybeCliVe
|
||||||
toolsDownloadDurationMs,
|
toolsDownloadDurationMs,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// Try to compute the CLI version for this bundle
|
|
||||||
if (maybeCliVersion === undefined &&
|
|
||||||
variant === util.GitHubVariant.DOTCOM &&
|
|
||||||
codeqlURL.includes(`/${exports.CODEQL_DEFAULT_ACTION_REPOSITORY}/`)) {
|
|
||||||
maybeCliVersion = await tryFindCliVersionDotcomOnly(`codeql-bundle-${bundleVersion}`, logger);
|
|
||||||
}
|
|
||||||
logger.debug("Caching CodeQL bundle.");
|
logger.debug("Caching CodeQL bundle.");
|
||||||
const toolcacheVersion = getCanonicalToolcacheVersion(maybeCliVersion, bundleVersion, logger);
|
const toolcacheVersion = getCanonicalToolcacheVersion(maybeCliVersion, bundleVersion, logger);
|
||||||
const toolcachedBundlePath = await toolcache.cacheDir(extractedBundlePath, "CodeQL", toolcacheVersion);
|
const toolcachedBundlePath = await toolcache.cacheDir(extractedBundlePath, "CodeQL", toolcacheVersion);
|
||||||
|
|
@ -523,7 +484,7 @@ async function setupCodeQLBundle(toolsInput, apiDetails, tempDir, variant, defau
|
||||||
toolsSource = ToolsSource.Toolcache;
|
toolsSource = ToolsSource.Toolcache;
|
||||||
break;
|
break;
|
||||||
case "download": {
|
case "download": {
|
||||||
const result = await (0, exports.downloadCodeQL)(source.codeqlURL, source.bundleVersion, source.cliVersion, apiDetails, variant, tempDir, logger);
|
const result = await (0, exports.downloadCodeQL)(source.codeqlURL, source.bundleVersion, source.cliVersion, apiDetails, tempDir, logger);
|
||||||
toolsVersion = result.toolsVersion;
|
toolsVersion = result.toolsVersion;
|
||||||
codeqlFolder = result.codeqlFolder;
|
codeqlFolder = result.codeqlFolder;
|
||||||
toolsDownloadDurationMs = result.toolsDownloadDurationMs;
|
toolsDownloadDurationMs = result.toolsDownloadDurationMs;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -197,42 +197,26 @@ test("downloads an explicitly requested bundle even if a different version is ca
|
||||||
|
|
||||||
const EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES = [
|
const EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES = [
|
||||||
{
|
{
|
||||||
cliVersion: "2.17.6",
|
|
||||||
tagName: "codeql-bundle-2.17.6",
|
tagName: "codeql-bundle-2.17.6",
|
||||||
expectedToolcacheVersion: "2.17.6",
|
expectedToolcacheVersion: "2.17.6",
|
||||||
shouldCallReleasesApi: false,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cliVersion: "2.17.6-pre",
|
|
||||||
tagName: "codeql-bundle-20240805",
|
tagName: "codeql-bundle-20240805",
|
||||||
expectedToolcacheVersion: "0.0.0-20240805",
|
expectedToolcacheVersion: "0.0.0-20240805",
|
||||||
shouldCallReleasesApi: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cliVersion: "2.17.6+202006100101",
|
|
||||||
tagName: "codeql-bundle-20240805",
|
|
||||||
expectedToolcacheVersion: "0.0.0-20240805",
|
|
||||||
shouldCallReleasesApi: true,
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
for (const {
|
for (const {
|
||||||
cliVersion,
|
|
||||||
tagName,
|
tagName,
|
||||||
expectedToolcacheVersion,
|
expectedToolcacheVersion,
|
||||||
shouldCallReleasesApi,
|
|
||||||
} of EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES) {
|
} of EXPLICITLY_REQUESTED_BUNDLE_TEST_CASES) {
|
||||||
test(`caches an explicitly requested bundle containing CLI ${cliVersion} as ${expectedToolcacheVersion}`, async (t) => {
|
test(`caches explicitly requested bundle ${tagName} as ${expectedToolcacheVersion}`, async (t) => {
|
||||||
await util.withTmpDir(async (tmpDir) => {
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
setupActionsVars(tmpDir, tmpDir);
|
setupActionsVars(tmpDir, tmpDir);
|
||||||
|
|
||||||
mockApiDetails(SAMPLE_DOTCOM_API_DETAILS);
|
mockApiDetails(SAMPLE_DOTCOM_API_DETAILS);
|
||||||
sinon.stub(actionsUtil, "isRunningLocalAction").returns(true);
|
sinon.stub(actionsUtil, "isRunningLocalAction").returns(true);
|
||||||
|
|
||||||
const releaseApiMock = mockReleaseApi({
|
|
||||||
assetNames: [`cli-version-${cliVersion}.txt`],
|
|
||||||
tagName,
|
|
||||||
});
|
|
||||||
const url = mockBundleDownloadApi({
|
const url = mockBundleDownloadApi({
|
||||||
tagName,
|
tagName,
|
||||||
});
|
});
|
||||||
|
|
@ -246,19 +230,8 @@ for (const {
|
||||||
getRunnerLogger(true),
|
getRunnerLogger(true),
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
if (shouldCallReleasesApi) {
|
|
||||||
t.assert(
|
|
||||||
releaseApiMock.isDone(),
|
|
||||||
"Releases API should have been called",
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
t.false(
|
|
||||||
releaseApiMock.isDone(),
|
|
||||||
"Releases API should not have been called",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
t.assert(toolcache.find("CodeQL", expectedToolcacheVersion));
|
t.assert(toolcache.find("CodeQL", expectedToolcacheVersion));
|
||||||
t.deepEqual(result.toolsVersion, cliVersion);
|
t.deepEqual(result.toolsVersion, expectedToolcacheVersion);
|
||||||
t.is(result.toolsSource, ToolsSource.Download);
|
t.is(result.toolsSource, ToolsSource.Download);
|
||||||
t.assert(Number.isInteger(result.toolsDownloadDurationMs));
|
t.assert(Number.isInteger(result.toolsDownloadDurationMs));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import * as defaults from "./defaults.json";
|
||||||
import { CodeQLDefaultVersionInfo } from "./feature-flags";
|
import { CodeQLDefaultVersionInfo } from "./feature-flags";
|
||||||
import { Logger } from "./logging";
|
import { Logger } from "./logging";
|
||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
import { isGoodVersion, wrapError } from "./util";
|
import { isGoodVersion } from "./util";
|
||||||
|
|
||||||
export enum ToolsSource {
|
export enum ToolsSource {
|
||||||
Unknown = "UNKNOWN",
|
Unknown = "UNKNOWN",
|
||||||
|
|
@ -59,54 +59,6 @@ export function getCodeQLActionRepository(logger: Logger): string {
|
||||||
return util.getRequiredEnvParam("GITHUB_ACTION_REPOSITORY");
|
return util.getRequiredEnvParam("GITHUB_ACTION_REPOSITORY");
|
||||||
}
|
}
|
||||||
|
|
||||||
function tryGetCodeQLCliVersionForRelease(
|
|
||||||
release,
|
|
||||||
logger: Logger,
|
|
||||||
): string | undefined {
|
|
||||||
const cliVersionsFromMarkerFiles = (release.assets as Array<{ name: string }>)
|
|
||||||
.map((asset) => asset.name.match(/cli-version-(.*)\.txt/)?.[1])
|
|
||||||
.filter((v) => v)
|
|
||||||
.map((v) => v as string);
|
|
||||||
if (cliVersionsFromMarkerFiles.length > 1) {
|
|
||||||
logger.warning(
|
|
||||||
`Ignoring release ${release.tag_name} with multiple CLI version marker files.`,
|
|
||||||
);
|
|
||||||
return undefined;
|
|
||||||
} else if (cliVersionsFromMarkerFiles.length === 0) {
|
|
||||||
logger.debug(
|
|
||||||
`Failed to find the CodeQL CLI version for release ${release.tag_name}.`,
|
|
||||||
);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
return cliVersionsFromMarkerFiles[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function tryFindCliVersionDotcomOnly(
|
|
||||||
tagName: string,
|
|
||||||
logger: Logger,
|
|
||||||
): Promise<string | undefined> {
|
|
||||||
try {
|
|
||||||
logger.debug(
|
|
||||||
`Fetching the GitHub Release for the CodeQL bundle tagged ${tagName}.`,
|
|
||||||
);
|
|
||||||
const apiClient = api.getApiClient();
|
|
||||||
const codeQLActionRepository = getCodeQLActionRepository(logger);
|
|
||||||
const release = await apiClient.rest.repos.getReleaseByTag({
|
|
||||||
owner: codeQLActionRepository.split("/")[0],
|
|
||||||
repo: codeQLActionRepository.split("/")[1],
|
|
||||||
tag: tagName,
|
|
||||||
});
|
|
||||||
return tryGetCodeQLCliVersionForRelease(release.data, logger);
|
|
||||||
} catch (e) {
|
|
||||||
logger.debug(
|
|
||||||
`Failed to find the CLI version for the CodeQL bundle tagged ${tagName}. ${
|
|
||||||
wrapError(e).message
|
|
||||||
}`,
|
|
||||||
);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getCodeQLBundleDownloadURL(
|
async function getCodeQLBundleDownloadURL(
|
||||||
tagName: string,
|
tagName: string,
|
||||||
apiDetails: api.GitHubApiDetails,
|
apiDetails: api.GitHubApiDetails,
|
||||||
|
|
@ -516,7 +468,6 @@ export const downloadCodeQL = async function (
|
||||||
maybeBundleVersion: string | undefined,
|
maybeBundleVersion: string | undefined,
|
||||||
maybeCliVersion: string | undefined,
|
maybeCliVersion: string | undefined,
|
||||||
apiDetails: api.GitHubApiDetails,
|
apiDetails: api.GitHubApiDetails,
|
||||||
variant: util.GitHubVariant,
|
|
||||||
tempDir: string,
|
tempDir: string,
|
||||||
logger: Logger,
|
logger: Logger,
|
||||||
): Promise<{
|
): Promise<{
|
||||||
|
|
@ -594,18 +545,6 @@ export const downloadCodeQL = async function (
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to compute the CLI version for this bundle
|
|
||||||
if (
|
|
||||||
maybeCliVersion === undefined &&
|
|
||||||
variant === util.GitHubVariant.DOTCOM &&
|
|
||||||
codeqlURL.includes(`/${CODEQL_DEFAULT_ACTION_REPOSITORY}/`)
|
|
||||||
) {
|
|
||||||
maybeCliVersion = await tryFindCliVersionDotcomOnly(
|
|
||||||
`codeql-bundle-${bundleVersion}`,
|
|
||||||
logger,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug("Caching CodeQL bundle.");
|
logger.debug("Caching CodeQL bundle.");
|
||||||
const toolcacheVersion = getCanonicalToolcacheVersion(
|
const toolcacheVersion = getCanonicalToolcacheVersion(
|
||||||
maybeCliVersion,
|
maybeCliVersion,
|
||||||
|
|
@ -725,7 +664,6 @@ export async function setupCodeQLBundle(
|
||||||
source.bundleVersion,
|
source.bundleVersion,
|
||||||
source.cliVersion,
|
source.cliVersion,
|
||||||
apiDetails,
|
apiDetails,
|
||||||
variant,
|
|
||||||
tempDir,
|
tempDir,
|
||||||
logger,
|
logger,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue