Skip to main content

构建和测试 Go

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

注意:GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

简介

本指南介绍如何构建、测试和发布 Go 包。

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

先决条件

您应该已经熟悉 YAML 语法及其如何与 GitHub Actions 结合使用。 有关详细信息,请参阅“GitHub Actions 的工作流语法”。

建议你对 Go 语言有基本的了解。 有关详细信息,请参阅 Go 入门

使用 Go 工作流模板

若要快速开始使用,请将工作流模板添加到存储库的 .github/workflows 目录。

GitHub 提供了一个适用于大多数 Go 项目的 Go 工作流模板。 本指南的后续部分提供了如何自定义此工作流模板的示例。

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

  2. 在存储库名称下,单击 “操作”。

    “github/docs”存储库的选项卡的屏幕截图。 “操作”选项卡以橙色边框突出显示。

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

  4. “选择工作流”页面显示一系列推荐的工作流模板。 搜索“go”。

  5. 单击“持续集成”**** 以筛选工作流选择。

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

    “选择工作流”页的屏幕截图。 “GO”工作流”上的“配置”按钮以橙色轮廓突出显示。
    如果未找到“Go - by GitHub Actions”工作流模板,请将以下工作流代码复制到存储库的 .github/workflows 目录中名为 go.yml 的新文件。

    YAML
    name: Go
    
    on:
      push:
        branches: [ "main" ]
      pull_request:
        branches: [ "main" ]
    
    jobs:
      build:
    
        runs-on: self-hosted
        steps:
          - uses: actions/checkout@v4
    
          - name: Set up Go
            uses: actions/setup-go@v5
            with:
              go-version: '1.20'
    
          - name: Build
            run: go build -v ./...
    
          - name: Test
            run: go test -v ./...
    
  7. 根据需要编辑工作流。 例如更改 Go 版本。

  8. 单击“提交更改”。

指定 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/octo-examplemodule@v1.3.4

缓存依赖项

可以使用 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@v3
        with:
          name: Go-results-${{ matrix.go-version }}
          path: TestResults-${{ matrix.go-version }}.json