Merge pull request #227 from github/cbraynor/cache-pinning
Prioritizing pre-downloaded CodeQL bundle in some circumstances
This commit is contained in:
commit
481f3ce214
8 changed files with 278 additions and 2 deletions
2
.github/workflows/integration-testing.yml
vendored
2
.github/workflows/integration-testing.yml
vendored
|
|
@ -44,6 +44,7 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
|
tools: [~, latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
@ -56,6 +57,7 @@ jobs:
|
||||||
mv ../action/tests/multi-language-repo/{*,.github} .
|
mv ../action/tests/multi-language-repo/{*,.github} .
|
||||||
- uses: ./../action/init
|
- uses: ./../action/init
|
||||||
with:
|
with:
|
||||||
|
tools: ${{ matrix.tools }}
|
||||||
languages: cpp,csharp,java,javascript,python
|
languages: cpp,csharp,java,javascript,python
|
||||||
config-file: github/codeql-action/tests/multi-language-repo/.github/codeql/custom-queries.yml@${{ github.sha }}
|
config-file: github/codeql-action/tests/multi-language-repo/.github/codeql/custom-queries.yml@${{ github.sha }}
|
||||||
- name: Build code
|
- name: Build code
|
||||||
|
|
|
||||||
20
lib/codeql.js
generated
20
lib/codeql.js
generated
|
|
@ -116,8 +116,28 @@ async function setupCodeQL(codeqlURL, githubAuth, githubUrl, tempDir, toolsDir,
|
||||||
process.env["RUNNER_TEMP"] = tempDir;
|
process.env["RUNNER_TEMP"] = tempDir;
|
||||||
process.env["RUNNER_TOOL_CACHE"] = toolsDir;
|
process.env["RUNNER_TOOL_CACHE"] = toolsDir;
|
||||||
try {
|
try {
|
||||||
|
// We use the special value of 'latest' to prioritize the version in the
|
||||||
|
// defaults over any pinned cached version.
|
||||||
|
const forceLatest = codeqlURL === "latest";
|
||||||
|
if (forceLatest) {
|
||||||
|
codeqlURL = undefined;
|
||||||
|
}
|
||||||
const codeqlURLVersion = getCodeQLURLVersion(codeqlURL || `/${CODEQL_BUNDLE_VERSION}/`, logger);
|
const codeqlURLVersion = getCodeQLURLVersion(codeqlURL || `/${CODEQL_BUNDLE_VERSION}/`, logger);
|
||||||
|
// If we find the specified version, we always use that.
|
||||||
let codeqlFolder = toolcache.find("CodeQL", codeqlURLVersion);
|
let codeqlFolder = toolcache.find("CodeQL", codeqlURLVersion);
|
||||||
|
// If we don't find the requested version, in some cases we may allow a
|
||||||
|
// different version to save download time if the version hasn't been
|
||||||
|
// specified explicitly (in which case we always honor it).
|
||||||
|
if (!codeqlFolder && !codeqlURL && !forceLatest) {
|
||||||
|
const codeqlVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
if (codeqlVersions.length === 1) {
|
||||||
|
const tmpCodeqlFolder = toolcache.find("CodeQL", codeqlVersions[0]);
|
||||||
|
if (fs.existsSync(path.join(tmpCodeqlFolder, "pinned-version"))) {
|
||||||
|
logger.debug(`CodeQL in cache overriding the default ${CODEQL_BUNDLE_VERSION}`);
|
||||||
|
codeqlFolder = tmpCodeqlFolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (codeqlFolder) {
|
if (codeqlFolder) {
|
||||||
logger.debug(`CodeQL found in cache ${codeqlFolder}`);
|
logger.debug(`CodeQL found in cache ${codeqlFolder}`);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
57
lib/codeql.test.js
generated
57
lib/codeql.test.js
generated
|
|
@ -18,6 +18,7 @@ const codeql = __importStar(require("./codeql"));
|
||||||
const logging_1 = require("./logging");
|
const logging_1 = require("./logging");
|
||||||
const testing_utils_1 = require("./testing-utils");
|
const testing_utils_1 = require("./testing-utils");
|
||||||
const util = __importStar(require("./util"));
|
const util = __importStar(require("./util"));
|
||||||
|
const defaults = __importStar(require("./defaults.json"));
|
||||||
testing_utils_1.setupTests(ava_1.default);
|
testing_utils_1.setupTests(ava_1.default);
|
||||||
ava_1.default("download codeql bundle cache", async (t) => {
|
ava_1.default("download codeql bundle cache", async (t) => {
|
||||||
await util.withTmpDir(async (tmpDir) => {
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
|
@ -34,6 +35,62 @@ ava_1.default("download codeql bundle cache", async (t) => {
|
||||||
t.is(cachedVersions.length, 2);
|
t.is(cachedVersions.length, 2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
ava_1.default("download codeql bundle cache explicitly requested with pinned different version cached", async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock_1.default("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle-pinned.tar.gz`));
|
||||||
|
await codeql.setupCodeQL("https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz", "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
nock_1.default("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200610/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`));
|
||||||
|
await codeql.setupCodeQL("https://example.com/download/codeql-bundle-20200610/codeql-bundle.tar.gz", "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200610"));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ava_1.default("don't download codeql bundle cache with pinned different version cached", async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock_1.default("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle-pinned.tar.gz`));
|
||||||
|
await codeql.setupCodeQL("https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz", "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
await codeql.setupCodeQL(undefined, "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
t.is(cachedVersions.length, 1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ava_1.default("download codeql bundle cache with different version cached (not pinned)", async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock_1.default("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`));
|
||||||
|
await codeql.setupCodeQL("https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz", "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
nock_1.default("https://github.com")
|
||||||
|
.get(`/github/codeql-action/releases/download/${defaults.bundleVersion}/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`));
|
||||||
|
await codeql.setupCodeQL(undefined, "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
t.is(cachedVersions.length, 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ava_1.default('download codeql bundle cache with pinned different version cached if "latests" tools specied', async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock_1.default("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle-pinned.tar.gz`));
|
||||||
|
await codeql.setupCodeQL("https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz", "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
nock_1.default("https://github.com")
|
||||||
|
.get(`/github/codeql-action/releases/download/${defaults.bundleVersion}/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(200, path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`));
|
||||||
|
await codeql.setupCodeQL("latest", "token", "https://github.com", tmpDir, tmpDir, "runner", logging_1.getRunnerLogger(true));
|
||||||
|
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
t.is(cachedVersions.length, 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
ava_1.default("parse codeql bundle url version", (t) => {
|
ava_1.default("parse codeql bundle url version", (t) => {
|
||||||
const tests = {
|
const tests = {
|
||||||
"20200601": "0.0.0-20200601",
|
"20200601": "0.0.0-20200601",
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -7,6 +7,7 @@ import * as codeql from "./codeql";
|
||||||
import { getRunnerLogger } from "./logging";
|
import { getRunnerLogger } from "./logging";
|
||||||
import { setupTests } from "./testing-utils";
|
import { setupTests } from "./testing-utils";
|
||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
|
import * as defaults from "./defaults.json";
|
||||||
|
|
||||||
setupTests(test);
|
setupTests(test);
|
||||||
|
|
||||||
|
|
@ -43,6 +44,177 @@ test("download codeql bundle cache", async (t) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("download codeql bundle cache explicitly requested with pinned different version cached", async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle-pinned.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
"https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz",
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
|
||||||
|
nock("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200610/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
"https://example.com/download/codeql-bundle-20200610/codeql-bundle.tar.gz",
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200610"));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("don't download codeql bundle cache with pinned different version cached", async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle-pinned.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
"https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz",
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
undefined,
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
|
||||||
|
t.is(cachedVersions.length, 1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("download codeql bundle cache with different version cached (not pinned)", async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
"https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz",
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
|
||||||
|
nock("https://github.com")
|
||||||
|
.get(
|
||||||
|
`/github/codeql-action/releases/download/${defaults.bundleVersion}/codeql-bundle.tar.gz`
|
||||||
|
)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
undefined,
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
|
||||||
|
t.is(cachedVersions.length, 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('download codeql bundle cache with pinned different version cached if "latests" tools specied', async (t) => {
|
||||||
|
await util.withTmpDir(async (tmpDir) => {
|
||||||
|
nock("https://example.com")
|
||||||
|
.get(`/download/codeql-bundle-20200601/codeql-bundle.tar.gz`)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle-pinned.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
"https://example.com/download/codeql-bundle-20200601/codeql-bundle.tar.gz",
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
t.assert(toolcache.find("CodeQL", "0.0.0-20200601"));
|
||||||
|
|
||||||
|
nock("https://github.com")
|
||||||
|
.get(
|
||||||
|
`/github/codeql-action/releases/download/${defaults.bundleVersion}/codeql-bundle.tar.gz`
|
||||||
|
)
|
||||||
|
.replyWithFile(
|
||||||
|
200,
|
||||||
|
path.join(__dirname, `/../src/testdata/codeql-bundle.tar.gz`)
|
||||||
|
);
|
||||||
|
|
||||||
|
await codeql.setupCodeQL(
|
||||||
|
"latest",
|
||||||
|
"token",
|
||||||
|
"https://github.com",
|
||||||
|
tmpDir,
|
||||||
|
tmpDir,
|
||||||
|
"runner",
|
||||||
|
getRunnerLogger(true)
|
||||||
|
);
|
||||||
|
|
||||||
|
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
|
||||||
|
t.is(cachedVersions.length, 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test("parse codeql bundle url version", (t) => {
|
test("parse codeql bundle url version", (t) => {
|
||||||
const tests = {
|
const tests = {
|
||||||
"20200601": "0.0.0-20200601",
|
"20200601": "0.0.0-20200601",
|
||||||
|
|
|
||||||
|
|
@ -235,12 +235,37 @@ export async function setupCodeQL(
|
||||||
process.env["RUNNER_TOOL_CACHE"] = toolsDir;
|
process.env["RUNNER_TOOL_CACHE"] = toolsDir;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// We use the special value of 'latest' to prioritize the version in the
|
||||||
|
// defaults over any pinned cached version.
|
||||||
|
const forceLatest = codeqlURL === "latest";
|
||||||
|
if (forceLatest) {
|
||||||
|
codeqlURL = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
const codeqlURLVersion = getCodeQLURLVersion(
|
const codeqlURLVersion = getCodeQLURLVersion(
|
||||||
codeqlURL || `/${CODEQL_BUNDLE_VERSION}/`,
|
codeqlURL || `/${CODEQL_BUNDLE_VERSION}/`,
|
||||||
logger
|
logger
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// If we find the specified version, we always use that.
|
||||||
let codeqlFolder = toolcache.find("CodeQL", codeqlURLVersion);
|
let codeqlFolder = toolcache.find("CodeQL", codeqlURLVersion);
|
||||||
|
|
||||||
|
// If we don't find the requested version, in some cases we may allow a
|
||||||
|
// different version to save download time if the version hasn't been
|
||||||
|
// specified explicitly (in which case we always honor it).
|
||||||
|
if (!codeqlFolder && !codeqlURL && !forceLatest) {
|
||||||
|
const codeqlVersions = toolcache.findAllVersions("CodeQL");
|
||||||
|
if (codeqlVersions.length === 1) {
|
||||||
|
const tmpCodeqlFolder = toolcache.find("CodeQL", codeqlVersions[0]);
|
||||||
|
if (fs.existsSync(path.join(tmpCodeqlFolder, "pinned-version"))) {
|
||||||
|
logger.debug(
|
||||||
|
`CodeQL in cache overriding the default ${CODEQL_BUNDLE_VERSION}`
|
||||||
|
);
|
||||||
|
codeqlFolder = tmpCodeqlFolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (codeqlFolder) {
|
if (codeqlFolder) {
|
||||||
logger.debug(`CodeQL found in cache ${codeqlFolder}`);
|
logger.debug(`CodeQL found in cache ${codeqlFolder}`);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
BIN
src/testdata/codeql-bundle-pinned.tar.gz
vendored
Normal file
BIN
src/testdata/codeql-bundle-pinned.tar.gz
vendored
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue