setup-go/README.md

302 lines
7.9 KiB
Markdown
Raw Normal View History

2019-07-17 10:50:58 -04:00
# setup-go
2019-06-19 09:44:17 -04:00
2022-12-23 12:03:14 +09:00
[![Basic validation](https://github.com/actions/setup-go/actions/workflows/basic-validation.yml/badge.svg)](https://github.com/actions/setup-go/actions/workflows/basic-validation.yml)
[![Validate 'setup-go'](https://github.com/actions/setup-go/actions/workflows/versions.yml/badge.svg)](https://github.com/actions/setup-go/actions/workflows/versions.yml)
2019-08-12 15:13:31 -04:00
2025-09-22 15:00:07 +05:30
This action sets up a Go environment for use in GitHub Actions by:
2019-06-19 09:44:17 -04:00
2025-09-22 15:00:07 +05:30
- ✅ Optionally downloading and caching a version of Go by version and adding to PATH
- ✅ Registering problem matchers for error output
2019-07-17 10:50:58 -04:00
2025-09-22 15:00:07 +05:30
## 🚨 Breaking Changes in V6
2025-09-22 15:00:07 +05:30
### Critical Requirements
2025-09-19 14:53:21 +05:30
2025-09-22 15:00:07 +05:30
#### Node Runtime Upgrade
- **Upgraded**: Node 20 → Node 24
- **⚠️ Action Required**: Ensure your runner is on version **v2.327.1 or later** for compatibility
- **Reference**: [Release Notes](https://github.com/actions/setup-go/releases)
2025-09-19 14:53:21 +05:30
2025-09-22 15:00:07 +05:30
### Enhanced Go Toolchain Management
2025-09-19 14:53:21 +05:30
V6 introduces significant improvements to ensure reliable and consistent Go version selection:
2025-09-22 15:00:07 +05:30
#### 1. Toolchain Directive Support
Now correctly interprets both `go` and `toolchain` directives from `go.mod`:
2025-09-19 14:53:21 +05:30
2025-09-22 15:00:07 +05:30
```go
2025-09-19 14:53:21 +05:30
go 1.21.0 // Minimum required version
toolchain go1.21.6 // V6 uses this exact version
```
2025-09-22 15:00:07 +05:30
#### 2. Advanced Version Resolution
Supports comprehensive version patterns:
2025-09-19 14:53:21 +05:30
2025-09-22 15:00:07 +05:30
| Pattern Type | Examples | Description |
|-------------|----------|-------------|
| **Comparison Operators** | `>=1.21.0`, `<1.22.0` | Range-based selection |
| **Semantic Versioning** | `~1.21.0`, `^1.21.0` | Patch/minor updates |
| **Wildcards** | `1.21.x`, `1.*` | Flexible matching |
2025-09-19 14:53:21 +05:30
2025-09-22 15:00:07 +05:30
#### 3. Intelligent Caching
- Cache keys now incorporate toolchain-specific metadata
- Eliminates version conflicts when switching between Go versions
- Improved workflow reliability
2025-09-19 14:53:21 +05:30
2025-09-22 15:00:07 +05:30
### Migration Benefits
✅ Exact Go version matching
✅ Improved build reproducibility
✅ Reduced version-related issues
2025-09-22 15:00:07 +05:30
For more details, see the [full release notes](https://github.com/actions/setup-go/releases).
2025-09-22 15:00:07 +05:30
---
2025-09-22 15:00:07 +05:30
## 📋 Previous Versions
2025-09-22 15:00:07 +05:30
### V5 Changes
- Upgraded Node.js runtime from node16 to node20
2025-09-22 15:00:07 +05:30
- See [full V5 release notes](https://github.com/actions/setup-go/releases)
2025-09-22 15:00:07 +05:30
---
2025-09-22 15:00:07 +05:30
## 🚀 Usage
2025-09-22 15:00:07 +05:30
See [action.yml](action.yml)
2022-04-20 16:11:14 +02:00
2025-09-22 15:00:07 +05:30
### Basic Setup
2020-02-09 14:39:34 -05:00
```yaml
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
2021-11-08 19:28:08 +09:00
with:
2025-09-22 15:00:07 +05:30
go-version: '1.16.1' # The Go version to download (if necessary) and use.
- run: go run hello.go
2020-02-09 14:39:34 -05:00
```
2025-09-22 15:00:07 +05:30
### Version Selection Examples
#### Using Semantic Versioning
```yaml
2025-09-22 15:00:07 +05:30
# Caret notation (minor updates)
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
2025-09-22 15:00:07 +05:30
go-version: '^1.13.1'
- run: go version
```
2020-02-10 19:18:01 -05:00
```yaml
2025-09-22 15:00:07 +05:30
# Comparison operators
2020-02-10 19:18:01 -05:00
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
2025-09-22 15:00:07 +05:30
go-version: '>=1.17.0'
- run: go version
```
2025-09-22 15:00:07 +05:30
> **⚠️ Important**: Always wrap version numbers in single quotes to prevent YAML parsing issues:
> ```yaml
> go-version: '1.20' # ✅ Correct
> go-version: 1.20 # ❌ Incorrect - YAML interprets as 1.2
> ```
#### Pre-release Versions
```yaml
2025-09-22 15:00:07 +05:30
# RC version
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
2021-11-08 19:28:08 +09:00
with:
2025-09-22 15:00:07 +05:30
go-version: '1.18.0-rc.1'
2021-11-08 19:28:08 +09:00
- run: go version
2020-02-10 19:18:01 -05:00
```
2019-07-17 10:50:58 -04:00
```yaml
2025-09-22 15:00:07 +05:30
# Beta version
2019-07-25 21:28:46 -04:00
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
2025-09-22 15:00:07 +05:30
go-version: '1.16.0-beta.1'
- run: go version
```
2025-09-22 15:00:07 +05:30
---
2025-09-22 15:00:07 +05:30
## 🔧 Advanced Features
2025-09-22 15:00:07 +05:30
### Check Latest Version
2025-09-22 15:00:07 +05:30
The `check-latest` flag defaults to `false` for stability. Set to `true` if you want the most up-to-date Go version.
```yaml
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
2021-11-08 19:28:08 +09:00
with:
go-version: '1.14'
check-latest: true
2021-11-08 19:28:08 +09:00
- run: go run hello.go
2019-07-17 10:50:58 -04:00
```
2025-09-22 15:00:07 +05:30
> **Note**: Setting `check-latest: true` has performance implications as downloading Go versions is slower than using cached versions.
2025-09-22 15:00:07 +05:30
### Using Stable/Oldstable Aliases
```yaml
2025-09-22 15:00:07 +05:30
# Latest stable version
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
go-version: 'stable'
- run: go run hello.go
```
```yaml
2025-09-22 15:00:07 +05:30
# Previous stable version
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
go-version: 'oldstable'
- run: go run hello.go
```
2025-09-22 15:00:07 +05:30
> **Note**: Using these aliases will result in the same version as using the corresponding minor release with `check-latest: true`
2025-09-22 15:00:07 +05:30
### Caching Dependencies and Build Outputs
2025-09-22 15:00:07 +05:30
The action has built-in functionality for caching and restoring go modules and build outputs. Caching is **enabled by default**.
2025-09-22 15:00:07 +05:30
#### Caching in Monorepos
```yaml
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
go-version: '1.17'
check-latest: true
cache-dependency-path: |
2025-09-22 15:00:07 +05:30
subdir/go.sum
tools/go.sum
# Alternative: cache-dependency-path: "**/*.sum"
- run: go run hello.go
2025-09-22 15:00:07 +05:30
```
2025-09-22 15:00:07 +05:30
### Getting Go Version from go.mod
2022-05-12 17:04:39 +09:00
2025-09-22 15:00:07 +05:30
The action can read the Go version directly from your `go.mod` or `go.work` file:
2022-05-12 17:04:39 +09:00
```yaml
steps:
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
go-version-file: 'path/to/go.mod'
- run: go version
2022-05-12 17:04:39 +09:00
```
2019-07-17 10:50:58 -04:00
2025-09-22 15:00:07 +05:30
Priority order for version selection:
1. `toolchain` directive (if present)
2. `go` directive
> **Note**: If both `go-version` and `go-version-file` are provided, `go-version` takes precedence.
### Matrix Testing
2019-07-17 10:50:58 -04:00
```yaml
jobs:
build:
runs-on: ubuntu-latest
2019-07-17 10:50:58 -04:00
strategy:
matrix:
2020-07-22 07:52:29 -04:00
go: [ '1.14', '1.13' ]
2019-07-17 10:50:58 -04:00
name: Go ${{ matrix.go }} sample
2019-07-25 21:28:46 -04:00
steps:
- uses: actions/checkout@v5
2019-07-17 10:50:58 -04:00
- name: Setup go
uses: actions/setup-go@v6
2019-07-17 10:50:58 -04:00
with:
2019-08-13 16:31:11 -04:00
go-version: ${{ matrix.go }}
2019-07-17 10:50:58 -04:00
- run: go run hello.go
```
2019-06-19 09:44:17 -04:00
2025-09-22 15:00:07 +05:30
---
## 📝 Supported Version Syntax
The `go-version` input supports:
2025-09-22 15:00:07 +05:30
- **Specific versions**: `1.15`, `1.16.1`, `1.17.0-rc.2`, `1.16.0-beta.1`
- **SemVer ranges**: `^1.13.1`, `>=1.18.0-rc.1`
2025-09-22 15:00:07 +05:30
For more information about semantic versioning, please refer to [semver documentation](https://github.com/npm/node-semver).
2025-09-22 15:00:07 +05:30
---
2025-09-22 15:00:07 +05:30
## 🏢 Using setup-go on GHES
2025-09-22 15:00:07 +05:30
setup-go comes pre-installed on the appliance with GHES if Actions is enabled. When dynamically downloading Go distributions, setup-go downloads distributions from `actions/go-versions` on github.com (outside of the appliance).
2025-09-22 15:00:07 +05:30
These calls to `actions/go-versions` are made via unauthenticated requests (limited to 60 requests per hour per IP). If more requests are needed:
2025-09-22 15:00:07 +05:30
1. The action leverages the raw API to retrieve the version-manifest (no rate limit)
2. If that fails, attempts to download directly from `https://storage.googleapis.com/golang`
### Using a Personal Access Token
For higher rate limits:
```yaml
uses: actions/setup-go@v6
with:
token: ${{ secrets.GH_DOTCOM_TOKEN }}
go-version: '1.18'
```
2025-09-22 15:00:07 +05:30
If the runner cannot access github.com, any Go versions requested during a workflow run must come from the 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) for more information.
---
2025-09-22 15:00:07 +05:30
## 🔒 Recommended Permissions
2025-01-16 08:47:07 -06:00
2025-09-22 15:00:07 +05:30
When using the setup-go action in your GitHub Actions workflow, set the following permissions:
2025-01-16 08:47:07 -06:00
```yaml
permissions:
2025-09-22 15:00:07 +05:30
contents: read # access to check out code and install dependencies
2025-01-16 08:47:07 -06:00
```
2025-09-22 15:00:07 +05:30
---
## ⚙️ How It Works
### Version Resolution Order
1. **Local cache** check for version match
2. **go-versions repository** (main branch) on cache miss
3. **Direct download** from go dist as fallback
> **Note**: The setup-go action uses executable binaries built by the Golang team. The action does not build Go from source code.
---
## 📄 License
2019-06-19 09:44:17 -04:00
The scripts and documentation in this project are released under the [MIT License](LICENSE)
2025-09-22 15:00:07 +05:30
## 🤝 Contributions
2019-06-19 09:44:17 -04:00
Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
2020-02-09 00:21:39 -05:00
2025-09-22 15:00:07 +05:30
## 👮 Code of Conduct
2020-02-09 00:21:39 -05:00
2025-09-22 15:00:07 +05:30
👋 Be nice. See our [code of conduct](CODE_OF_CONDUCT.md)