From 7bc60db215a8b16959b0b5cccfdc95950d697b25 Mon Sep 17 00:00:00 2001 From: Nicholas Ngai Date: Mon, 27 Oct 2025 13:43:21 -0700 Subject: [PATCH 1/2] Fall back to downloading from go.dev/dl instead of storage.googleapis.com/golang (#665) * Fall back to downloading from dl.google.com/go instead of storage.googleapis.com/golang * Use go.dev/dl instead --- README.md | 4 ++-- __tests__/setup-go.test.ts | 4 ++-- dist/setup/index.js | 2 +- src/installer.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 564d55f..11cf77a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ See full release notes on the [releases page](https://github.com/actions/setup-g The action will first check the local cache for a version match. If a version is not found locally, it will pull it from the `main` branch of the [go-versions](https://github.com/actions/go-versions/blob/main/versions-manifest.json) repository. On miss or failure, it will fall back to downloading directly -from [go dist](https://storage.googleapis.com/golang). To change the default behavior, please use +from [go dist](https://go.dev/dl). To change the default behavior, please use the [check-latest input](#check-latest-version). **Note:** The `setup-go` action uses executable binaries which are built by Golang side. The action does not build @@ -240,7 +240,7 @@ When dynamically downloading Go distributions, `setup-go` downloads distribution These calls to `actions/go-versions` are made via unauthenticated requests, which are limited to [60 requests per hour per IP](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting). If more requests are made within the time frame, then the action leverages the `raw API` to retrieve the version-manifest. This approach does not impose a rate limit and hence facilitates unrestricted consumption. This is particularly beneficial for GHES runners, which often share the same IP, to avoid the quick exhaustion of the unauthenticated rate limit. -If that fails as well the action will try to download versions directly from https://storage.googleapis.com/golang. +If that fails as well the action will try to download versions directly from https://go.dev/dl. If that fails as well you can get a higher rate limit with [generating a personal access token on github.com](https://github.com/settings/tokens/new) and passing it as the `token` input to the action: diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index b89c08f..56d8417 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -389,7 +389,7 @@ describe('setup-go', () => { const expPath = path.win32.join(toolPath, 'bin'); expect(dlSpy).toHaveBeenCalledWith( - 'https://storage.googleapis.com/golang/go1.13.1.windows-amd64.zip', + 'https://go.dev/dl/go1.13.1.windows-amd64.zip', 'C:\\temp\\go1.13.1.windows-amd64.zip', undefined ); @@ -946,7 +946,7 @@ use . const expectedUrl = platform === 'win32' ? `https://github.com/actions/go-versions/releases/download/${version}/go-${version}-${platform}-${arch}.${fileExtension}` - : `https://storage.googleapis.com/golang/go${version}.${osSpec}-${arch}.${fileExtension}`; + : `https://go.dev/dl/go${version}.${osSpec}-${arch}.${fileExtension}`; // ... but not in the local cache findSpy.mockImplementation(() => ''); diff --git a/dist/setup/index.js b/dist/setup/index.js index 96f4ef9..3313976 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -94583,7 +94583,7 @@ function getInfoFromDist(versionSpec, arch) { if (!version) { return null; } - const downloadUrl = `https://storage.googleapis.com/golang/${version.files[0].filename}`; + const downloadUrl = `https://go.dev/dl/${version.files[0].filename}`; return { type: 'dist', downloadUrl: downloadUrl, diff --git a/src/installer.ts b/src/installer.ts index 6dcd729..2e5ae23 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -389,7 +389,7 @@ async function getInfoFromDist( return null; } - const downloadUrl = `https://storage.googleapis.com/golang/${version.files[0].filename}`; + const downloadUrl = `https://go.dev/dl/${version.files[0].filename}`; return { type: 'dist', From faf52423ec0d44c58f68e83b614bfcd99dded66f Mon Sep 17 00:00:00 2001 From: priya-kinthali <147703874+priya-kinthali@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:56:52 +0530 Subject: [PATCH 2/2] Add support for .tool-versions file in setup-go, update workflow (#673) * setup go in local * add .tool-versions file support --- .github/workflows/versions.yml | 40 ++++++++++++++++++++++++---------- README.md | 11 +++++++++- __tests__/data/.tool-versions | 1 + __tests__/setup-go.test.ts | 15 +++++++++++++ action.yml | 2 +- dist/setup/index.js | 4 ++++ src/cache-save.ts | 1 + src/installer.ts | 3 +++ 8 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 __tests__/data/.tool-versions diff --git a/.github/workflows/versions.yml b/.github/workflows/versions.yml index 89f4c42..198e82e 100644 --- a/.github/workflows/versions.yml +++ b/.github/workflows/versions.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] steps: - uses: actions/checkout@v5 - name: Setup Go Stable @@ -33,7 +33,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] steps: - uses: actions/checkout@v5 - name: Setup Go oldStable @@ -48,13 +48,13 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] version: [stable, oldstable] architecture: [x64, x32] exclude: - os: macos-latest architecture: x32 - - os: macos-13 + - os: macos-latest-large architecture: x32 steps: - uses: actions/checkout@v5 @@ -72,7 +72,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-latest, macos-13] + os: [macos-latest, windows-latest, ubuntu-latest, macos-latest-large] go: [1.21.13, 1.22.8, 1.23.2] include: - os: windows-latest @@ -98,7 +98,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] go-version: ['1.20', '1.21', '1.22', '1.23'] steps: - uses: actions/checkout@v5 @@ -115,7 +115,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] steps: - uses: actions/checkout@v5 - name: Setup Go and check latest @@ -131,7 +131,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] steps: - uses: actions/checkout@v5 - name: Setup Go and check latest @@ -142,12 +142,28 @@ jobs: run: __tests__/verify-go.sh 1.21 shell: bash + go-version-file-with-tool-versions: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] + steps: + - uses: actions/checkout@v5 + - name: Setup Go and check latest + uses: ./ + with: + go-version-file: __tests__/data/.tool-versions + - name: verify go + run: __tests__/verify-go.sh 1.23.2 + shell: bash + setup-versions-from-manifest: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-latest, macos-13] + os: [macos-latest, windows-latest, ubuntu-latest, macos-latest-large] go: [1.20.14, 1.21.10, 1.22.8, 1.23.2] steps: - name: Checkout @@ -167,7 +183,7 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, ubuntu-latest, macos-13] + os: [windows-latest, ubuntu-latest, macos-latest-large] go: [1.11.12] steps: - name: Checkout @@ -187,7 +203,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large] go-version: [1.20.14, 1.21, 1.22, 1.23] include: - os: macos-latest @@ -196,7 +212,7 @@ jobs: architecture: x64 - os: windows-latest architecture: x64 - - os: macos-13 + - os: macos-latest-large architecture: x64 steps: - uses: actions/checkout@v5 diff --git a/README.md b/README.md index 11cf77a..0681b6c 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,7 @@ steps: ## Getting go version from the go.mod file -The `go-version-file` input accepts a path to a `go.mod` file or a `go.work` +The `go-version-file` input accepts a path to a `go.mod` file, `.tool-versions` file or a `go.work` file that contains the version of Go to be used by a project. The version taken from thils file will be: @@ -203,6 +203,15 @@ steps: go-version-file: 'path/to/go.mod' - run: go version ``` +```yaml +steps: + - uses: actions/checkout@v5 + - uses: actions/setup-go@v6 + with: + go-version-file: '.tool-versions' + - run: go version +``` +> The [.tool-versions file](https://asdf-vm.com/manage/configuration.html#tool-versions) supports version specifications in accordance with asdf standards, adhering to Semantic Versioning ([semver](https://semver.org)). ## Matrix testing diff --git a/__tests__/data/.tool-versions b/__tests__/data/.tool-versions new file mode 100644 index 0000000..f0e1c18 --- /dev/null +++ b/__tests__/data/.tool-versions @@ -0,0 +1 @@ +golang 1.23.2 \ No newline at end of file diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 56d8417..8cefcce 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -866,6 +866,9 @@ exclude example.com/thismodule v1.3.0 use . +`; + + const toolVersionsContents = `golang 1.23 `; it('reads version from go.mod', async () => { @@ -892,6 +895,18 @@ use . expect(logSpy).toHaveBeenCalledWith('matching 1.19...'); }); + it('reads version from .tool-versions', async () => { + inputs['go-version-file'] = '.tool-versions'; + existsSpy.mockImplementation(() => true); + readFileSpy.mockImplementation(() => Buffer.from(toolVersionsContents)); + + await main.run(); + + expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.23'); + expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.23...'); + expect(logSpy).toHaveBeenCalledWith('matching 1.23...'); + }); + it('reads version from .go-version', async () => { inputs['go-version-file'] = '.go-version'; existsSpy.mockImplementation(() => true); diff --git a/action.yml b/action.yml index 9946e47..6a345b3 100644 --- a/action.yml +++ b/action.yml @@ -5,7 +5,7 @@ inputs: go-version: description: 'The Go version to download (if necessary) and use. Supports semver spec and ranges. Be sure to enclose this option in single quotation marks.' go-version-file: - description: 'Path to the go.mod or go.work file.' + description: 'Path to the go.mod, .tool-versions, or go.work file.' check-latest: description: 'Set this option to true if you want the action to always check for the latest available version that satisfies the version spec' default: false diff --git a/dist/setup/index.js b/dist/setup/index.js index 3313976..b6244b4 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -94679,6 +94679,10 @@ function parseGoVersionFile(versionFilePath) { const matchGo = contents.match(/^go (\d+(\.\d+)*)/m); return matchGo ? matchGo[1] : ''; } + else if (path.basename(versionFilePath) === '.tool-versions') { + const match = contents.match(/^golang\s+([^\n#]+)/m); + return match ? match[1].trim() : ''; + } return contents.trim(); } function resolveStableVersionDist(versionSpec, arch) { diff --git a/src/cache-save.ts b/src/cache-save.ts index 5baefde..f873527 100644 --- a/src/cache-save.ts +++ b/src/cache-save.ts @@ -15,6 +15,7 @@ process.on('uncaughtException', e => { // Added early exit to resolve issue with slow post action step: // - https://github.com/actions/setup-node/issues/878 // https://github.com/actions/cache/pull/1217 + export async function run(earlyExit?: boolean) { try { const cacheInput = core.getBooleanInput('cache'); diff --git a/src/installer.ts b/src/installer.ts index 2e5ae23..9402a83 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -513,6 +513,9 @@ export function parseGoVersionFile(versionFilePath: string): string { // go directive: https://go.dev/ref/mod#go-mod-file-go const matchGo = contents.match(/^go (\d+(\.\d+)*)/m); return matchGo ? matchGo[1] : ''; + } else if (path.basename(versionFilePath) === '.tool-versions') { + const match = contents.match(/^golang\s+([^\n#]+)/m); + return match ? match[1].trim() : ''; } return contents.trim();