这篇指南将从零开始,带你一步步搭建一个完整的 Python 自动化流水线。

目录
- 核心概念:CI/CD 与 Jenkins
- 准备工作
- 环境要求
- 安装 Jenkins
- 安装必要的插件
- 第一步:创建一个 Python 项目
- 第二步:配置 Jenkins Pipeline
- 创建 Jenkins Item
- 编写 Jenkinsfile (流水线脚本)
- 第三步:配置代码仓库
- 在 Jenkins 中连接 Git
- 配置 Webhook (实现自动触发)
- 第四步:运行与调试
- 手动构建
- 查看构建日志
- 进阶与最佳实践
- 使用虚拟环境
- 代码质量检查 (Linting & Testing)
- 构建产物管理
- 部署到服务器
核心概念:CI/CD 与 Jenkins
- CI (Continuous Integration - 持续集成):开发人员频繁地将代码合并到主干,每次合并后都会自动触发构建和测试,这能快速发现集成错误。
- CD (Continuous Deployment/Delivery - 持续部署/交付):在 CI 的基础上,通过自动化的流程将代码部署到生产环境或预发布环境,CD 是 CI 的延伸。
- Jenkins:一个开源的、功能强大的自动化服务器,是实现 CI/CD 的核心工具,它通过“插件”扩展功能,可以集成各种版本控制系统、构建工具和部署脚本。
准备工作
环境要求
- 一台已经安装好 Java (JDK 11 或更高版本) 的机器(Linux, macOS, Windows 均可)。
- 一个 Python 3 环境。
- 一个 Git 仓库(GitHub, GitLab, Gitee 等),这里我们以 GitHub 为例。
安装 Jenkins
- 下载 Jenkins WAR 文件:https://www.jenkins.io/download/
- 在终端中运行:
java -jar jenkins.war - 浏览器访问
http://localhost:8080。 - 按照页面提示完成初始设置(获取初始管理员密码、安装推荐插件等)。
安装必要的插件
安装插件是 Jenkins 功能扩展的关键,进入 Manage Jenkins -> Manage Plugins -> Available,搜索并安装以下插件:
- Git Plugin: 用于从 Git 仓库拉取代码。
- Pipeline Plugin: 核心插件,用于定义和执行流水线。
- GitHub Integration Plugin: (可选,但推荐) 提供更友好的 GitHub 集成体验。
- Python Plugin: (可选) 提供在 Jenkins 中执行 Python 脚本和构建项目的专用步骤。
第一步:创建一个 Python 项目
我们假设你有一个简单的 Python Web 项目,结构如下:
my-python-app/
├── app.py # Flask 应用主文件
├── requirements.txt # Python 依赖
├── tests/ # 测试目录
│ └── test_app.py
└── Jenkinsfile # Jenkins 流水线脚本 (稍后创建)
app.py (一个简单的 Flask 应用)
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello from Jenkins CI/CD Pipeline!"
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
requirements.txt

