引言:为什么要自动化?

作为开发者,我们都希望自己的代码是健壮、可靠的。保证这一点的核心手段之一就是测试。但随着项目变得越来越复杂,手动去运行所有测试用例会变得非常繁琐,而且容易遗忘。

更重要的是,我们希望确保:每一次向代码仓库推送(push)新的代码时,都没有破坏任何已有的功能

这正是 CI/CD (Continuous Integration / Continuous Deployment,持续集成/持续部署) 的核心思想。而 GitHub Actions 就是GitHub官方内置的、强大且免费的CI/CD工具。

它允许你在GitHub仓库中定义一些“工作流(Workflow)”。这些工作流可以在特定事件发生时(例如 push代码或创建 pull request时)被自动触发,然后在GitHub提供的云端虚拟机上执行一系列你预设好的命令(如安装依赖、跑测试、打包、部署等)。

这篇入门教程将手把手带你为你的Python项目设置第一个GitHub Action,实现测试自动化。

案例:为一个简单的Python项目添加CI

假设我们有一个非常简单的Python项目,包含一个函数和一个测试。

步骤1:创建项目文件

在你的本地,创建一个项目文件夹,并包含以下文件:

my_python_project/ ├── calculator.py └── test_calculator.py

  • calculator.py:

    def add(a, b):
        """一个简单的加法函数"""
        return a + b
    
  • test_calculator.py: 我们使用Python内置的 unittest库来编写测试。

    import unittest
    from calculator import add
    
    class TestCalculator(unittest.TestCase):
    
        def test_add(self):
            self.assertEqual(add(2, 3), 5)
            self.assertEqual(add(-1, 1), 0)
            self.assertEqual(add(-1, -1), -2)
    
    if __name__ == '__main__':
        unittest.main()
    

    你可以在本地运行 python test_calculator.py 来确认测试能通过。

步骤2:创建GitHub仓库并推送代码

  1. 在GitHub上创建一个新的空仓库(例如,名为 python-ci-demo)。
  2. 在本地的 my_python_project文件夹中,初始化Git,并把代码推送到这个新的仓库。
    git init
    git add .
    git commit -m "Initial commit"
    git branch -M main
    git remote add origin https://github.com/YourUsername/python-ci-demo.git
    git push -u origin main
    

步骤3:创建GitHub Actions工作流文件

这是核心步骤。GitHub Actions由仓库中一个特殊目录下的YAML文件来定义。

  1. 在你的项目根目录下,创建一个 .github文件夹,然后在其中再创建一个 workflows文件夹。

  2. .github/workflows/目录下,创建一个名为 python-ci.yml的文件。

    最终的目录结构:

    my_python_project/
    ├── .github/
    │   └── workflows/
    │       └── python-ci.yml   <-- 我们的工作流文件
    ├── calculator.py
    └── test_calculator.py
    
  3. 将以下内容粘贴到 python-ci.yml中:

    name: Python CI # 工作流的名称
    
    on: [push, pull_request] # 触发条件:在push或pull_request时运行
    
    jobs: # 工作流包含的任务
      build: # 任务ID:build
        runs-on: ubuntu-latest # 运行环境:在最新的Ubuntu虚拟机上
    
        strategy:
          matrix:
            python-version: ["3.8", "3.9", "3.10"] # 针对不同Python版本运行
    
        steps: # 任务包含的步骤
        - name: Checkout code # 步骤1:检出代码
          uses: actions/checkout@v3
    
        - name: Set up Python ${{ matrix.python-version }} # 步骤2:设置Python环境
          uses: actions/setup-python@v4
          with:
            python-version: ${{ matrix.python-version }}
    
        - name: Install dependencies # 步骤3:安装依赖
          run: |
            python -m pip install --upgrade pip
            # 如果你有requirements.txt,可以在这里用 pip install -r requirements.txt        
    
        - name: Run tests # 步骤4:运行测试
          run: |
                    python test_calculator.py
    

YAML文件解读

  • name: 只是一个显示在GitHub界面的名字。
  • on: 定义了触发工作流的事件。这里我们设置为每次 pushpull_request到仓库时都触发。
  • jobs: 一个工作流可以包含一个或多个“任务”。
  • build: 我们这个任务的名字。
  • runs-on: 指定任务运行在什么样的虚拟机环境上。ubuntu-latest是最常用的。
  • strategy.matrix: 这是一个高级功能,可以让你用不同配置并行地运行任务。这里,我们让整个任务分别在Python 3.8, 3.9, 3.10三个版本上各跑一遍,以确保我们的代码兼容多个Python版本。
  • steps: 定义了任务要按顺序执行的具体步骤。
    • actions/checkout@v3: 这是一个官方提供的Action,作用是把你的仓库代码下载到虚拟机里。
    • actions/setup-python@v4: 这是另一个官方Action,用于在虚拟机里安装并配置指定版本的Python。
    • run: 这个关键字用来执行Shell命令。我们用它来升级pip和运行我们的测试脚本。

步骤4:提交并推送工作流文件

将我们刚刚创建的 .github/workflows/python-ci.yml文件提交并推送到GitHub。

git add .
git commit -m "Add GitHub Actions CI workflow"
git push

步骤5:见证自动化!

当你把代码推送到GitHub后,立刻打开你的GitHub仓库页面,点击顶部的 “Actions” 标签页。

你会看到,你的 Python CI工作流正在运行!点进去,你可以实时地看到每一个步骤的执行情况和日志输出。由于我们设置了矩阵策略,你会看到三个并行的任务,分别对应Python 3.8, 3.9, 3.10。

如果所有测试都通过,你会看到一个绿色的对勾。如果任何一个测试失败了,你会看到一个红色的叉,并且GitHub会给你发邮件通知。

GitHub Actions
Result <!-- 示意图URL -->

总结

恭喜你,你已经成功地为你项目配置了自动化测试!

这只是GitHub Actions的冰山一角。从这里开始,你可以:

  • 在测试成功后,自动构建你的项目(例如用PyInstaller打包成exe)。
  • 自动将你的Python包发布到PyPI。
  • 自动将你的Web应用部署到云服务器。

将CI/CD集成到你的开发流程中,是提升代码质量、减少手动操作、迈向专业化开发的关键一步。现在就开始在你的所有项目中加入Actions吧!