跳至主要内容

构建和测试 Go

你可以创建一个持续集成 (CI) 工作流来构建和测试你的 Go 项目。

简介

本指南将向你展示如何构建、测试和发布 Go 包。

GitHub 托管的运行程序具有一个包含预安装软件的工具缓存,其中包括 Go 的依赖项。有关最新软件和 Go 预安装版本的完整列表,请参阅“使用 GitHub 托管的运行程序”。

先决条件

你应该已经熟悉 YAML 语法以及如何将其与 GitHub 操作一起使用。有关更多信息,请参阅“GitHub 操作的工作流语法”。

我们建议你对 Go 语言有基本的了解。有关更多信息,请参阅Go 入门

使用 Go 入门工作流

要快速入门,请将入门工作流添加到存储库的 .github/workflows 目录中。

GitHub 提供了一个 Go 入门工作流,该工作流应该适用于大多数 Go 项目。本指南的后续部分提供了有关如何自定义此入门工作流的示例。

  1. 在 GitHub.com 上,导航到存储库的主页。

  2. 在存储库名称下方,单击 操作.

    Screenshot of the tabs for the "github/docs" repository. The "Actions" tab is highlighted with an orange outline.

  3. 如果存储库中已有工作流,请单击新建工作流

  4. “选择工作流”页面显示推荐的入门工作流选择。搜索“go”。

  5. 单击持续集成筛选工作流选择。

  6. 在“Go - by GitHub Actions”工作流上,单击配置

    Screenshot of the "Choose a workflow" page. The "Configure" button on the "Go" workflow is highlighted with an orange outline.

  7. 根据需要编辑工作流。例如,更改 Go 版本。

  8. 单击提交更改

    go.yml 工作流文件添加到存储库的 .github/workflows 目录。

指定 Go 版本

指定 Go 版本最简单的方法是使用 GitHub 提供的 setup-go 操作。有关更多信息,请参阅 setup-go 操作

要在 GitHub 托管的运行器上使用 Go 的预安装版本,请将相关版本传递给 setup-go 操作的 go-version 属性。此操作从每个运行器上的工具缓存中查找特定版本的 Go,并将必要的二进制文件添加到 PATH。这些更改将在作业的剩余时间内保留。

setup-go 操作是将 Go 与 GitHub Actions 配合使用的推荐方法,因为它有助于确保在不同的运行器和不同版本的 Go 中保持一致的行为。如果您使用的是自托管运行器,则必须安装 Go 并将其添加到 PATH

使用多个版本的 Go

YAML
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 的最新修补程序版本

YAML
      - 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 安装依赖项

YAML
    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 参数。

YAML
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.17'
          cache-dependency-path: subdir/go.sum

如果你有自定义要求或需要对缓存进行更精细的控制,你可以使用 cache 操作。有关更多信息,请参阅“缓存依赖项以加速工作流”。

构建和测试你的代码

你可以使用与本地相同的命令来构建和测试你的代码。此示例工作流演示如何在作业中使用 go buildgo test

YAML
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 操作上传测试结果。

有关更多信息,请参阅“将工作流数据存储为工件”。

YAML
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