本文手把手教你搭建一个完整的 CI/CD 流水线,即使你是初学者也能轻松上手。我们会从最基础的环境准备开始,一步步构建自动化部署和测试系统。

前置准备

所需基础知识

  • 基本的 Git 操作
  • 了解 Docker 的基本概念
  • 知道什么是 YAML 文件(不用深入,会用就行)

所需工具

  • GitHub 账号
  • 本地安装 Git
  • 代码编辑器(如 VS Code)

Step 1: 创建 GitHub Actions 工作流

1.1 创建工作流目录结构

在你的项目根目录下,按以下结构创建文件夹:

# 在终端中执行
mkdir -p .github/workflows

1.2 创建工作流文件

创建文件 .github/workflows/ci-cd-pipeline.yml,内容如下:

name: CI/CD Pipeline

# 触发条件:手动触发
on:
  workflow_dispatch:
    inputs:
      deploy_service_a:
        description: '部署服务A'
        required: true
        default: false
        type: boolean
      run_tests:
        description: '运行自动化测试'
        required: true
        default: true
        type: boolean

# 环境变量配置
env:
  DOCKER_REGISTRY: your-registry.com
  DEPLOY_ENV: staging
  CLOUD_REGION: us-east-1

jobs:
  # 准备阶段:生成版本号等
  prepare:
    runs-on: ubuntu-latest
    outputs:
      build_version: ${{ steps.version.outputs.build_version }}
    steps:
      - name: 生成构建版本号
        id: version
        run: |
          # 使用 GitHub Run Number 作为版本号的一部分
          VERSION="1.0.${{ github.run_number }}"
          echo "build_version=${VERSION}" >> $GITHUB_OUTPUT
          echo "✅ 生成的版本号: ${VERSION}"

💡 小贴士workflow_dispatch 允许你手动触发工作流,非常适合学习和测试。

Step 2: 配置自动化构建

2.1 创建 Dockerfile 模板

为你的服务创建 Dockerfile

# Dockerfile
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 并安装依赖
COPY package*.json ./
RUN npm install

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["npm", "start"]

2.2 在工作流中添加构建步骤

ci-cd-pipeline.yml 中添加构建任务:

  build-service:
    needs: prepare
    runs-on: ubuntu-latest
    if: github.event.inputs.deploy_service_a == 'true'
    steps:
      - name: 检出代码
        uses: actions/checkout@v3
      
      - name: 登录到 Docker Registry
        run: |
          echo "${{ secrets.DOCKER_PASSWORD }}" | docker login \
            -u "${{ secrets.DOCKER_USERNAME }}" \
            --password-stdin ${{ env.DOCKER_REGISTRY }}
      
      - name: 构建并推送 Docker 镜像
        run: |
          IMAGE_NAME="${{ env.DOCKER_REGISTRY }}/my-service:${{ needs.prepare.outputs.build_version }}"
          docker build -t $IMAGE_NAME .
          docker push $IMAGE_NAME
          echo "✅ 镜像已推送到: $IMAGE_NAME"

🔒 安全提示secrets.DOCKER_PASSWORDsecrets.DOCKER_USERNAME 需要在 GitHub 仓库的 Settings > Secrets 中配置。

Step 3: 搭建自动化测试框架

3.1 创建测试项目结构

创建以下目录结构:

your-project/
├── .github/workflows/
│   └── ci-cd-pipeline.yml
├── tests/
│   ├── requirements.txt
│   ├── test_variables.py
│   └── test_cases/
│       └── example_test.robot
└── Results/

3.2 安装测试依赖

创建 tests/requirements.txt

# 自动化测试所需的核心库
robotframework==6.0.2
robotframework-seleniumlibrary==6.1.0
robotframework-requests==0.9.0
selenium==4.8.0

3.3 配置测试环境变量

创建 tests/test_variables.py

# 测试环境配置文件
# 根据不同环境修改这些值

# 基础 URL 配置
BASE_URL = "https://your-app-staging.example.com"
API_BASE_URL = "https://api-staging.example.com"

# 测试账户(使用测试专用账户)
TEST_USERNAME = "testuser@example.com"
TEST_PASSWORD = "TestPassword123!"

# 浏览器配置
BROWSER = "chrome"
HEADLESS = True  # 无头模式,适合 CI/CD

# 超时设置(秒)
PAGE_LOAD_TIMEOUT = 30
ELEMENT_WAIT_TIMEOUT = 10

3.4 编写第一个测试用例

创建 tests/test_cases/example_test.robot

*** Settings ***
Documentation    示例测试用例
Library          SeleniumLibrary
Variables        ../test_variables.py

*** Test Cases ***
验证登录功能
    [Tags]    login    smoke
    Open Browser    ${BASE_URL}    ${BROWSER}
    Set Selenium Speed    0.5 seconds
    Maximize Browser Window
    
    # 输入用户名和密码
    Input Text    id:username    ${TEST_USERNAME}
    Input Text    id:password    ${TEST_PASSWORD}
    Click Button    id:login-btn
    
    # 验证登录成功
    Wait Until Element Is Visible    id:dashboard
    Page Should Contain    欢迎回来
    
    [Teardown]    Close Browser

验证API健康检查
    [Tags]    api    health
    Create Session    api    ${API_BASE_URL}
    ${response}=    Get Request    api    /health
    Should Be Equal As Strings    ${response.status_code}    200
    ${json}=    To Json    ${response.content}
    Dictionary Should Contain Key    ${json}    status

Step 4: 在 CI/CD 中集成测试

4.1 添加测试执行步骤

