Go 项目的 CI/CD:配置 GitHub Actions

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 CI/CD 对 Go 项目很重要



现代 Go (Golang) 开发不仅需要编写干净高效的代码,还需要配置自动化检查、构建和交付应用程序的流程。CI/CD(持续集成 / 持续交付)是一套实践方法,可以快速安全地将变更交付到生产环境。对于 Go 开发者来说,GitHub Actions 因其与仓库的紧密集成和配置的简便性,已成为最流行的工具之一。



在本文中,我们将详细讲解如何使用 GitHub Actions 为 Go 项目创建一个完整的 CI/CD 流水线。您将学习如何自动化测试、构建二进制文件以及部署到服务器。所有示例都将使用 Go (Golang) 并提供实际步骤。



1. 适用于 Go 的 GitHub Actions 基础



GitHub Actions 是一个内置的工作流自动化系统。每个 workflow 都是一个 YAML 文件,描述了构建、测试和部署的步骤。对于 Go 项目,最小的流水线包括:



  • 安装 Go
  • 缓存依赖项
  • 运行测试
  • 构建应用程序


Workflow 文件结构



在仓库根目录下创建 .github/workflows/ 目录和 ci.yml 文件。以下是 Go 的基本配置:



name: Go 项目 CI

on: push: branches: [ main, develop ] pull_request: branches: [ main ]

jobs: build-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4

- name: 安装 Go uses: actions/setup-go@v5 with: go-version: '1.22'

- name: 缓存模块 uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-

- name: 下载依赖 run: go mod download

- name: 代码检查 run: go vet ./...

- name: 运行测试 run: go test -v -race -coverprofile=coverage.out ./...

- name: 构建二进制文件 run: go build -o myapp ./cmd/main.go


这个 workflow 在推送到 main 或 develop 分支以及创建 pull request 时触发。它会检查代码错误,使用 race 标志(数据竞争检测器)运行测试,并构建二进制文件。



2. 扩展流水线:测试与代码质量



基本检查很好,但对于严肃的 Go 项目,还需要更多。让我们添加静态分析和代码覆盖率检查。



添加 golangci-lint



golangci-lint 是一个 linter 聚合器,包含 go vet、errcheck、staticcheck 等。将其添加到 workflow 中:



      - name: 安装 golangci-lint        uses: golangci/golangci-lint-action@v4        with:          version: latest

- name: 运行 linter run: golangci-lint run ./...


代码覆盖率报告



测试覆盖率是一个重要的质量指标。GitHub Actions 可以生成报告,甚至在覆盖率低时阻止 PR:



      - name: 生成覆盖率报告        run: go test -coverprofile=coverage.out -covermode=atomic ./...

- name: 检查最低覆盖率 run: | go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//' > coverage.txt if [ $(cat coverage.txt) -lt 70 ]; then echo "代码覆盖率低于 70%" exit 1 fi


现在,如果测试覆盖率低于 70%,workflow 将失败。这是维护 Go 项目质量的绝佳实践。



3. 构建和发布 Docker 镜像



Go 应用程序通常以 Docker 容器的形式部署。GitHub Actions 可以自动

博客

书籍推荐