在 GitHub Actions 上使用 PostgreSQL 对 Go 应用程序进行无缝集成测试

科技   2024-11-23 07:51   广东  

介绍

集成测试对于确保Go应用程序与数据库等外部依赖项的无缝协作至关重要。在本文中,我们将探讨如何使用GitHub Actions为Go应用程序设置和运行集成测试。我们将在CI(持续集成)管道中配置PostgreSQL数据库,简化测试流程,并确保每次代码推送后代码库的可靠性和生产就绪状态。让我们开始吧!

GitHub Actions

GitHub Actions是一个持续集成和持续交付(CI/CD)平台,允许您自动化构建、测试和部署管道。GitHub Actions可以在您的代码库中发生其他事件时运行工作流。

GitHub工作流

工作流是一个可配置的自动化过程,可以运行一个或多个作业。工作流通过存储在代码库中的YAML文件定义,并在代码库中的事件触发时运行。工作流定义在.github/workflows目录中。

  • 事件:是触发工作流运行的代码库中的特定活动。在我们的例子中,这将是对分支的推送。
  • 作业:是工作流中在同一运行器上执行的一组步骤。
  • 运行器:是触发时运行工作流的服务器。每个运行器一次只能运行一个作业。

工作流YAML

第一步是创建.github/workflows文件夹,其中将放置我们的YAML文件。接下来创建YAML文件,在本例中我们将其命名为ci-test.yml

name: ci-test

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

env:
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: Password123
  POSTGRES_DB: crud_db

jobs:
  build:
    name: tests
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_USER: ${{ env.POSTGRES_USER }}
          POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }}
          POSTGRES_DB: ${{ env.POSTGRES_DB }}
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v4

      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: "1.22"

      - name: Install dbmate for golang migrations
        run: |
          sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
          sudo chmod +x /usr/local/bin/dbmate
          which dbmate

      - name: Construct DB URL
        id: construct_url
        run: echo "DB_URL=postgres://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@localhost:5432/${{ env.POSTGRES_DB }}?sslmode=disable" >> $GITHUB_ENV

      - run: env

      - name: Make Migrations
        run: make migrations URL=${{ env.DB_URL }}

      - name: Seed test DB
        run: go run db/seed.go

      - name: Test
        run: make test

YAML描述

工作流名称

第一部分是为该动作命名,在本例中为ci-test

工作流触发器

第二部分描述了触发器,即触发动作的事件。在此文件中,我们有两个事件会触发作业的运行:推送和针对主分支的拉取请求。这确保了每次计划用于生产的代码更改在合并前都经过测试,从而维护项目的完整性。

环境变量

GitHub工作流支持全局和作业特定的环境变量。这些变量描述了我们将在YAML文件中使用的PostgreSQL凭据。

作业

jobs:
  build:
    name: tests
    runs-on: ubuntu-latest

在这里,我们为将执行核心任务的作业分配了一个名称,即构建和测试我们的代码。运行器描述了工作流将在何处运行,这将是一个Ubuntu虚拟机。

服务

GitHub Actions工作流允许您定义服务。在本例中,我们需要一个PostgreSQL数据库来运行测试。

使用官方的PostgreSQL Docker镜像创建一个PostgreSQL容器。容器使用我们之前声明的环境变量进行配置。

工作流步骤

  1. 检出代码库

    - uses: actions/checkout@v4

    这行代码获取代码库的最新版本,提供对所有源文件的访问。

  2. 设置Go环境

    - name: Set up Go
      uses: actions/setup-go@v4
      with:
        go-version: "1.22"
  3. 安装dbmate

    - name: Install dbmate for golang migrations
      run: |
        sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
        sudo chmod +x /usr/local/bin/dbmate
        which dbmate
  4. 构建数据库URL

    - name: Construct DB URL
      id: construct_url
      run: echo "DB_URL=postgres://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@localhost:5432/${{ env.POSTGRES_DB }}?sslmode=disable" >> $GITHUB_ENV
  5. 运行数据库迁移

    - name: Make Migrations
      run: make migrations URL=${{ env.DB_URL }}
  6. 填充测试数据库

    - name: Seed test DB
      run: go run db/seed.go
  7. 执行测试

    - name: Test
      run: make test

此工作流将在每次我们对主分支进行拉取请求或推送代码时运行。

采用GitHub Actions的一些优势

  • 自动化测试:在每次代码更改时一致地运行测试。
  • 数据库集成:提供真实的PostgreSQL环境进行测试,模拟生产条件。
  • 可重现的环境:GitHub Actions使用容器化服务和预定义步骤,以确保所有运行结果的一致性。
  • 快速反馈循环:它们使开发人员能够在出现问题时快速获得反馈,从而加快问题解决。
  • 简化的协作:确保所有贡献者的更改在合并前经过验证,维护代码质量和项目稳定性。

结论

通过利用GitHub Actions,此工作流简化了测试和数据库设置,确保了稳健和可靠的软件开发。访问GitHub代码库以查看使用上述动作进行测试的代码。


源自开发者
专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。
 最新文章