# 定义全流程三个阶段,按顺序执行:install
→ build → deploy
stages:
- install
# 阶段1:安装Python/Flask依赖,验证依赖可用性
- build
# 阶段2:验证应用语法,构建Docker镜像
- deploy
# 阶段3:本地停止旧容器,启动新构建的Docker镜像
# ==================== 阶段1:install(安装项目依赖)
====================
install_flask_deps:
stage:
install
tags:
-
docker # 与你的GitLab Runner标签一致,无标签可删除该行
cache:
#
缓存依赖包,避免重复下载,提升CI效率
paths:
-
~/.cache/pip/
script:
-
echo "===== 开始升级pip ====="
-
pip3 install --upgrade pip --user
-
echo "===== 开始安装Flask项目依赖 ====="
-
pip3 install --no-cache-dir -r requirements.txt
--user
-
echo "===== 验证依赖安装结果 ====="
-
python3 -c "import flask; print('Flask依赖安装成功,版本:',
flask.__version__)"
artifacts:
#
保存安装成功的依赖相关信息,供后续阶段使用(可选,提升容错性)
paths:
-
requirements.txt
when:
on_success
expire_in:
1 hour
# ==================== 阶段2:build(构建Docker镜像)
====================
build_flask_docker:
stage:
build
tags:
-
docker
# 依赖install阶段执行成功,才会运行该阶段(可选,增强流程连贯性)
dependencies:
-
install_flask_deps
script:
-
echo "===== 验证app.py语法正确性 ====="
-
python3 -m py_compile app.py # 编译检查语法,有错误则CI终止
-
echo "===== 开始构建Docker镜像 ====="
# 构建Docker镜像,标签格式:镜像名:提交哈希(保证镜像唯一性,避免覆盖)
-
DOCKER_IMAGE_NAME="flask-app:${CI_COMMIT_SHA:0:8}"
# 截取前8位提交哈希,简化标签
-
docker build -t ${DOCKER_IMAGE_NAME} .
-
echo "===== 为镜像添加latest标签,方便后续部署 ====="
-
docker tag ${DOCKER_IMAGE_NAME} flask-app:latest
-
echo "===== Docker镜像构建成功 ====="
-
docker images | grep flask-app # 打印镜像信息,确认构建结果
artifacts:
after_script:
# ==================== 阶段3:deploy(本地启动Docker镜像)
====================
deploy_flask_local:
stage:
deploy
tags:
-
docker
# 依赖build阶段执行成功,才会运行该阶段
dependencies:
-
build_flask_docker
# 仅在master/main分支执行部署(可选,可根据需求修改分支规则)
only:
-
master
-
main
script:
-
echo "===== 开始本地部署Flask应用 ====="
-
echo "===== 停止并删除已存在的同名容器(避免端口占用/冲突)
====="
-
CONTAINER_NAME="flask-container"
-
PORT_MAPPING="5000:5000" # 本地端口:容器端口,容器端口与Dockerfile一致
#
容错处理:容器不存在时,停止/删除命令不报错
-
docker stop ${CONTAINER_NAME} || true
-
docker rm ${CONTAINER_NAME} || true
-
echo "===== 本地启动Docker容器 ====="
#
后台启动容器,端口映射,使用latest镜像
-
docker run -d --name ${CONTAINER_NAME} -p
${PORT_MAPPING} flask-app:latest
-
echo "===== 验证容器运行状态 ====="
-
docker ps | grep ${CONTAINER_NAME} # 打印容器信息,确认启动成功
-
echo "===== 打印应用访问地址 ====="
-
LOCAL_IP=$(hostname -I | awk '{print $1}')
# 获取本机局域网IP
-
echo "======================================"
-
echo "Flask应用本地部署成功!"
-
echo "本地访问地址:http://localhost:5000"
-
echo "局域网访问地址:http://${LOCAL_IP}:5000"
-
echo "容器名称:${CONTAINER_NAME}"
-
echo "镜像名称:flask-app:latest"
-
echo "======================================"
-
echo "===== 可选:查看容器实时日志(前20行) ====="
-
docker logs --tail 20 ${CONTAINER_NAME}