简介
本指南将向您展示如何构建、测试和发布 Go 包。
GitHub 托管的 Runner 具有一个包含预安装软件的工具缓存,其中包括 Go 的依赖项。有关最新软件和预安装 Go 版本的完整列表,请参阅“使用 GitHub 托管的 Runner”。
先决条件
您应该已经熟悉 YAML 语法以及它如何在 GitHub Actions 中使用。有关更多信息,请参阅“GitHub Actions 的工作流语法”。
我们建议您对 Go 语言有一个基本的了解。有关更多信息,请参阅Go 入门。
使用 Go 工作流模板
要快速入门,请将工作流模板添加到存储库的 .github/workflows
目录中。
GitHub 提供了一个 Go 工作流模板,它应该适用于大多数 Go 项目。本指南的后续部分提供了如何自定义此工作流模板的示例。
-
在 GitHub 上,导航到存储库的主页。
-
在您的存储库名称下,单击 操作.
-
如果您已经在存储库中有一个工作流,请单击“新建工作流”。
-
“选择工作流”页面显示推荐的工作流模板选择。搜索“go”。
-
通过单击“持续集成”来筛选工作流的选择。
-
在“Go - by GitHub Actions”工作流上,单击“配置”。
-
根据需要编辑工作流。例如,更改 Go 的版本。
-
单击“提交更改”。
go.yml
工作流文件将添加到存储库的.github/workflows
目录中。
指定 Go 版本
指定 Go 版本的最简单方法是使用 GitHub 提供的 setup-go
操作。有关更多信息,请参阅 setup-go
操作。
要在 GitHub 托管的运行器上使用预安装的 Go 版本,请将相关版本传递给setup-go
操作的go-version
属性。此操作会从每个运行器上的工具缓存中找到特定版本的 Go,并将必要的二进制文件添加到PATH
中。这些更改将在作业的剩余时间内保持有效。
setup-go
操作是使用 GitHub Actions 中 Go 的推荐方法,因为它有助于确保在不同的运行器和不同的 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@v4 - 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@v4
- 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@v4 - 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@v4
- 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@v4 - 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@v4
- 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@v4 - 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@v4
- 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