简介
本指南介绍如何构建、测试和发布 Go 包。
GitHub-托管运行器的工具缓存中预装了软件,其中包括 Go 所需的依赖项。 有关最新软件和预安装版本的 Go 的完整列表,请参阅“GitHub 托管的运行程序”。
先决条件
你应该已经熟悉 YAML 语法,以及如何将其与 GitHub Actions 一起使用。 有关详细信息,请参阅“GitHub Actions 的工作流语法”。
建议你对 Go 语言有基本的了解。 有关详细信息,请参阅 Go 入门。
使用 Go 工作流模板
若要快速开始使用,请将工作流模板添加到存储库的 .github/workflows 目录。
GitHub 提供适用于大多数 Go 项目的 Go 工作流模板。 本指南的后续部分提供了如何自定义此工作流模板的示例。
-
在 GitHub 上,导航到存储库的主页面。
-
在仓库名称下,单击“ Actions”****。

-
如果存储库中已有工作流,请单击“新建工作流”。
-
“选择工作流”页面显示一系列推荐的工作流模板。 搜索“go”。
-
单击“持续集成”**** 以筛选工作流选择。
-
在“Go - 由 GitHub Actions 创建”工作流中,点击配置。

-
根据需要编辑工作流。 例如更改 Go 版本。
-
单击“提交更改”。
工作流
go.yml文件将添加到.github/workflows存储库的目录中。
指定 Go 版本
指定 Go 版本的最简单方法是使用 setup-go 提供的 GitHub操作。 有关详细信息,请参阅 setup-go 操作。
若要在由 GitHub 托管的运行器上使用预安装的 Go 版本,请将相应的版本传递给 setup-go 操作的 go-version 属性。 此操作从每个运行器上的工具缓存中查找特定版本的 Go,并将必要的二进制文件添加到 PATH。 这些更改将在任务的剩余时间内持续有效。
setup-go 操作是将 Go 与 GitHub Actions 配合使用的推荐方式,因为它有助于确保在不同的运行器和不同版本的 Go 中表现一致。 如果使用自托管运行器,则必须安装 Go 并将其添加到 PATH。
使用多个版本的 Go 程序语言
name: Go
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ '1.19', '1.20', '1.21.x' ]
steps:
- uses: actions/checkout@v6
- name: Setup Go ${{ matrix.go-version }}
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
# You can test your matrix by printing the current Go version
- name: Display Go version
run: go version
name: Go
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ '1.19', '1.20', '1.21.x' ]
steps:
- uses: actions/checkout@v6
- name: Setup Go ${{ matrix.go-version }}
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
# You can test your matrix by printing the current Go version
- name: Display Go version
run: go version
使用特定的 Go 版本
可以将作业配置为使用 Go 的特定版本,例如 1.20.8。 或者,您也可以使用语义版本语法来获得最新的次要版本。 此示例使用了 Go 1.21 的最新修补版本。
- name: Setup Go 1.21.x
uses: actions/setup-go@v5
with:
# Semantic version range syntax or exact version of Go
go-version: '1.21.x'
- name: Setup Go 1.21.x
uses: actions/setup-go@v5
with:
# Semantic version range syntax or exact version of Go
go-version: '1.21.x'
安装依赖
可以使用 go get 安装依赖项:
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.21.x'
- name: Install dependencies
run: |
go get .
go get example.com/octo-examplemodule
go get example.com/[email protected]
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.21.x'
- name: Install dependencies
run: |
go get .
go get example.com/octo-examplemodule
go get example.com/[email protected]
缓存依赖项
可以使用 setup-go 操作缓存和还原依赖项。 使用 setup-go 操作时,默认启用缓存。
setup-go 操作将在仓库根目录中搜索依赖项文件 go.sum,并使用该依赖项文件的哈希作为缓存密钥的一部分。
当使用多个依赖项文件或这些文件位于不同的子目录中时,可以使用 cache-dependency-path 参数。
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.17'
cache-dependency-path: subdir/go.sum
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.17'
cache-dependency-path: subdir/go.sum
如果有自定义要求或需要更精细的缓存控制,可以使用 cache 操作。 有关详细信息,请参阅“依赖项缓存参考”。
构建和测试代码
您可以使用与本地相同的命令来构建和测试代码。 此示例工作流演示如何在作业中使用 go build 和 go test:
name: Go
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.21.x'
- name: Install dependencies
run: go get .
- name: Build
run: go build -v ./...
- name: Test with the Go CLI
run: go test
name: Go
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.21.x'
- name: Install dependencies
run: go get .
- name: Build
run: go build -v ./...
- name: Test with the Go CLI
run: go test
将工作流数据打包为构件
工作流程完成后,您可以上传产生的项目进行分析。 例如,您可能需要保存日志文件、核心转储、测试结果或屏幕截图。 以下示例演示如何使用 upload-artifact 操作上传测试结果。
有关详细信息,请参阅“使用工作流工件存储和共享数据”。
name: Upload Go test results
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ '1.19', '1.20', '1.21.x' ]
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
- name: Install dependencies
run: go get .
- name: Test with Go
run: go test -json > TestResults-${{ matrix.go-version }}.json
- name: Upload Go test results
uses: actions/upload-artifact@v4
with:
name: Go-results-${{ matrix.go-version }}
path: TestResults-${{ matrix.go-version }}.json
name: Upload Go test results
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ '1.19', '1.20', '1.21.x' ]
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
- name: Install dependencies
run: go get .
- name: Test with Go
run: go test -json > TestResults-${{ matrix.go-version }}.json
- name: Upload Go test results
uses: actions/upload-artifact@v4
with:
name: Go-results-${{ matrix.go-version }}
path: TestResults-${{ matrix.go-version }}.json