Skip to content

Use setup-codeql logic for finding release assets in start-proxy - #4198

Open
mbg wants to merge 9 commits into
mainfrom
mbg/start-proxy/deprecate-fallback
Open

mbg wants to merge 9 commits into
mainfrom
mbg/start-proxy/deprecate-fallback

Conversation

@mbg

@mbg mbg commented Oct 6, 2026 •

Copy link
Copy Markdown
Member

The start-proxy Action currently uses its own getReleaseByVersion function to get hold of the release that we expect to find the proxy assets at. That function has hard-coded owner and repo values for the default github/codeql-action repository. This repository may not be available in all environments. In such environments, getReleaseByVersion fails and we fall-back to the hard-coded release obtained from getFallbackUrl instead.

Broadly, this PR does the following:

  • getCodeQLActionRepository and getCodeQLBundleDownloadURL are refactored out of setup-codeql into a new setup/repository module.
  • We then use getCodeQLAssetDownloadURL (renamed from getCodeQLBundleDownloadURL) in the start-proxy action to apply the same logic for finding a suitable release as used by setup-codeql.
  • The hard-coded fallback has been removed. The default URL returned by getCodeQLBundleDownloadURL is essentially equivalent, except that it uses the linked version rather than a hard-coded one. We have been shipping proxy artifacts successfully with releases for a good while now, so the fallback shouldn't be needed anymore.

There are some drive-by improvements to logging and assertions for sinon stubs.

Risk assessment

For internal use only. Please select the risk level of this change:

  • Low risk: Changes are fully under feature flags, or have been fully tested and validated in pre-production environments and are highly observable, or are documentation or test only.

Which use cases does this change impact?

Workflow types:

  • Managed - Impacts users with dynamic workflows (Default Setup, Code Quality, ...).

Products:

  • Code Scanning - The changes impact analyses when analysis-kinds: code-scanning.
  • Code Quality - The changes impact analyses when analysis-kinds: code-quality.
  • Other first-party - The changes impact other first-party analyses.

Environments:

  • Dotcom - Impacts CodeQL workflows on github.com and/or GitHub Enterprise Cloud with Data Residency.
  • GHES - Impacts CodeQL workflows on GitHub Enterprise Server.

How did/will you validate this change?

  • Unit tests - I am depending on unit test coverage (i.e. tests in .test.ts files).
  • End-to-end tests - I am depending on PR checks (i.e. tests in pr-checks).

If something goes wrong after this change is released, what are the mitigation and rollback strategies?

  • Rollback - Change can only be disabled by rolling back the release or releasing a new version with a fix.

How will you know if something goes wrong after this change is released?

  • Telemetry - I rely on existing telemetry or have made changes to the telemetry.
    • Dashboards - I will watch relevant dashboards for issues after the release. Consider whether this requires this change to be released at a particular time rather than as part of a regular release.
    • Alerts - New or existing monitors will trip if something goes wrong with this change.

Are there any special considerations for merging or releasing this change?

  • No special considerations - This change can be merged at any time.

Merge / deployment checklist

  • Confirm this change is backwards compatible with existing workflows.
  • Consider adding a changelog entry for this change.
  • Confirm the readme and docs have been updated if necessary.

@github-actions github-actions Bot added the size/L May be hard to review label Oct 6, 2026
@mbg
mbg force-pushed the mbg/start-proxy/deprecate-fallback branch from 362e7d4 to cd87ccd Compare October 6, 2026 15:56
@mbg
mbg force-pushed the mbg/start-proxy/deprecate-fallback branch from cd87ccd to 133ffeb Compare October 6, 2026 16:10
@mbg
mbg marked this pull request as ready for review October 6, 2026 16:12
@mbg
mbg requested a review from a team as a code owner October 6, 2026 16:12
@mbg
mbg requested review from henrymercer and a balanced review from Copilot October 6, 2026 16:12

This comment was marked as outdated.

