mirror of https://github.com/actions/setup-go.git
				
				
				
			
		
			
				
	
	
		
			355 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			355 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| # Setup Go Action
 | |
| 
 | |
| [](https://github.com/actions/setup-go/actions/workflows/basic-validation.yml)
 | |
| [](https://github.com/actions/setup-go/actions/workflows/versions.yml)
 | |
| 
 | |
| This action sets up a Go environment for use in GitHub Actions by:
 | |
| - Optionally downloading and caching a version of Go by version and adding to PATH
 | |
| - Registering problem matchers for error output
 | |
| - Providing intelligent caching for Go modules and build outputs
 | |
| 
 | |
| ## Quick Start
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.21'
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| ## Breaking Changes
 | |
| 
 | |
| ### V6 Changes
 | |
| 
 | |
| #### Node Runtime Upgrade
 | |
| - **Upgraded from Node 20 to Node 24**
 | |
| - ⚠️ **Action Required**: Ensure your runner is on version v2.327.1 or later for compatibility
 | |
| - See [Release Notes](https://github.com/actions/runner/releases) for more details
 | |
| 
 | |
| #### Enhanced Go Toolchain Management
 | |
| 
 | |
| V6 introduces significant improvements for reliable and consistent Go version selection:
 | |
| 
 | |
| **Toolchain Directive Support**
 | |
| Now correctly interprets both `go` and `toolchain` directives from `go.mod`:
 | |
| ```go
 | |
| go 1.21.0           // Minimum required version
 | |
| toolchain go1.21.6  // V6 uses this exact version
 | |
| ```
 | |
| 
 | |
| **Advanced Version Resolution**
 | |
| Supports comprehensive version patterns:
 | |
| - Comparison operators: `>=1.21.0`, `<1.22.0`
 | |
| - Semantic versioning: `~1.21.0` (patch updates), `^1.21.0` (minor updates)
 | |
| - Wildcards: `1.21.x`, `1.*`
 | |
| 
 | |
| **Intelligent Caching**
 | |
| Cache keys now incorporate toolchain-specific metadata, eliminating version conflicts when switching between Go versions in your workflows.
 | |
| 
 | |
| **Migration Impact**
 | |
| These changes ensure your workflows use the exact Go version your project requires, improving build reproducibility and reducing version-related issues.
 | |
| 
 | |
| For more details, see the [full release notes](https://github.com/actions/setup-go/releases).
 | |
| 
 | |
| ### V5 Changes
 | |
| 
 | |
| - Upgraded Node.js runtime from node16 to node20
 | |
| - See [full release notes](https://github.com/actions/setup-go/releases) for complete details
 | |
| 
 | |
| ## Version Resolution Behavior
 | |
| 
 | |
| The action follows this resolution order:
 | |
| 1. **Local cache** - Checks for a cached version match
 | |
| 2. **go-versions repository** - Pulls from the main branch of the [go-versions repository](https://github.com/actions/go-versions)
 | |
| 3. **Direct download** - Falls back to downloading directly from [go.dev](https://go.dev/dl/)
 | |
| 
 | |
| To change the default behavior, use the `check-latest` input.
 | |
| 
 | |
| > **Note**: The setup-go action uses executable binaries built by the Golang team. The action does not build Go from source code.
 | |
| 
 | |
| ## Usage Examples
 | |
| 
 | |
| ### Basic Usage
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.21'
 | |
|   - run: go run hello.go
 | |
| ```
 | |
| 
 | |
| ### Version Specifications
 | |
| 
 | |
| #### Semantic Versioning
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '^1.21.1' # Latest patch release of 1.21.x
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '>=1.20.0' # Version 1.20.0 or higher
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| > **Important**: Due to YAML parsing behavior, always wrap version numbers in single quotes:
 | |
| > ```yaml
 | |
| > go-version: '1.20'  # Correct
 | |
| > go-version: 1.20    # Incorrect - YAML parser interprets as 1.2
 | |
| > ```
 | |
| 
 | |
| #### Pre-release Versions
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.22.0-rc.1'
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| #### Version Aliases
 | |
| 
 | |
| **Stable Release**
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: 'stable' # Latest stable version
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| **Previous Stable Release**
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: 'oldstable' # Previous stable version
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| > **Note**: Using aliases is equivalent to using the corresponding minor release with `check-latest: true`
 | |
| 
 | |
| ### Version from go.mod File
 | |
| 
 | |
| The action can automatically detect the Go version from your project's `go.mod` or `go.work` file:
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version-file: 'go.mod'
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| **Version Resolution from go.mod:**
 | |
| 1. Uses the `toolchain` directive version if present
 | |
| 2. Falls back to the `go` directive version
 | |
| 3. If no patch version is specified, uses the latest available patch
 | |
| 
 | |
| > **Note**: If both `go-version` and `go-version-file` are provided, `go-version` takes precedence.
 | |
| 
 | |
| ### Check Latest Version
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.21'
 | |
|       check-latest: true # Always check for the latest patch release
 | |
|   - run: go version
 | |
| ```
 | |
| 
 | |
| **Performance Considerations:**
 | |
| - `check-latest: false` (default) - Uses cached versions for faster builds
 | |
| - `check-latest: true` - Downloads the latest version, slower but ensures up-to-date releases
 | |
| 
 | |
| ### Caching
 | |
| 
 | |
| #### Automatic Caching
 | |
| 
 | |
| Caching is enabled by default and automatically handles:
 | |
| - Go modules (based on `go.sum`)
 | |
| - Build outputs
 | |
| - Toolchain-specific metadata
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.21'
 | |
|       # cache: true (default)
 | |
|   - run: go run hello.go
 | |
| ```
 | |
| 
 | |
| #### Custom Cache Dependencies
 | |
| 
 | |
| For projects with multiple dependency files or monorepos:
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.21'
 | |
|       cache-dependency-path: |
 | |
|         subdir/go.sum
 | |
|         tools/go.sum        
 | |
|   - run: go run hello.go
 | |
| ```
 | |
| 
 | |
| **Using Glob Patterns:**
 | |
| ```yaml
 | |
| cache-dependency-path: "**/*.sum"
 | |
| ```
 | |
| 
 | |
| #### Disable Caching
 | |
| 
 | |
| ```yaml
 | |
| steps:
 | |
|   - uses: actions/checkout@v5
 | |
|   - uses: actions/setup-go@v6
 | |
|     with:
 | |
|       go-version: '1.21'
 | |
|       cache: false
 | |
|   - run: go run hello.go
 | |
| ```
 | |
| 
 | |
| ### Matrix Testing
 | |
| 
 | |
| Test across multiple Go versions:
 | |
| 
 | |
| ```yaml
 | |
| jobs:
 | |
|   test:
 | |
|     runs-on: ubuntu-latest
 | |
|     strategy:
 | |
|       matrix:
 | |
|         go-version: ['1.20', '1.21', '1.22']
 | |
|     steps:
 | |
|       - uses: actions/checkout@v5
 | |
|       - uses: actions/setup-go@v6
 | |
|         with:
 | |
|           go-version: ${{ matrix.go-version }}
 | |
|       - run: go test ./...
 | |
| ```
 | |
| 
 | |
| ## Advanced Configuration
 | |
| 
 | |
| ### Supported Version Syntax
 | |
| 
 | |
| | Syntax Type | Example | Description |
 | |
| |-------------|---------|-------------|
 | |
| | Specific version | `1.21.5` | Exact version |
 | |
| | Semantic range | `^1.21.0` | Compatible with 1.21.0 |
 | |
| | Comparison operators | `>=1.20.0` | Version 1.20.0 or higher |
 | |
| | Wildcards | `1.21.x` | Latest patch of 1.21 |
 | |
| | Pre-release | `1.22.0-rc.1` | Release candidate |
 | |
| | Aliases | `stable`, `oldstable` | Latest stable versions |
 | |
| 
 | |
| For more information about semantic versioning, see the [semver documentation](https://semver.org/).
 | |
| 
 | |
| ### Complete Input Reference
 | |
| 
 | |
| ```yaml
 | |
| - uses: actions/setup-go@v6
 | |
|   with:
 | |
|     # Version or version range of Go to use
 | |
|     go-version: '1.21'
 | |
|     
 | |
|     # Path to go.mod or go.work file
 | |
|     go-version-file: 'go.mod'
 | |
|     
 | |
|     # Check for latest version
 | |
|     check-latest: false
 | |
|     
 | |
|     # GitHub token for authentication
 | |
|     token: ${{ github.token }}
 | |
|     
 | |
|     # Enable/disable caching
 | |
|     cache: true
 | |
|     
 | |
|     # Path to dependency files for caching
 | |
|     cache-dependency-path: 'go.sum'
 | |
|     
 | |
|     # Architecture to install (auto-detected if not specified)
 | |
|     architecture: 'x64'
 | |
| ```
 | |
| 
 | |
| ## Platform Support
 | |
| 
 | |
| ### GitHub Enterprise Server (GHES)
 | |
| 
 | |
| When using setup-go on GHES:
 | |
| 
 | |
| 1. **Pre-installed**: The action comes pre-installed if Actions is enabled
 | |
| 2. **Rate limits**: Unauthenticated requests are limited to 60/hour per IP
 | |
| 3. **Authentication**: Use a personal access token for higher rate limits:
 | |
| 
 | |
| ```yaml
 | |
| - uses: actions/setup-go@v6
 | |
|   with:
 | |
|     token: ${{ secrets.GH_DOTCOM_TOKEN }}
 | |
|     go-version: '1.21'
 | |
| ```
 | |
| 
 | |
| 4. **Offline runners**: For runners without internet access, see [Setting up the tool cache on self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#using-self-hosted-runners-in-a-workflow)
 | |
| 
 | |
| ### Self-hosted Runners
 | |
| 
 | |
| For self-hosted runners without internet access, ensure Go versions are pre-cached in the runner's tool cache.
 | |
| 
 | |
| ## Recommended Permissions
 | |
| 
 | |
| ```yaml
 | |
| permissions:
 | |
|   contents: read # Required to checkout code and install dependencies
 | |
| ```
 | |
| 
 | |
| ## Troubleshooting
 | |
| 
 | |
| ### Common Issues
 | |
| 
 | |
| **Version not found**
 | |
| - Ensure the version exists in the [Go releases](https://go.dev/dl/)
 | |
| - Check if you're using the correct version format
 | |
| - Try using `check-latest: true`
 | |
| 
 | |
| **Caching issues**
 | |
| - Cache conflicts may occur when switching Go versions
 | |
| - V6 resolves this with toolchain-specific cache keys
 | |
| - Manually clear cache if needed using GitHub Actions cache management
 | |
| 
 | |
| **YAML parsing**
 | |
| - Always wrap version numbers in single quotes
 | |
| - Avoid bare numbers that YAML might misinterpret
 | |
| 
 | |
| ## License
 | |
| 
 | |
| The scripts and documentation in this project are released under the [MIT License](LICENSE).
 | |
| 
 | |
| ## Contributions
 | |
| 
 | |
| Contributions are welcome! See our [Contributor's Guide](docs/contributors.md) for details.
 | |
| 
 | |
| ## Code of Conduct
 | |
| 
 | |
| 👋 Be nice. See our [Code of Conduct](CODE_OF_CONDUCT.md). |