从零搭建 Jenkins + Docker + Gitee 自动化部署流水线
本文介绍如何基于 Jenkins、Docker 和 Gitee 构建自动化部署流水线,实现代码推送后的自动构建、镜像打包及容器重启,并通过飞书机器人实时通知构建状态。
一、架构与流程
整体流程如下:
- 开发者将代码推送到 Gitee 仓库。
- Jenkins 监听代码变动或手动触发构建。
- Jenkins 拉取代码,使用 Docker Compose 构建并启动 Python 应用与 MySQL 数据库容器。
- 构建完成后,通过 Webhook 发送通知至飞书群。
二、项目文件结构
project/
├── app.py
├── Dockerfile
├── Dockerfile_db
├── docker-compose.yml
├── Jenkinsfile
├── init.sql
└── requirements.txt
1. Flask 应用 (app.py)
from flask import Flask, Response
import mysql.connector
import os
app = Flask(__name__)
@app.route('/')
def hello():
conn = mysql.connector.connect(
host=os.environ.get('DB_HOST', 'db'),
user=os.environ.get('DB_USER', 'root'),
password=os.environ.get('DB_PASSWORD', '<your_password>'),
database=os.environ.get('DB_NAME', 'testdb'),
charset='utf8mb4'
)
cursor = conn.cursor()
cursor.execute("SELECT message FROM greetings LIMIT 1")
row = cursor.fetchone()
conn.close()
return Response(
f"数据库说:{row[0]},这条数据来自MySQL!",
content_type='text/html; charset=utf-8'
)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
2. Docker 配置
Dockerfile (Python 应用)
FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Dockerfile_db (MySQL 数据库)
FROM mysql:8.0
COPY init.sql /docker-entrypoint-initdb.d/init.sql
docker-compose.yml
name: dockerapp
services:
web:
build: .
ports:
- "8080:5000"
depends_on:
- db
environment:
DB_HOST: db
DB_USER: root
DB_PASSWORD: <your_password>
DB_NAME: testdb
db:
build:
context: .
dockerfile: Dockerfile_db
environment:
MYSQL_ROOT_PASSWORD: <your_password>
MYSQL_DATABASE: testdb
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
init.sql
CREATE TABLE IF NOT EXISTS greetings (
id INT AUTO_INCREMENT PRIMARY KEY,
message VARCHAR(255)
) CHARACTER SET utf8mb4;
INSERT INTO greetings (message) VALUES ('Hello from MySQL');
requirements.txt
flask
mysql-connector-python
三、Jenkins Pipeline 配置
Jenkinsfile
pipeline {
agent any
stages {
stage('1. 拉取代码') {
steps {
echo '代码已由 Jenkins 自动拉取完毕'
}
}
stage('2. 部署容器') {
steps {
// 清理旧环境,确保 init.sql 重新执行
sh 'docker-compose -p dockerapp down -v --remove-orphans'
// 后台启动并强制重新构建镜像
sh 'docker-compose -p dockerapp up -d --build'
// 等待 MySQL 初始化完成
echo '正在初始化数据库,请等待...'
sleep 25
}
}
}
post {
success {
sh "curl -X POST 'https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_WEBHOOK_ID' \
-H 'Content-Type: application/json' \
-d '{\"msg_type\":\"text\",\"content\":{\"text\":\"🚀 Jenkins 构建成功!\\n项目:${env.JOB_NAME}\\n编号:#${env.BUILD_NUMBER}\\n状态:部署已完成。\"}}'"
}
failure {
sh "curl -X POST 'https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_WEBHOOK_ID' \
-H 'Content-Type: application/json' \
-d '{\"msg_type\":\"text\",\"content\":{\"text\":\"❌ Jenkins 构建失败!\\n项目:${env.JOB_NAME}\\n编号:#${env.BUILD_NUMBER}\\n请登录 Jenkins 查看控制台日志。\"}}'"
}
}
}
四、Gitee 仓库准备
- 登录 Gitee,创建新仓库(建议私有)。
- 本地初始化 Git 并关联远程仓库:
git init
git add .
git commit -m "initial flask + mysql + docker compose project"
git remote add origin https://gitee.com/your_username/dockerapp.git
git push -u origin master
五、Jenkins 环境搭建
1. 启动 Jenkins 容器
docker run -d \
--name jenkins \
-p 8090:8080 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
获取初始管理员密码:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
2. 安装插件
进入系统管理页面,安装 Gitee Plugin 及其他推荐插件。
3. 配置凭据
在'凭据管理'中添加 Username with password 类型的凭据:
- ID:
gitee-auth
- 用户名:Gitee 账号
- 密码:Gitee 个人令牌(Token)
4. 挂载 Docker Socket
为了让 Jenkins 容器能调用宿主机上的 Docker 命令,需重启容器并挂载 socket:
docker rm -f jenkins
docker run -d \
-p 8090:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
jenkins/jenkins:lts
在 Jenkins 容器内安装 Docker CLI 和 Docker Compose:
docker exec -u 0 -it jenkins bash
apt-get update && apt-get install -y curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
apt-get update && apt-get install -y docker-ce-cli
curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit
5. 配置流水线任务
- 新建任务,选择'流水线 (Pipeline)'。
- 在'源码管理'中选择 Gitee,填入仓库 URL 并选择上述创建的凭据。
- 在'流水线'部分,脚本来源选择'Pipeline script from SCM'。
- 保存并运行构建。
六、通知集成
本方案直接在 Jenkinsfile 的 post 块中使用 curl 调用飞书 Webhook 接口,无需额外插件。构建成功或失败时,飞书群将收到包含任务名称和构建编号的通知。