4
0
Fork 0
mirror of https://github.com/actions/setup-go.git synced 2025-11-07 04:26:55 +00:00

Compare commits

...

4 commits

Author SHA1 Message Date
Paweł Bęza
20ab733c5d
Merge d4abd817f3 into faf52423ec 2025-10-29 18:53:38 +09:00
priya-kinthali
faf52423ec
Add support for .tool-versions file in setup-go, update workflow (#673)
* setup go in local

* add .tool-versions file support
2025-10-28 10:26:52 -05:00
Nicholas Ngai
7bc60db215
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
2025-10-27 15:43:21 -05:00
Paweł Bęza
d4abd817f3 Update caching doc 2025-04-02 15:27:05 +02:00
9 changed files with 71 additions and 22 deletions

View file

@ -18,7 +18,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest, macos-13] os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- name: Setup Go Stable - name: Setup Go Stable
@ -33,7 +33,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest, macos-13] os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- name: Setup Go oldStable - name: Setup Go oldStable
@ -48,13 +48,13 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest, macos-13] os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
version: [stable, oldstable] version: [stable, oldstable]
architecture: [x64, x32] architecture: [x64, x32]
exclude: exclude:
- os: macos-latest - os: macos-latest
architecture: x32 architecture: x32
- os: macos-13 - os: macos-latest-large
architecture: x32 architecture: x32
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
@ -72,7 +72,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: 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] go: [1.21.13, 1.22.8, 1.23.2]
include: include:
- os: windows-latest - os: windows-latest
@ -98,7 +98,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: 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'] go-version: ['1.20', '1.21', '1.22', '1.23']
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
@ -115,7 +115,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest, macos-13] os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- name: Setup Go and check latest - name: Setup Go and check latest
@ -131,7 +131,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest, macos-13] os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- name: Setup Go and check latest - name: Setup Go and check latest
@ -142,12 +142,28 @@ jobs:
run: __tests__/verify-go.sh 1.21 run: __tests__/verify-go.sh 1.21
shell: bash 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: setup-versions-from-manifest:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: 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] go: [1.20.14, 1.21.10, 1.22.8, 1.23.2]
steps: steps:
- name: Checkout - name: Checkout
@ -167,7 +183,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-13] os: [windows-latest, ubuntu-latest, macos-latest-large]
go: [1.11.12] go: [1.11.12]
steps: steps:
- name: Checkout - name: Checkout
@ -187,7 +203,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: 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] go-version: [1.20.14, 1.21, 1.22, 1.23]
include: include:
- os: macos-latest - os: macos-latest
@ -196,7 +212,7 @@ jobs:
architecture: x64 architecture: x64
- os: windows-latest - os: windows-latest
architecture: x64 architecture: x64
- os: macos-13 - os: macos-latest-large
architecture: x64 architecture: x64
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5

View file

@ -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 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) 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 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). 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 **Note:** The `setup-go` action uses executable binaries which are built by Golang side. The action does not build
@ -178,7 +178,7 @@ steps:
## Getting go version from the go.mod file ## 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 file that contains the version of Go to be used by a project. The version taken
from thils file will be: from thils file will be:
@ -203,6 +203,15 @@ steps:
go-version-file: 'path/to/go.mod' go-version-file: 'path/to/go.mod'
- run: go version - 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 ## Matrix testing
@ -240,7 +249,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). 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 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: 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:

View file

@ -0,0 +1 @@
golang 1.23.2

View file

