Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable a controlled switchover between CodeQL releases #1475

Merged
merged 29 commits into from
Jan 19, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
cdb9019
Support determining Dotcom CLI version from feature flags
henrymercer Jan 5, 2023
a6dff04
Ignore default version flags with invalid version numbers
henrymercer Jan 5, 2023
a76fe4f
Enable mapping from CLI version to bundle tag name
henrymercer Jan 6, 2023
bd2f52f
Move CodeQL setup to its own file
henrymercer Jan 9, 2023
c3be36f
Use new default version to set up CodeQL
henrymercer Jan 10, 2023
23d151d
Add test for using default version with no requested URL on Dotcom
henrymercer Jan 10, 2023
2f7b9a1
Differentiate `setupCodeql.setupCodeQL` from `codeql.setupCodeQL`
henrymercer Jan 11, 2023
e8c12e1
Add a debug log for the feature flag API response
henrymercer Jan 11, 2023
648838c
Allow using a `x.y.z-yyyymmdd` toolcache version for CLI `x.y.z`.
henrymercer Jan 12, 2023
1eeb9df
Remove dead code
henrymercer Jan 12, 2023
a89ad76
Expand note about defaults.json compatibility
henrymercer Jan 12, 2023
31c7ce1
Add doc describing CLI version marker files
henrymercer Jan 12, 2023
9578699
Merge branch 'main' into henrymercer/controlled-switchover
henrymercer Jan 12, 2023
28f827a
Add changelog notes
henrymercer Jan 12, 2023
c9b1be5
Bump version to 2.2.0
henrymercer Jan 12, 2023
c2e39e0
Cache explicitly requested bundles with their URL if possible
henrymercer Jan 12, 2023
33206d2
Include the bundle version in the toolcache version number
henrymercer Jan 12, 2023
0be20e5
Use the CLI version when caching the bundle in telemetry too
henrymercer Jan 12, 2023
12998b7
Convert logger call to debug
henrymercer Jan 13, 2023
13cdac3
Improve changelog notes
henrymercer Jan 13, 2023
eca06a5
Further improve changelog notes
henrymercer Jan 13, 2023
ac7e4d7
Improve changelog note some more
henrymercer Jan 16, 2023
115587a
Merge branch 'main' into henrymercer/controlled-switchover
henrymercer Jan 16, 2023
b660a38
Address review comments
henrymercer Jan 16, 2023
a5b44c1
Add a sentence on recommended practices for using the CLI
henrymercer Jan 16, 2023
5f1362d
Merge branch 'main' into henrymercer/controlled-switchover
henrymercer Jan 18, 2023
8a4abfd
Support `cli-version-x.y.z-pre.txt` marker files
henrymercer Jan 18, 2023
3d62f02
Update changelog note
henrymercer Jan 18, 2023
9012214
Merge branch 'main' into henrymercer/controlled-switchover
henrymercer Jan 18, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion lib/codeql.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/codeql.js.map

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions lib/codeql.test.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/codeql.test.js.map

Large diffs are not rendered by default.

55 changes: 55 additions & 0 deletions src/codeql.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import nock from "nock";
import * as sinon from "sinon";

import * as actionsUtil from "./actions-util";
import * as api from "./api-client";
import { GitHubApiDetails } from "./api-client";
import * as codeql from "./codeql";
import { AugmentationProperties, Config } from "./config-utils";
Expand Down Expand Up @@ -929,6 +930,60 @@ test("databaseInterpretResults() does not set --sarif-add-baseline-file-info for
);
});

test("findCodeQLBundleTagDotcomOnly() matches GitHub Release with marker file", async (t) => {
// Look for GitHub Releases in github/codeql-action
sinon.stub(actionsUtil, "isRunningLocalAction").resolves(true);
sinon.stub(api, "getApiClient").value(() => ({
repos: {
listReleases: sinon.stub().resolves(undefined),
},
paginate: sinon.stub().resolves([
{
assets: [
{
name: "cli-version-2.12.0.txt",
},
],
tag_name: "codeql-bundle-20230106",
},
]),
}));
t.is(
await codeql.findCodeQLBundleTagDotcomOnly("2.12.0", getRunnerLogger(true)),
"codeql-bundle-20230106"
);
});

test("findCodeQLBundleTagDotcomOnly() errors if no GitHub Release matches marker file", async (t) => {
// Look for GitHub Releases in github/codeql-action
sinon.stub(actionsUtil, "isRunningLocalAction").resolves(true);
sinon.stub(api, "getApiClient").value(() => ({
repos: {
listReleases: sinon.stub().resolves(undefined),
},
paginate: sinon.stub().resolves([
{
assets: [
{
name: "cli-version-2.12.0.txt",
},
],
tag_name: "codeql-bundle-20230106",
},
]),
}));
await t.throwsAsync(
async () =>
await codeql.findCodeQLBundleTagDotcomOnly(
"2.12.1",
getRunnerLogger(true)
),
{
message: "Failed to find a CodeQL bundle release for CLI version 2.12.1.",
}
);
});

export function stubToolRunnerConstructor(): sinon.SinonStub<
any[],
toolrunner.ToolRunner
Expand Down
39 changes: 39 additions & 0 deletions src/codeql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,45 @@ export function getCodeQLActionRepository(logger: Logger): string {
return util.getRequiredEnvParam("GITHUB_ACTION_REPOSITORY");
}

export async function findCodeQLBundleTagDotcomOnly(
cliVersion: string,
logger: Logger
): Promise<string> {
const apiClient = api.getApiClient();
const codeQLActionRepository = getCodeQLActionRepository(logger);
const releases = await apiClient.paginate(apiClient.repos.listReleases, {
owner: codeQLActionRepository.split("/")[0],
repo: codeQLActionRepository.split("/")[1],
});
logger.debug(`Found ${releases.length} releases.`);

for (const release of releases) {
const cliVersionFileVersions = release.assets
.map((asset) => asset.name.match(/cli-version-(.*)\.txt/)?.[1])
angelapwen marked this conversation as resolved.
Show resolved Hide resolved
.filter((v) => v)
.map((v) => v as string);

if (cliVersionFileVersions.length === 0) {
logger.debug(
`Ignoring release ${release.tag_name} with no CLI version marker file.`
);
continue;
}
if (cliVersionFileVersions.length > 1) {
logger.warning(
`Ignoring release ${release.tag_name} with multiple CLI version marker files.`
);
continue;
}
if (cliVersionFileVersions[0] === cliVersion) {
return release.tag_name;
}
}
throw new Error(
`Failed to find a CodeQL bundle release for CLI version ${cliVersion}.`
);
}

async function getCodeQLBundleDownloadURL(
apiDetails: api.GitHubApiDetails,
variant: util.GitHubVariant,
Expand Down