引言:为什么要自动化?
作为开发者,我们都希望自己的代码是健壮、可靠的。保证这一点的核心手段之一就是测试。但随着项目变得越来越复杂,手动去运行所有测试用例会变得非常繁琐,而且容易遗忘。
更重要的是,我们希望确保:每一次向代码仓库推送(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仓库并推送代码
- 在GitHub上创建一个新的空仓库(例如,名为
python-ci-demo
)。 - 在本地的
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文件来定义。
-
在你的项目根目录下,创建一个
.github
文件夹,然后在其中再创建一个workflows
文件夹。 -
在
.github/workflows/
目录下,创建一个名为python-ci.yml
的文件。最终的目录结构:
my_python_project/ ├── .github/ │ └── workflows/ │ └── python-ci.yml <-- 我们的工作流文件 ├── calculator.py └── test_calculator.py
-
将以下内容粘贴到
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
: 定义了触发工作流的事件。这里我们设置为每次push
或pull_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会给你发邮件通知。
<!-- 示意图URL -->
总结
恭喜你,你已经成功地为你项目配置了自动化测试!
这只是GitHub Actions的冰山一角。从这里开始,你可以:
- 在测试成功后,自动构建你的项目(例如用PyInstaller打包成exe)。
- 自动将你的Python包发布到PyPI。
- 自动将你的Web应用部署到云服务器。
将CI/CD集成到你的开发流程中,是提升代码质量、减少手动操作、迈向专业化开发的关键一步。现在就开始在你的所有项目中加入Actions吧!
...