* feat: fallback to "raw" endpoint for manifest when rate limit is reached
* add information about raw access to the README
* prettier
* update cross-spawn to 7.0.6 to fix vulnerability
* Update workflows and bump dependencies
* Add test for Go 1.22 and 1.23
* Update Go versions in local-cache setup and include macos-latest with ARM64 architecture
This workflow file publishes new action releases to the immutable action package of the same name as this repo.
This is part of the Immutable Actions project which is not yet fully released to the public. First party actions like this one are part of our initial testing of this feature.
* Fix emoji rendering
* Fix quoting
* Remove the description of the old go.mod specification
* Remove the single quotes from `go-version-file`
* Fix README
* Add description about patch versions to README
* Revert "Remove the single quotes from `go-version-file`"
This reverts commit ca4321abee.
<!--- Please direct any generic questions related to actions to our support community forum at https://github.community/c/code-to-cloud/github-actions/41 --->
<!--- Please direct any generic questions related to actions to our support community forum at https://github.com/orgs/community/discussions/categories/actions --->
<!--- Before opening up a new bug report, please make sure to check for similar existing issues -->
<!--- Before opening up a new bug report, please make sure to check for similar existing issues -->
<!--- Please direct any generic questions related to actions to our support community forum at https://github.community/c/code-to-cloud/github-actions/41 --->
<!--- Please direct any generic questions related to actions to our support community forum at https://github.com/orgs/community/discussions/categories/actions --->
<!--- Before opening up a new feature request, please make sure to check for similar existing issues and pull requests -->
<!--- Before opening up a new feature request, please make sure to check for similar existing issues and pull requests -->
@@ -8,6 +8,14 @@ This action sets up a go environment for use in actions by:
- Optionally downloading and caching a version of Go by version and adding to `PATH`.
- Optionally downloading and caching a version of Go by version and adding to `PATH`.
- Registering problem matchers for error output.
- Registering problem matchers for error output.
# V5
The V5 edition of the action offers:
- Upgraded Node.js runtime from node16 to node20
See full release notes on the [releases page](https://github.com/actions/setup-go/releases).
# V4
# V4
The V4 edition of the action offers:
The V4 edition of the action offers:
@@ -42,8 +50,8 @@ Matching by [semver spec](https://github.com/npm/node-semver):
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'^1.13.1'# The Go version to download (if necessary) and use.
go-version:'^1.13.1'# The Go version to download (if necessary) and use.
- run:go version
- run:go version
@@ -51,26 +59,27 @@ steps:
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'>=1.17.0'
go-version:'>=1.17.0'
- run:go version
- run:go version
```
```
> **Note**: Due to the peculiarities of YAML parsing, it is recommended to wrap the version in single quotation marks:
> **Note**: Due to the peculiarities of YAML parsing, it is recommended to wrap the version in single quotation marks:
>
>
> ```yaml
> ```yaml
> go-version: '1.20'
> go-version: '1.20'
> ```
> ```
>
>
> The recommendation is based on the YAML parser's behavior, which interprets non-wrapped values as numbers and, in the case of version 1.20, trims it down to 1.2, which may not be very obvious.
> The recommendation is based on the YAML parser's behavior, which interprets non-wrapped values as numbers and, in the case of version 1.20, trims it down to 1.2, which may not be very obvious.
Matching an unstable pre-release:
Matching an unstable pre-release:
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'1.18.0-rc.1'# The Go version to download (if necessary) and use.
go-version:'1.18.0-rc.1'# The Go version to download (if necessary) and use.
- run:go version
- run:go version
@@ -78,8 +87,8 @@ steps:
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'1.16.0-beta.1'# The Go version to download (if necessary) and use.
go-version:'1.16.0-beta.1'# The Go version to download (if necessary) and use.
- run:go version
- run:go version
@@ -93,8 +102,8 @@ See [action.yml](action.yml)
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'1.16.1'# The Go version to download (if necessary) and use.
go-version:'1.16.1'# The Go version to download (if necessary) and use.
- run:go run hello.go
- run:go run hello.go
@@ -114,8 +123,8 @@ want the most up-to-date Go version to always be used.
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'1.14'
go-version:'1.14'
check-latest:true
check-latest:true
@@ -135,8 +144,8 @@ set to `true`
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'stable'
go-version:'stable'
- run:go run hello.go
- run:go run hello.go
@@ -144,8 +153,8 @@ steps:
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'oldstable'
go-version:'oldstable'
- run:go run hello.go
- run:go run hello.go
@@ -159,38 +168,44 @@ The `cache` input is optional, and caching is turned on by default.
The action defaults to search for the dependency file - go.sum in the repository root, and uses its hash as a part of
The action defaults to search for the dependency file - go.sum in the repository root, and uses its hash as a part of
the cache key. Use `cache-dependency-path` input for cases when multiple dependency files are used, or they are located
the cache key. Use `cache-dependency-path` input for cases when multiple dependency files are used, or they are located
in different subdirectories.
in different subdirectories. The input supports glob patterns.
If some problem that prevents success caching happens then the action issues the warning in the log and continues the execution of the pipeline.
If some problem that prevents success caching happens then the action issues the warning in the log and continues the execution of the pipeline.
**Caching in monorepos**
**Caching in monorepos**
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version:'1.17'
go-version:'1.17'
check-latest:true
check-latest:true
cache-dependency-path:subdir/go.sum
cache-dependency-path:|
subdir/go.sum
tools/go.sum
# cache-dependency-path: "**/*.sum"
- run:go run hello.go
- run:go run hello.go
```
```
## 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` file that contains the version of Go to be
The `go-version-file` input accepts a path to a `go.mod` file or a `go.work` file that contains the version of Go to be used by a project.
used by a project. As the `go.mod` file contains only major and minor (e.g. 1.18) tags, the action will search for the
latest available patch version sequentially in the runner's directory with the cached tools, in
The `go` directive in `go.mod` can specify a patch version or omit it altogether (e.g., `go 1.22.0` or `go 1.22`).
the [versions-manifest.json](https://github.com/actions/go-versions/blob/main/versions-manifest.json) file or at the go
If a patch version is specified, that specific patch version will be used.
servers.
If no patch version is specified, it will search for the latest available patch version in the cache,
[versions-manifest.json](https://github.com/actions/go-versions/blob/main/versions-manifest.json), and the
[official Go language website](https://golang.org/dl/?mode=json&include=all), in that order.
If both the `go-version` and the `go-version-file` inputs are provided then the `go-version` input is used.
If both the `go-version` and the `go-version-file` inputs are provided then the `go-version` input is used.
> The action will search for the `go.mod` file relative to the repository root
> The action will search for the `go.mod` file relative to the repository root
```yaml
```yaml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v4
- uses:actions/setup-go@v5
with:
with:
go-version-file:'path/to/go.mod'
go-version-file:'path/to/go.mod'
- run:go version
- run:go version
@@ -207,9 +222,9 @@ jobs:
go:['1.14','1.13']
go:['1.14','1.13']
name:Go ${{ matrix.go }} sample
name:Go ${{ matrix.go }} sample
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- name:Setup go
- name:Setup go
uses:actions/setup-go@v4
uses:actions/setup-go@v5
with:
with:
go-version:${{ matrix.go }}
go-version:${{ matrix.go }}
- run:go run hello.go
- run:go run hello.go
@@ -227,31 +242,35 @@ documentation.
## Using `setup-go` on GHES
## Using `setup-go` on GHES
`setup-go` comes pre-installed on the appliance with GHES if Actions is enabled. When dynamically downloading Go
`setup-go` comes pre-installed on the appliance with GHES if Actions is enabled.
distributions, `setup-go` downloads distributions from [`actions/go-versions`](https://github.com/actions/go-versions)
When dynamically downloading Go distributions, `setup-go` downloads distributions from [`actions/go-versions`](https://github.com/actions/go-versions) on github.com (outside of the appliance).
on github.com (outside of the appliance). 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 you will start to see rate-limit errors during downloading that looks
like: `##[error]API rate limit exceeded for...`. After that error the action will try to download versions directly
from https://go.dev/dl, but it also can have rate limit so it's better to put token.
To get a higher rate limit, you
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).
can [generate a personal access token on github.com](https://github.com/settings/tokens/new) and pass it as the `token`
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.
input for the action:
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:
```yaml
```yaml
uses:actions/setup-go@v4
uses:actions/setup-go@v5
with:
with:
token:${{ secrets.GH_DOTCOM_TOKEN }}
token:${{ secrets.GH_DOTCOM_TOKEN }}
go-version:'1.18'
go-version:'1.18'
```
```
If the runner is not able to access github.com, any Go versions requested during a workflow run must come from the
If the runner is not able to access github.com, any Go versions requested during a workflow run must come from the runner's tool cache.
runner's tool cache.
See "[Setting up the tool cache on self-hosted runners without internet access](https://docs.github.com/en/enterprise-server@3.2/admin/github-actions/managing-access-to-actions-from-githubcom/setting-up-the-tool-cache-on-self-hosted-runners-without-internet-access)"
See "[Setting up the tool cache on self-hosted runners without internet access](https://docs.github.com/en/enterprise-server@3.2/admin/github-actions/managing-access-to-actions-from-githubcom/setting-up-the-tool-cache-on-self-hosted-runners-without-internet-access)"
for more information.
for more information.
## Recommended permissions
When using the `setup-go` action in your GitHub Actions workflow, it is recommended to set the following permissions to ensure proper functionality:
```yaml
permissions:
contents:read# access to check out code and install dependencies
```
# License
# License
The scripts and documentation in this project are released under the [MIT License](LICENSE)
The scripts and documentation in this project are released under the [MIT License](LICENSE)
`actions/setup-go` is the one of the most popular action related to Golang in GitHub Actions. Many customers use it in conjunction with [actions/cache](https://github.com/actions/cache) to speed up dependency installation process.
`actions/setup-go` is the one of the most popular action related to Golang in GitHub Actions. Many customers use it in conjunction with [actions/cache](https://github.com/actions/cache) to speed up dependency installation process.
See more examples on proper usage in [actions/cache documentation](https://github.com/actions/cache/blob/main/examples.md#go---modules).
See more examples on proper usage in [actions/cache documentation](https://github.com/actions/cache/blob/main/examples.md#go---modules).
# Goals & Anti-Goals
# Goals & Anti-Goals
@@ -16,7 +16,7 @@ Integration of caching functionality into `actions/setup-go` action will bring t
We don't pursue the goal to provide wide customization of caching in scope of `actions/setup-go` action. The purpose of this integration is covering ~90% of basic use-cases. If user needs flexible customization, we should advice them to use `actions/cache` directly.
We don't pursue the goal to provide wide customization of caching in scope of `actions/setup-go` action. The purpose of this integration is covering ~90% of basic use-cases. If user needs flexible customization, we should advice them to use `actions/cache` directly.
# 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
-`false`- disable caching for go dependencies. This value will be set as default value
-`false`- disable caching for go dependencies. This value will be set as default value
- 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
@@ -32,7 +32,7 @@ We don't pursue the goal to provide wide customization of caching in scope of `a
```yml
```yml
steps:
steps:
- uses:actions/checkout@v3
- uses:actions/checkout@v4
- uses:actions/setup-go@v3
- uses:actions/setup-go@v3
with:
with:
go-version:'18'
go-version:'18'
@@ -43,7 +43,7 @@ steps:
```yml
```yml
steps:
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v3
- uses: actions/setup-go@v3
with:
with:
go-version: '18'
go-version: '18'
@@ -53,7 +53,7 @@ steps:
```yml
```yml
steps:
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v3
- uses: actions/setup-go@v3
with:
with:
go-version: '18'
go-version: '18'
@@ -66,4 +66,4 @@ steps:
# Release process
# Release process
As soon as functionality is implemented, we will release minor update of action. No need to bump major version since there are no breaking changes for existing users.
As soon as functionality is implemented, we will release minor update of action. No need to bump major version since there are no breaking changes for existing users.
After that, we will update [starter-workflows](https://github.com/actions/starter-workflows/blob/main/ci/go.yml)
After that, we will update [starter-workflows](https://github.com/actions/starter-workflows/blob/main/ci/go.yml)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.