Flask==2.2.2
tests/test_app.py (一个简单的测试)
import unittest
from app import app
class FlaskTestCase(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
self.app = app.test_client()
def test_hello(self):
rv = self.app.get('/')
self.assertEqual(rv.status_code, 200)
self.assertIn(b"Hello from Jenkins CI/CD Pipeline!", rv.data)
if __name__ == '__main__':
unittest.main()
将这个项目推送到你的 GitHub 仓库。
第二步:配置 Jenkins Pipeline
Jenkins Pipeline 通常通过一个名为 Jenkinsfile 的文件来定义,这个文件和你的代码一起存放在版本库中,这使得流水线代码和应用程序代码可以一起版本化。
创建 Jenkins Item
- 在 Jenkins 首页,点击
New Item。 - 输入一个名称(
my-python-pipeline),选择Pipeline,然后点击OK。 - 在配置页面,找到 General 部分。
- 勾选
GitHub project,并输入你的 GitHub 仓库 URL。
- 勾选
- 找到 Pipeline 部分。
- Definition: 选择
Pipeline script from SCM。 - SCM: 选择
Git。 - Repository URL: 输入你的 Git 仓库地址。
- Credentials: 添加你的 GitHub 凭据(用户名/密码或 Personal Access Token)。
- Branch Specifier: 选择你想构建的分支,
*/main或*/master。 - Script Path: 确认是
Jenkinsfile(这是默认值)。
- Definition: 选择
编写 Jenkinsfile
在你的项目根目录下创建一个 Jenkinsfile,这个文件使用 Groovy DSL 语言来定义流水线的各个阶段。

Jenkinsfile (基础版本)
pipeline {
agent any // 'any' 表示可以在任何可用的 Jenkins agent 上运行
stages {
stage('Checkout') {
steps {
// 从 SCM (Git) 检出代码
checkout scm
}
}
stage('Install Dependencies') {
steps {
// 使用 sh 步骤执行 shell 命令
sh 'pip install -r requirements.txt'
}
}
stage('Run Tests') {
steps {
// 运行 Python 单元测试
sh 'python -m unittest discover -s tests'
}
}
}
}
Jenkinsfile 关键部分解释:
pipeline { ... }: 定义整个流水线。agent any: 指定执行流水线的“代理”。any表示使用 Jenkins 主节点或任何可用的从节点。stages { ... }: 包含一个或多个stage。stage('Stage Name'): 定义一个逻辑阶段,检出代码”、“安装依赖”。steps { ... }: 定义在当前阶段要执行的具体步骤。checkout scm: 这是 Pipeline 的特殊变量,表示从当前配置的 SCM 仓库检出代码。sh 'command': 执行 shell 命令。
第三步:配置代码仓库
为了让 Jenkins 在你推送代码时自动触发构建,需要配置 Webhook。
在 Jenkins 中连接 Git
- 回到你的 Jenkins Item 配置页面 (
my-python-pipeline)。 - 在 General 部分,点击
Advanced...按钮。 - 在 Project Repository 下方,点击
Add来添加你的 GitHub 凭据。 - 返回配置页面,确保 Credentials 中选择了你刚刚添加的凭据。
配置 GitHub Webhook
- 进入你的 GitHub 仓库页面。
- 点击
Settings->Webhooks->Add webhook。 - Payload URL: 输入你的 Jenkins 地址,格式为
http://<your_jenkins_server_url>/github-webhook/。http://192.168.1.100:8080/github-webhook/。
- Content type: 选择
application/json。 - Secret: (可选) 可以留空,也可以生成一个密码。
- Which events would you like to trigger this webhook?: 选择
Just thepushevent。 - 点击
Add webhook。
每次你向 main 分支推送代码时,GitHub 都会通知 Jenkins,Jenkins 会自动触发一次新的构建。
第四步:运行与调试
手动构建
如果你想手动触发一次构建,可以在你的 Jenkins Item 页面点击 "Build Now"。
查看构建日志
构建完成后,点击左侧的 "Build History",然后点击某个构建的编号(#1),再点击 "Console Output",你将能看到完整的构建过程,包括每个步骤的输出,如果某个步骤失败,日志会清晰地指出错误原因。
进阶与最佳实践
上面的基础流水线只做了最基本的事情,一个生产级的流水线通常会更复杂。
使用虚拟环境
为了避免污染系统 Python 环境,强烈建议在流水线中使用虚拟环境。
修改 Jenkinsfile
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Setup Virtual Environment') {
steps {
sh 'python3 -m venv venv'
sh 'source venv/bin/activate && pip install -r requirements.txt'
}
}
stage('Run Tests') {
steps {
// 确保在虚拟环境中运行测试
sh 'source venv/bin/activate && python -m unittest discover -s tests'
}
}
}
// (可选) 构建后清理虚拟环境
post {
always {
sh 'rm -rf venv' // 'always' 表示无论成功或失败都执行
}
}
}
代码质量检查
使用 flake8 或 pylint 等工具进行代码风格和静态检查。
requirements.txt 添加依赖
...
Flask==2.2.2
flake8
修改 Jenkinsfile
// ... 其他 stages ...
stage('Lint Code') {
steps {
sh 'source venv/bin/activate && flake8 .'
}
}
stage('Run Tests') {
steps {
sh 'source venv/bin/activate && python -m unittest discover -s tests'
}
}
flake8 发现了问题,构建会失败,从而强制开发者修复代码。
构建产物管理
如果项目是构建成 wheel 或 tar.gz 包,可以将其存档。
Jenkinsfile 添加存档步骤
// ... 其他 stages ...
stage('Build Package') {
steps {
sh 'source venv/bin/activate && python setup.py sdist bdist_wheel'
}
}
stage('Archive Artifacts') {
steps {
archiveArtifacts artifacts: 'dist/*', fingerprint: true
}
}
archiveArtifacts 会将 dist 目录下的所有文件作为构建产物保存起来,方便后续部署。
部署到服务器
这是 CD 的核心,通常在 post 部分定义,只有当所有阶段成功后才执行。
Jenkinsfile 添加部署阶段
// ... 其他 stages ...
post {
success {
// 只有构建成功才执行部署
echo 'Pipeline succeeded. Deploying to production server...'
// 这里可以使用 SSH 插件或 Ansible 等工具来执行部署命令
// 示例: sh 'ssh user@server "cd /path/to/app && git pull && systemctl restart myapp"'
echo 'Deployment complete.'
}
failure {
echo 'Pipeline failed. Skipping deployment.'
}
}
注意:直接在 Jenkinsfile 中硬编码 SSH 密码是不安全的,应该使用 Jenkins 的 凭据 功能来管理敏感信息。
通过以上步骤,你已经成功搭建了一个基础的 Python 自动化流水线:
- 代码提交: 开发者将代码推送到 GitHub。
- 自动触发: GitHub Webhook 通知 Jenkins 开始新构建。
- 检出代码: Jenkins 从 GitHub 拉取最新代码。
- 环境准备: 创建并激活 Python 虚拟环境,安装依赖。
- 质量检查: 运行
flake8检查代码风格。 - 运行测试: 运行
unittest确保代码质量。 - 部署 (可选): 如果所有步骤成功,自动将代码部署到服务器。
这个流水线可以根据你的具体需求进行扩展,例如添加安全扫描、性能测试、多环境部署(开发、测试、生产)等,Jenkins 的强大之处在于其丰富的插件生态,几乎可以实现任何你想要的自动化任务。
