You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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类型凭据

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:02:09