介绍使用 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"
- 集中版本管理,以便跨作业保持一致性
- 在整个工作流中易于更新和维护
作业编排
-
并行执行:
test并security-scan同时运行以获取更快的反馈 -
依赖项:
build-artifacts等待测试和安全作业完成 - 条件执行:项目仅从主分支生成
已实现的最佳做法
安全性和可靠性
- 使用固定的操作版本(
@v4)实现可重现性 - 使用 CodeQL 实现安全扫描
- 验证代码覆盖率,并在覆盖率不足时使 CI 失败
性能优化
- 依赖项缓存可减少生成时间
- 并行作业执行可最大程度地减少工作流总持续时间
- 选择性构件构建可节省计算资源
开发人员工具
- 清除作业名称和步骤说明
- 测试覆盖率报告
- 对拉取请求的快速反馈
CI 流水线演变
随着项目的发展,可以使用以下方法扩展此基础:
- 多环境测试:针对不同的 .NET 版本或作系统进行测试
- 集成测试:添加数据库或 API 集成测试
- 性能测试:包括关键路径的负载测试
- 部署自动化:使用自动部署将 CI 扩展为完整的 CI/CD
使用 GitHub Actions 的 CI 方法为软件质量和团队工作效率提供了基础。