在工作流文件中添加测试任务:

  run-tests:
    needs: prepare
    runs-on: ubuntu-latest
    if: github.event.inputs.run_tests == 'true'
    steps:
      - name: 检出代码
        uses: actions/checkout@v3
      
      - name: 设置 Python 环境
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      
      - name: 安装测试依赖
        run: |
          pip install -r tests/requirements.txt
          echo "✅ 测试依赖安装完成"
      
      - name: 运行自动化测试
        run: |
          mkdir -p Results
          robot --variablefile tests/test_variables.py \
                --outputdir Results \
                --loglevel INFO \
                tests/test_cases/
          echo "✅ 测试执行完成"
      
      - name: 上传测试报告
        uses: actions/upload-artifact@v3
        with:
          name: test-reports
          path: |
            Results/log.html
            Results/report.html
            Results/output.xml

Step 5: 添加测试结果分析

5.1 创建报告分析脚本

创建 tests/analyze_results.py

#!/usr/bin/env python3
"""
测试结果分析脚本
用法: python analyze_results.py <output_xml_path> <output_dir>
示例: python analyze_results.py Results/output.xml Results/analysis
"""

import sys
import os
import xml.etree.ElementTree as ET

def analyze_test_results(xml_file, output_dir):
    """分析 Robot Framework 测试结果"""
    try:
        # 解析 XML 文件
        tree = ET.parse(xml_file)
        root = tree.getroot()
        
        # 初始化统计变量
        total_tests = 0
        passed_tests = 0
        failed_tests = 0
        failed_test_names = []
        
        # 遍历所有测试用例
        for suite in root.iter('suite'):
            for test in suite.iter('test'):
                total_tests += 1
                status_elem = test.find('status')
                if status_elem is not None and status_elem.get('status') == 'PASS':
                    passed_tests += 1
                else:
                    failed_tests += 1
                    failed_test_names.append(test.get('name'))
        
        # 创建输出目录
        os.makedirs(output_dir, exist_ok=True)
        
        # 保存统计结果
        with open(os.path.join(output_dir, 'summary.txt'), 'w') as f:
            f.write(f"总测试数: {total_tests}\n")
            f.write(f"通过数: {passed_tests}\n")
            f.write(f"失败数: {failed_tests}\n")
            f.write(f"成功率: {passed_tests/total_tests*100:.1f}%\n" if total_tests > 0 else "成功率: 0%\n")
        
        # 保存失败的测试列表
        if failed_test_names:
            with open(os.path.join(output_dir, 'failed_tests.txt'), 'w') as f:
                f.write('\n'.join(failed_test_names))
        
        print(f"📊 测试结果分析完成!")
        print(f"总测试: {total_tests}, 通过: {passed_tests}, 失败: {failed_tests}")
        
    except Exception as e:
        print(f"❌ 分析测试结果时出错: {e}")
        sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("用法: python analyze_results.py <xml_file> <output_dir>")
        sys.exit(1)
    
    xml_file = sys.argv[1]
    output_dir = sys.argv[2]
    analyze_test_results(xml_file, output_dir)

5.2 在工作流中使用分析脚本

在测试步骤后添加分析步骤:

      - name: 分析测试结果
        run: |
          python tests/analyze_results.py Results/output.xml Results/analysis
          cat Results/analysis/summary.txt
          
      - name: 检查测试是否通过
        run: |
          FAILED_COUNT=$(cat Results/analysis/failed_tests.txt | wc -l)
          if [ "$FAILED_COUNT" -gt 0 ]; then
            echo "❌ 有 $FAILED_COUNT 个测试失败!"
            exit 1
          else
            echo "✅ 所有测试都通过了!"
          fi

Step 6: 验证和调试

6.1 本地测试

在提交到 GitHub 之前,先在本地验证:

# 1. 安装依赖
pip install -r tests/requirements.txt

# 2. 运行测试
robot --variablefile tests/test_variables.py tests/test_cases/

# 3. 查看报告
# 打开 Results/report.html 查看详细结果

6.2 在 GitHub Actions 中测试

  1. 提交代码到 GitHub
  2. 进入 Actions 标签页
  3. 点击 “CI/CD Pipeline” 工作流
  4. 点击 “Run workflow” 按钮
  5. 选择要执行的任务(部署、测试或两者都选)
  6. 查看执行日志和测试报告

常见问题解决

❓ 问题1: 测试找不到元素

解决方案:

  • 检查元素选择器是否正确
  • 增加等待时间:Wait Until Element Is Visible locator timeout=15

❓ 问题2: Docker 登录失败

解决方案:

  • 确认在 GitHub Secrets 中正确配置了用户名和密码
  • 检查 Registry URL 是否正确

❓ 问题3: 测试报告无法查看

解决方案:

  • 在 Actions 执行完成后,点击 “Artifacts” 下载测试报告
  • 本地打开 log.htmlreport.html 查看详细结果

下一步学习建议

  1. 添加更多测试用例:覆盖更多的业务场景
  2. 配置定时执行:使用 schedule 触发器定期运行测试
  3. 集成通知:测试失败时发送邮件或消息通知
  4. 多环境支持:为开发、测试、生产环境分别配置

总结

通过以上步骤,你已经成功搭建了一个完整的 CI/CD 流水线!这个系统可以:

  • ✅ 自动构建和部署应用
  • ✅ 自动运行端到端测试
  • ✅ 生成详细的测试报告
  • ✅ 在测试失败时及时告警

记住,CI/CD 的核心价值是快速反馈质量保障。随着你的项目发展,可以逐步扩展这个基础框架,添加更多高级功能。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