介绍使用 Actions 进行的持续集成

已完成

与 GitHub Actions 的持续集成(CI)通过每次更改代码时自动执行生成、测试和验证过程,转换团队如何协作进行软件开发。 此方法尽早捕获问题,提高代码质量,并加快交付速度。

使用 GitHub Actions 了解 CI

持续集成是一种开发实践,团队成员经常集成其代码更改,理想情况下每天多次进行集成。 每个集成都会触发自动生成和测试过程,用于验证更改并提供即时反馈。

使用 GitHub Actions 实现 CI 的主要优势

即时反馈循环

  • 自动测试在每个推送或拉取请求上运行
  • 开发人员在几分钟内了解其更改是否会中断现有功能
  • 当问题能够更便宜和更容易解决时,它们会被提前发现

一致的生成环境

  • 每个生成在干净、可重现的环境中运行
  • 消除“在我的计算机上工作”问题
  • 确保在不同的开发人员设置中实现一致的行为

自动质量检查

  • 自动执行代码 Lint 分析、安全扫描和测试
  • 无需手动干预即可维护编码标准
  • 为所有代码贡献提供一致的质量入口

新式 CI 工作流示例

下面是 CI 工作流示例:

name: CI Pipeline

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

env:
  DOTNET_VERSION: "8.0.x"
  NODE_VERSION: "20"

jobs:
  test:
    name: Test and Lint
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 # Full history for better analysis

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }}

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: ~/.nuget/packages
          key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}

      - name: Restore dependencies
        run: dotnet restore

      - name: Build project
        run: dotnet build --no-restore --configuration Release

      - name: Run unit tests
        run: dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage"

      - name: Upload coverage reports
        uses: codecov/codecov-action@v3
        with:
          files: ./coverage.xml
          fail_ci_if_error: true

  security-scan:
    name: Security Analysis
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Run security scan
        uses: github/codeql-action/init@v3
        with:
          languages: csharp

      - name: Build for analysis
        run: dotnet build --configuration Release

      - name: Perform CodeQL analysis
        uses: github/codeql-action/analyze@v3

  build-artifacts:
    name: Build Release Artifacts
    needs: [test, security-scan]
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }}

      - name: Build release package
        run: dotnet publish --configuration Release --output ./release

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: release-package
          path: ./release
          retention-days: 30

工作流细目

事件触发器

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]
  • 推送操作:在提交到主分支和开发分支时触发 CI
  • 拉取请求事件:在合并更改之前验证更改

环境配置

env:
  DOTNET_VERSION: "8.0.x"
  NODE_VERSION: "20"
  • 集中版本管理,以便跨作业保持一致性
  • 在整个工作流中易于更新和维护

作业编排

  • 并行执行testsecurity-scan 同时运行以获取更快的反馈
  • 依赖项build-artifacts 等待测试和安全作业完成
  • 条件执行:项目仅从主分支生成

已实现的最佳做法

安全性和可靠性

  • 使用固定的操作版本(@v4)实现可重现性
  • 使用 CodeQL 实现安全扫描
  • 验证代码覆盖率,并在覆盖率不足时使 CI 失败

性能优化

  • 依赖项缓存可减少生成时间
  • 并行作业执行可最大程度地减少工作流总持续时间
  • 选择性构件构建可节省计算资源

开发人员工具

  • 清除作业名称和步骤说明
  • 测试覆盖率报告
  • 对拉取请求的快速反馈

CI 流水线演变

随着项目的发展,可以使用以下方法扩展此基础:

  • 多环境测试:针对不同的 .NET 版本或作系统进行测试
  • 集成测试:添加数据库或 API 集成测试
  • 性能测试:包括关键路径的负载测试
  • 部署自动化:使用自动部署将 CI 扩展为完整的 CI/CD

使用 GitHub Actions 的 CI 方法为软件质量和团队工作效率提供了基础。