@github-actions github-actions Bot added size/XL May be very hard to review and removed size/L May be hard to review labels Oct 6, 2026
test.serial("getCodeQLActionRepository", (t) => {
const logger = getRunnerLogger(true);

test.serial("getCodeQLActionRepository", async (t) => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this now be run in parallel with other tests?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see it can't because initializeEnvironment updates process.env directly.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, it goes via exportVariable, which we know is causing problems in tests since we never resolved the issue that #3930 aims to address.

That PR predates ActionState, so maybe it's worth reviving that effort with a suitable method on the Env or Actions states. What do you think?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR predates ActionState, so maybe it's worth reviving that effort with a suitable method on the Env or Actions states. What do you think?

Sounds good to me.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in #4212

Comment thread src/setup/repository.ts
Comment on lines +34 to +35
/**A download source is a pair of strings. */
export type DownloadSource = [string, string];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this be something like [DownloadURL, RepositoryNwo] instead (both of which could still be typed as strings)?

Comment thread src/setup/repository.ts
): Promise<DownloadURL> {
const codeQLActionRepository = getCodeQLActionRepository(action);

const potentialDownloadSources: Array<[string, string]> = [

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not DownloadSource[]?

Comment thread src/setup/repository.ts
},
);

for (const [apiURL, repository] of uniqueDownloadSources) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just a URL, not an API URL, i.e. it doesn't start with api.

Comment thread src/testing-utils.ts
/**
* Asserts that `stub` must have been called once with at least the `expected` arguments.
*/
onceWith: <TArgs extends readonly any[]>(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beyond your later fix in f9a9962, I think this should just be calledWith, since unlike calledOnce / calledOnceWithExactly / calledOnceWithMatch we don't validate that the stub was only called once.

Comment thread src/setup/repository.ts
export type DownloadURL = string;

/** Gets the default GitHub.com download URL for `assetName` in a release tagged `tagName`. */
export function getDefaultDotComDownloadURL(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: elsewhere, we use Dotcom

Comment thread src/start-proxy.ts
@@ -569,15 +533,15 @@
* @returns The path to the proxy binary.
*/
export async function getProxyBinaryPath(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider creating a log group for the download step and including more progress information in the logs. In the PR check for instance "The CodeQL Action is checked out locally. Using the default CodeQL Action repository." is logged, and there's an untar, but it's unclear to most users what's going on.

@henrymercer henrymercer left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of additional comments

Comment thread src/logging.ts
Comment on lines +3 to +4
/** Types that all of our logging functions accept. */
export type Loggable = string | string[];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking back at this after a commit-by-commit review, does anything use this? If not, let's remove it.

Comment thread src/setup/repository.ts
);

for (const [apiURL, repository] of uniqueDownloadSources) {
// If we've reached the final case, short-circuit the API check since we know the bundle exists and is public.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: update this comment to refer to an "asset"

Comment thread src/start-proxy.ts
try {
// Download the proxy archive from `url`. We let `downloadTool` choose where
// to store it. The path to the downloaded file will be returned if successful.
return toolcache.downloadTool(url, /* dest: */ undefined, authorization, {

@henrymercer henrymercer Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be awaited (so the try catches errors that happen asynchronously)?

Comment thread src/start-proxy.test.ts
SAMPLE_DOTCOM_API_DETAILS,
);

t.is(getReleaseByTag.callCount, 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An existing issue to some extent, but because mockGetReleaseByTag returns the result of mockGetApiClient, this is actually asserting the number of calls to getApiClient.

Comment thread src/start-proxy.test.ts
Comment on lines +1079 to 1083
st.onceWith(extractTar, archivePath);
st.onceWith(cacheDir, extractedPath);

t.assert(extractTar.calledOnceWith(archivePath));
t.assert(cacheDir.calledOnceWith(extractedPath));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's some duplication here

test.serial("getCodeQLActionRepository", (t) => {
const logger = getRunnerLogger(true);

test.serial("getCodeQLActionRepository", async (t) => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see it can't because initializeEnvironment updates process.env directly.

Comment thread src/setup/repository.ts
tagName: string,
assetName: string,
): DownloadURL {
return `https://github.com/${CODEQL_DEFAULT_ACTION_REPOSITORY}/releases/download/${tagName}/${assetName}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: we could use GITHUB_DOTCOM_URL here.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/XL May be very hard to review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants