Skip to main content
← Back to workflows

How to Set Up a Go Environment in GitHub Actions

actions-setup-go -
GitHub Action
v5.0.1
1,393
Contributors
Contributor - bryanmacfarlaneContributor - e-korolevskiiContributor - marko-zivic-93
Categories
CICUBE ANALYTICS INSIGHTS
Engineering Velocity: 25% Team Time Lost to CI Issues
View Platform →
3.5h
Time Saved/Dev/Week
40%
Faster Releases
Click for next insight
Usage
name: 'Usage of setup-go GitHub Action'
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
- run: go version

setup-go logo

Setup Go

Set up your GitHub Actions workflow with a specific version of Go


What is Setup Go?

We can use setup-go from GitHub to download, cache, and set up the specific version of Go for our workflows. This action will also configure the PATH so that any step following within the workflow is able to run Go commands without any further setup.

How to Manage Go Versions Dynamically with GitHub Actions

It’s crucial for the Go applications to always be built with the latest improvements and security patches. Effectively managing the Go version within our GitHub Actions workflows is essential. Here’s how you can configure the setup-go action to dynamically check for the latest Go version, while also considering the importance of maintaining a specific version for stability.

Understanding the check-latest Option

The check-latest flag in the setup-go GitHub Action controls whether the workflow should check for and use the latest available Go version. This can be crucial for projects that benefit from the latest features and fixes.

Configuring check-latest

Here’s how to set up your GitHub Actions workflow to either use a fixed version of Go for stability or always update to the latest version:

1. Using a Specific Go Version (Stable)

For projects where stability is a priority, and you require a consistent Go version across all builds, do not set check-latest or set it to false. This ensures that the specified version is used without checking for updates, which can also speed up the setup process by using cached versions.

steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.14' # Example: Locking down a specific version for stability
check-latest: false
- run: go run hello.go

2. Always Use the Latest Go Version

Setting check-latest to true ensures that your workflows always run with the most current Go version available. This is beneficial for keeping up-to-date with Go’s latest features and security updates but may introduce changes that could affect the stability of your project.

steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.14' # Set to a minimum version you are comfortable with
check-latest: true # Ensures the latest version is always used
- run: go run hello.go

Performance Implications

  • Without check-latest: The action uses the cached version, which speeds up the setup process.
  • With check-latest set to true: The action checks for the latest version, which can slow down the setup due to the download time, especially if a new version is found and needs to be installed.

Best Practices for Using check-latest

  • Development vs. Production: Consider using the latest version in development workflows to test against the latest Go features and security patches, while sticking to a specific version in production for stability.
  • Version Compatibility: Regularly update the go-version to a newer stable version after thorough testing to mitigate any potential issues from automatic updates.

How to Cache Dependencies in GitHub Actions for Go Projects

We need to find better ways of managing dependencies so that our CI/CD pipelines can be optimized. GitHub Actions come with caching built in; it saves a lot of time for our Go projects. Here in this article is the complete information on how one can use caching for Go modules and build outputs within our workflows.

steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.17'
check-latest: true
- run: go run hello.go

Advanced Caching for Multiple Dependency Files or Monorepos

In cases where your project is structured as a monorepo or uses multiple go.sum files located in different subdirectories, you can specify each dependency file using the cache-dependency-path input. This input accepts glob patterns, allowing for flexible caching configurations.

steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.17'
check-latest: true
cache-dependency-path: |
subdir/go.sum
tools/go.sum
# Alternatively, use a glob pattern to cache all go.sum files in the repository:
# cache-dependency-path: "**/*.sum"
- run: go run hello.go

Key Points to Consider

  • cache-dependency-path: Specify paths to go.sum files for caching. Useful for monorepos or projects with dependencies managed in multiple directories.
  • Fallback Behavior: If issues occur during caching (e.g., network timeouts or corrupted cache), the action logs a warning but proceeds with the pipeline execution to ensure that your CI/CD process is not blocked.

Benefits of Caching Dependencies

  • Reduced Build Times: By caching previously downloaded modules and build outputs, the time taken for dependency resolution and compilation is significantly decreased.
  • Cost Efficiency: Minimizes the use of bandwidth and compute resources, which can be particularly beneficial for projects with large dependencies.
  • Improved Reliability: Reduces potential points of failure related to external network requests during the build process.