Set up Go
Repo: actions/setup-go
Set up your GitHub Actions workflow with a specific version of Go
Samples
Download a single Go version
The Go version will be the latest unless you specify a version.
Previously downloaded versions will be used from cache, to save on downloading. Which means if omit the version, I think you’d end up loading from cache 1.15 even when 1.18 is latest.
steps:
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.15
Or a version range like '^1.13.1'
.
Sample output:
Run actions/setup-go@v2
Set up go stable version spec 1.15
Found in cache @ /opt/hostedtoolcache/go/1.15.6/x64
Added go to the path
Successfully set up go version 1.15
go version go1.15.6 linux/amd64
go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
...
Download and run Go in your project
Here is the Action with more steps around it.
main.yml
steps: - name: Checkout - uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: '^1.13.1' - name: Show Go version run: go version - name: Greet run: go run hello.go
Load Go version dynamically
Use grep
to find the version in go.mod
file or Dockerfile
.
Use GitHub env file and go.mod
This stores GO_VERSION=1.15
in a file that named using $GITHUB_ENV
. That file is then read in the next step. See more info on $GITHUB_ENV
on this Persist guide in my cheatsheets.
main.yml
steps: - name: Checkout uses: actions/checkout@v2 - name: Get Go version run: echo "GO_VERSION=$(grep 'go \d\.' go.mod | cut -d ' ' -f 2)" >> $GITHUB_ENV - name: Set up Go uses: actions/setup-go@v2 with: go-version: ${{ env.GO_VERSION }}
Thanks to comment here on a setup-go
issue.
That the regex groups or -o
flag are not used here, but cut
command is. Which means the regex pattern can be short as go \d\.
(assuming single digit major version) or longer as go \d+\.\d+'
but with egrep
.
Use outputs and Dockerfile
Based on iron-go-project.
Dockerfile
FROM golang:1.15
main.yml
steps: - name: Checkout uses: actions/checkout@v2 - name: Get Go version id: vars run: | echo ::set-output name=go_version::$(grep '^FROM go' .github/go/Dockerfile | cut -d ' ' -f 2 | cut -d ':' -f 2) echo "Using Go version ${{ steps.vars.outputs.go_version }}" - name: Set up Go uses: actions/setup-go@v2 with: go-version: ${{ steps.vars.outputs.go_version }}
Matrix version
How to run against multiple Go version. Based on the action’s doc.
main.yml
jobs: build: runs-on: ubuntu-latest strategy: matrix: go: [ '1.14', '1.13' ] name: Go ${{ matrix.go }} steps: - uses: actions/checkout@v2 - name: Set up go uses: actions/setup-go@v1 with: go-version: ${{ matrix.go }} - run: go run hello.go