-
Notifications
You must be signed in to change notification settings - Fork 638
feat: add support for custom go-download-site input #687
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -381,8 +381,80 @@ For more information about semantic versioning, see the [semver documentation](h | |||||||||
|
|
||||||||||
| # Architecture to install (auto-detected if not specified) | ||||||||||
| architecture: 'x64' | ||||||||||
|
|
||||||||||
| # Base URL for downloading Go distributions (default: https://github.com) | ||||||||||
| go-download-site: 'https://github.com' | ||||||||||
|
|
||||||||||
| ## Using Custom Download Sites | ||||||||||
|
|
||||||||||
| For environments with restricted internet access or when using internal mirrors/proxies, you can configure the action to download Go distributions from a custom location using the `go-download-site` input. | ||||||||||
|
|
||||||||||
| ### Use Cases | ||||||||||
|
|
||||||||||
| - **GitHub Enterprise Server** - Access Go distributions through your internal server | ||||||||||
| - **Corporate Proxies** - Route downloads through approved proxy servers | ||||||||||
| - **Artifact Repositories** - Use internal artifact management systems (Artifactory, Nexus, etc.) | ||||||||||
| - **Air-Gapped Environments** - Download from pre-populated internal mirrors | ||||||||||
|
|
||||||||||
| ### Configuration | ||||||||||
|
|
||||||||||
| ```yaml | ||||||||||
| steps: | ||||||||||
| - uses: actions/checkout@v5 | ||||||||||
| - uses: actions/setup-go@v6 | ||||||||||
| with: | ||||||||||
| go-version: '1.21' | ||||||||||
| go-download-site: 'https://internal-artifactory.company.com/github-proxy' | ||||||||||
| - run: go version | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| **How it works:** | ||||||||||
|
|
||||||||||
| The action will replace the default `https://github.com` base URL with your custom download site. For example: | ||||||||||
|
|
||||||||||
| - **Default URL:** | ||||||||||
| ``` | ||||||||||
| https://github.com/actions/go-versions/releases/download/1.21.13-10277905115/go-1.21.13-linux-x64.tar.gz | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| - **Custom URL (with `go-download-site: 'https://internal-artifactory.company.com/github-proxy'`):** | ||||||||||
| ``` | ||||||||||
| https://internal-artifactory.company.com/github-proxy/actions/go-versions/releases/download/1.21.13-10277905115/go-1.21.13-linux-x64.tar.gz | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### Requirements | ||||||||||
|
|
||||||||||
| Your custom download site must: | ||||||||||
| 1. Mirror the same directory structure as GitHub's go-versions repository | ||||||||||
| 2. Host the pre-built Go distribution archives | ||||||||||
| 3. Be accessible from your runners | ||||||||||
|
||||||||||
| 3. Be accessible from your runners | |
| 3. Be accessible from your runners | |
| 4. Ensure that the versions manifest file (`https://raw.githubusercontent.com/actions/go-versions/main/versions-manifest.json`) is accessible from your runners. | |
| - **Note:** The action always fetches the manifest from this public URL, even when using a custom download site. In restricted environments, you may need to mirror or proxy this manifest file, or configure your network to allow access. |
Copilot
AI
Nov 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This note indicates that the go-download-site parameter doesn't affect fallback downloads from go.dev, but the implementation in installer.ts only modifies manifest-based downloads. Consider clarifying that:
- The parameter only affects downloads from the go-versions repository manifest
- When manifest downloads fail, the action falls back to go.dev without using the custom download site
- This limitation means truly air-gapped environments may still encounter issues if manifest downloads aren't available
This could be made clearer to help users understand when they might still need additional configuration for fully restricted environments.
| > **Note:** The `go-download-site` parameter only affects downloads from the go-versions repository. Direct downloads from go.dev (fallback mechanism) are not affected by this setting. | |
| > **Note:** The `go-download-site` parameter only affects downloads from the go-versions repository manifest. If manifest-based downloads fail, the action falls back to downloading directly from go.dev, and the custom download site is not used. This means that in truly air-gapped environments, you may still encounter issues if manifest downloads aren't available—additional configuration or pre-caching is required for fully restricted environments. |
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -42,7 +42,8 @@ export async function getGo( | |||||||
| versionSpec: string, | ||||||||
| checkLatest: boolean, | ||||||||
| auth: string | undefined, | ||||||||
| arch: Architecture = os.arch() as Architecture | ||||||||
| arch: Architecture = os.arch() as Architecture, | ||||||||
| goDownloadSite: string = 'https://github.com' | ||||||||
| ) { | ||||||||
| let manifest: tc.IToolRelease[] | undefined; | ||||||||
| const osPlat: string = os.platform(); | ||||||||
|
|
@@ -80,7 +81,8 @@ export async function getGo( | |||||||
| true, | ||||||||
| auth, | ||||||||
| arch, | ||||||||
| manifest | ||||||||
| manifest, | ||||||||
| goDownloadSite | ||||||||
| ); | ||||||||
| if (resolvedVersion) { | ||||||||
| versionSpec = resolvedVersion; | ||||||||
|
|
@@ -105,7 +107,7 @@ export async function getGo( | |||||||
| // Try download from internal distribution (popular versions only) | ||||||||
| // | ||||||||
| try { | ||||||||
| info = await getInfoFromManifest(versionSpec, true, auth, arch, manifest); | ||||||||
| info = await getInfoFromManifest(versionSpec, true, auth, arch, manifest, goDownloadSite); | ||||||||
| if (info) { | ||||||||
| downloadPath = await installGoVersion(info, auth, arch); | ||||||||
| } else { | ||||||||
|
|
@@ -155,15 +157,17 @@ async function resolveVersionFromManifest( | |||||||
| stable: boolean, | ||||||||
| auth: string | undefined, | ||||||||
| arch: Architecture, | ||||||||
| manifest: tc.IToolRelease[] | undefined | ||||||||
| manifest: tc.IToolRelease[] | undefined, | ||||||||
| goDownloadSite: string = 'https://github.com' | ||||||||
| ): Promise<string | undefined> { | ||||||||
| try { | ||||||||
| const info = await getInfoFromManifest( | ||||||||
| versionSpec, | ||||||||
| stable, | ||||||||
| auth, | ||||||||
| arch, | ||||||||
| manifest | ||||||||
| manifest, | ||||||||
| goDownloadSite | ||||||||
| ); | ||||||||
| return info?.resolvedVersion; | ||||||||
| } catch (err) { | ||||||||
|
|
@@ -357,7 +361,8 @@ export async function getInfoFromManifest( | |||||||
| stable: boolean, | ||||||||
| auth: string | undefined, | ||||||||
| arch: Architecture = os.arch() as Architecture, | ||||||||
| manifest?: tc.IToolRelease[] | undefined | ||||||||
| manifest?: tc.IToolRelease[] | undefined, | ||||||||
| goDownloadSite: string = 'https://github.com' | ||||||||
| ): Promise<IGoVersionInfo | null> { | ||||||||
| let info: IGoVersionInfo | null = null; | ||||||||
| if (!manifest) { | ||||||||
|
|
@@ -373,7 +378,8 @@ export async function getInfoFromManifest( | |||||||
| info = <IGoVersionInfo>{}; | ||||||||
| info.type = 'manifest'; | ||||||||
| info.resolvedVersion = rel.version; | ||||||||
| info.downloadUrl = rel.files[0].download_url; | ||||||||
| // Replace the default github.com URL with the custom download site | ||||||||
| info.downloadUrl = rel.files[0].download_url.replace('https://github.com', goDownloadSite); | ||||||||
|
||||||||
| info.downloadUrl = rel.files[0].download_url.replace('https://github.com', goDownloadSite); | |
| const normalizedSite = goDownloadSite.replace(/\/$/, ''); | |
| info.downloadUrl = rel.files[0].download_url.replace(/^https:\/\/github\.com/, normalizedSite); |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -33,12 +33,14 @@ export async function run() { | |||||
| const auth = !token ? undefined : `token ${token}`; | ||||||
|
|
||||||
| const checkLatest = core.getBooleanInput('check-latest'); | ||||||
| const goDownloadSite = core.getInput('go-download-site') || 'https://github.com'; | ||||||
|
||||||
| const goDownloadSite = core.getInput('go-download-site') || 'https://github.com'; | |
| const goDownloadSite = core.getInput('go-download-site'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The example URL
https://internal-artifactory.company.com/github-proxyshould clarify whether it should end with a trailing slash or not. The implementation uses simple string replacement, so the URL format must exactly match how GitHub structures its URLs. Consider adding a note:"Important: The custom download site URL should not include a trailing slash, as it directly replaces
https://github.comin the full download URL path."