@ -389,7 +389,7 @@ describe('setup-go', () => {
const expPath = path.win32.join(toolPath, 'bin'); const expPath = path.win32.join(toolPath, 'bin');
expect(dlSpy).toHaveBeenCalledWith( 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', 'C:\\temp\\go1.13.1.windows-amd64.zip',
undefined undefined
); );
@ -866,6 +866,9 @@ exclude example.com/thismodule v1.3.0
use . use .
`;
const toolVersionsContents = `golang 1.23
`; `;
it('reads version from go.mod', async () => { it('reads version from go.mod', async () => {
@ -892,6 +895,18 @@ use .
expect(logSpy).toHaveBeenCalledWith('matching 1.19...'); 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 () => { it('reads version from .go-version', async () => {
inputs['go-version-file'] = '.go-version'; inputs['go-version-file'] = '.go-version';
existsSpy.mockImplementation(() => true); existsSpy.mockImplementation(() => true);
@ -946,7 +961,7 @@ use .
const expectedUrl = const expectedUrl =
platform === 'win32' platform === 'win32'
? `https://github.com/actions/go-versions/releases/download/${version}/go-${version}-${platform}-${arch}.${fileExtension}` ? `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 // ... but not in the local cache
findSpy.mockImplementation(() => ''); findSpy.mockImplementation(() => '');

View file

@ -5,7 +5,7 @@ inputs:
go-version: 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.' 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: 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: 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' 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 default: false

6
dist/setup/index.js vendored
View file

@ -94583,7 +94583,7 @@ function getInfoFromDist(versionSpec, arch) {
if (!version) { if (!version) {
return null; return null;
} }
const downloadUrl = `https://storage.googleapis.com/golang/${version.files[0].filename}`; const downloadUrl = `https://go.dev/dl/${version.files[0].filename}`;
return { return {
type: 'dist', type: 'dist',
downloadUrl: downloadUrl, downloadUrl: downloadUrl,
@ -94679,6 +94679,10 @@ function parseGoVersionFile(versionFilePath) {
const matchGo = contents.match(/^go (\d+(\.\d+)*)/m); const matchGo = contents.match(/^go (\d+(\.\d+)*)/m);
return matchGo ? matchGo[1] : ''; 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(); return contents.trim();
} }
function resolveStableVersionDist(versionSpec, arch) { function resolveStableVersionDist(versionSpec, arch) {

View file

@ -17,8 +17,8 @@ We don't pursue the goal to provide wide customization of caching in scope of `a
# Decision # Decision
- Add `cache` input parameter to `actions/setup-go`. For now, input will accept the following values: - Add `cache` input parameter to `actions/setup-go`. For now, input will accept the following values:
- `true` - enable caching for go dependencies - `true` - enable caching for go dependencies. This is the default value.
- `false`- disable caching for go dependencies. This value will be set as default value - `false`- disable caching for go dependencies.
- Cache feature will be disabled by default to make sure that we don't break existing customers. We will consider enabling cache by default in next major releases - Cache feature will be disabled by default to make sure that we don't break existing customers. We will consider enabling cache by default in next major releases
- Action will try to search a go.sum files in the repository and throw error in the scenario that it was not found - Action will try to search a go.sum files in the repository and throw error in the scenario that it was not found
- The hash of found file will be used as cache key (the same approach like [actions/cache](https://github.com/actions/cache/blob/main/examples.md#go---modules) recommends) - The hash of found file will be used as cache key (the same approach like [actions/cache](https://github.com/actions/cache/blob/main/examples.md#go---modules) recommends)

View file

@ -15,6 +15,7 @@ process.on('uncaughtException', e => {
// Added early exit to resolve issue with slow post action step: // Added early exit to resolve issue with slow post action step:
// - https://github.com/actions/setup-node/issues/878 // - https://github.com/actions/setup-node/issues/878
// https://github.com/actions/cache/pull/1217 // https://github.com/actions/cache/pull/1217
export async function run(earlyExit?: boolean) { export async function run(earlyExit?: boolean) {
try { try {
const cacheInput = core.getBooleanInput('cache'); const cacheInput = core.getBooleanInput('cache');

View file

@ -389,7 +389,7 @@ async function getInfoFromDist(
return null; return null;
} }
const downloadUrl = `https://storage.googleapis.com/golang/${version.files[0].filename}`; const downloadUrl = `https://go.dev/dl/${version.files[0].filename}`;
return <IGoVersionInfo>{ return <IGoVersionInfo>{
type: 'dist', type: 'dist',
@ -513,6 +513,9 @@ export function parseGoVersionFile(versionFilePath: string): string {
// go directive: https://go.dev/ref/mod#go-mod-file-go // go directive: https://go.dev/ref/mod#go-mod-file-go
const matchGo = contents.match(/^go (\d+(\.\d+)*)/m); const matchGo = contents.match(/^go (\d+(\.\d+)*)/m);
return matchGo ? matchGo[1] : ''; 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(); return contents.trim();