如何编写Jenkins CI/CD流水线实现Flask应用自动部署至Minikube?
问题描述
我在Ubuntu环境下开发了一个输出“Web app using python flask”的Python Flask应用,已创建Dockerfile、Deployment文件等必要文件,本地运行正常,代码已推送至GitHub仓库。希望通过Jenkins CI/CD流水线完成Docker镜像构建、推送至Docker Hub,并部署到本地运行正常的Minikube中,但多次构建失败,请求提供正确的流水线脚本编写方法、示例及建议。
提供的项目文件
Flask应用源码
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Web app using python flask' app.run(debug=True , host='0.0.0.0', port=5000)
Kubernetes Deployment & Service文件
apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: replicas: 1 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: jeetlinux/docker-demo:v1 ports: - containerPort: 5000 --- apiVersion: v1 kind: Service metadata: name: hello-app spec: selector: app: hello-app ports: - name: http port: 80 targetPort: 5000 type: LoadBalancer
Dockerfile
FROM python:3.9-slim-buster WORKDIR /app COPY . /app RUN pip3 install -r requirement.txt CMD python3 hello.py
解决方案
1. Jenkins前置准备
- 安装必备插件:
Git Pipeline、Docker Pipeline、Kubernetes CLI Plugin - 配置凭据:
- Docker Hub账号密码:凭据ID设为
dockerhub-creds(类型为"Username with password") - 确保Jenkins节点能访问Minikube集群:将Minikube的
kubeconfig文件复制到Jenkins用户的~/.kube/config路径,或者在Jenkins凭据中添加kubeconfig类型凭据
- Docker Hub账号密码:凭据ID设为
2. Jenkins流水线脚本(Jenkinsfile)
pipeline { agent any environment { // 定义变量,方便后续修改 DOCKER_REPO = "jeetlinux/docker-demo" IMAGE_TAG = "v${BUILD_NUMBER}" // 用构建号作为动态标签,避免镜像覆盖 K8S_DEPLOYMENT_FILE = "deployment.yaml" } stages { stage('拉取代码') { steps { git url: '你的GitHub仓库地址', branch: 'main' } } stage('构建Docker镜像') { steps { script { docker.build("${DOCKER_REPO}:${IMAGE_TAG}") } } } stage('推送镜像到Docker Hub') { steps { script { docker.withRegistry('https://registry.hub.docker.com', 'dockerhub-creds') { docker.image("${DOCKER_REPO}:${IMAGE_TAG}").push() // 可选:同时推送latest标签 docker.image("${DOCKER_REPO}:${IMAGE_TAG}").push('latest') } } } } stage('部署到Minikube') { steps { script { // 替换Deployment文件中的固定镜像标签为当前构建的动态标签 sh "sed -i 's/jeetlinux\\/docker-demo:v1/${DOCKER_REPO}:${IMAGE_TAG}/' ${K8S_DEPLOYMENT_FILE}" // 执行Kubernetes部署命令 sh "kubectl apply -f ${K8S_DEPLOYMENT_FILE}" // 可选:验证部署状态,确保Pod正常启动 sh "kubectl rollout status deployment/hello-app" } } } } post { success { echo "流水线执行成功!镜像已推送至Docker Hub,应用已部署到Minikube" } failure { echo "流水线执行失败,请查看各阶段日志定位问题" } } }
3. 关键注意事项与排错建议
- 镜像标签动态化:避免使用固定标签(如
v1),改用构建号、Git哈希值等动态标识,防止旧镜像覆盖导致部署异常 - Minikube权限验证:在Jenkins节点执行
kubectl config view、kubectl get pods,确认Jenkins用户拥有集群操作权限 - 依赖文件检查:确保项目根目录存在
requirement.txt,且文件包含flask依赖(示例内容:flask==2.0.1) - Dockerfile优化:可添加
RUN apt-get update && apt-get install -y --no-install-recommends gcc解决部分Python包编译问题,构建后清理依赖以减小镜像体积 - Jenkins节点环境验证:确认节点已安装Docker、kubectl工具,且Docker服务处于运行状态;若使用Minikube内置Docker引擎,可在流水线中添加
sh "eval $(minikube docker-env)"命令 - 日志排查重点:构建失败时优先查看镜像构建报错、Docker Hub推送权限错误、kubectl命令执行异常等日志片段
内容的提问来源于stack exchange,提问作者Biswajit Patnaik
相关产品推荐
相关产品推荐

