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

如何完善Jenkinsfile实现从Bitbucket拉取Helm Chart部署到Kubernetes

完善后的Jenkinsfile及配置说明

需要补充的核心配置项

  • 代码拉取优化:用Jenkins官方git步骤替代原生shell命令,支持凭证管理、指定分支和目标目录,避免多仓库拉取冲突。
  • Kubernetes集群访问:通过Jenkins的configFileProvider挂载kubeconfig文件,确保Jenkins Agent能访问目标K8s集群。
  • Helm环境准备:确保Agent安装Helm工具,或在流水线中自动安装;按需添加Helm仓库认证。
  • 镜像构建与推送:用Docker(或Kaniko)构建Spring Boot镜像,登录Nexus镜像仓库并推送镜像。
  • Helm部署逻辑:用helm upgrade --install命令部署Chart,动态替换镜像地址为Nexus中的镜像。
  • 部署验证:通过kubectl检查Pod就绪状态、服务端点可用性,确保部署成功。

完整Jenkinsfile示例

pipeline {
    agent any
    environment {
        // 根据实际环境修改以下变量
        HELM_CHART_REPO = 'http://192.168.1.30:7990/scm/jen/helm.git'
        APP_REPO = 'http://192.168.1.30:7990/scm/jen/spring-boot-microservice.git'
        NEXUS_REGISTRY = '192.168.1.40:8082'
        IMAGE_NAME = 'spring-boot-microservice'
        IMAGE_TAG = "${BUILD_NUMBER}"
        K8S_NAMESPACE = 'default'
        HELM_RELEASE_NAME = 'spring-boot-app'
        HELM_CHART_PATH = './helm-charts/my-app-chart' // 指向仓库中具体的Chart目录
    }
    stages {
        stage('拉取Helm Chart仓库') {
            steps {
                echo '从Bitbucket拉取Helm Chart仓库...'
                git(
                    url: HELM_CHART_REPO,
                    credentialsId: 'bitbucket-creds', // Jenkins中配置的Bitbucket凭证ID
                    branch: 'main',
                    changelog: false,
                    poll: false,
                    destination: 'helm-charts' // 指定拉取到独立目录
                )
            }
        }

        stage('拉取应用代码') {
            steps {
                echo '从Bitbucket拉取Spring Boot应用代码...'
                git(
                    url: APP_REPO,
                    credentialsId: 'bitbucket-creds',
                    branch: 'main',
                    changelog: false,
                    poll: false,
                    destination: 'app-code' // 指定拉取到独立目录
                )
            }
        }

        stage('检查Kubernetes集群版本') {
            steps {
                echo '检查Kubernetes集群版本...'
                configFileProvider([configFile(fileId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) {
                    sh 'kubectl version --short'
                }
            }
        }

        stage('构建Docker镜像') {
            steps {
                echo '构建Spring Boot应用Docker镜像...'
                dir('app-code') {
                    // 先打包Jar包,再构建镜像
                    sh 'mvn clean package -DskipTests'
                    sh "docker build -t ${NEXUS_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} ."
                }
            }
        }

        stage('推送镜像到Nexus') {
            steps {
                echo '推送镜像到Nexus仓库...'
                sh "docker login -u ${NEXUS_USER} -p ${NEXUS_PWD} ${NEXUS_REGISTRY}"
                sh "docker push ${NEXUS_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
                sh 'docker logout ${NEXUS_REGISTRY}'
            }
        }

        stage('通过Helm部署到Kubernetes') {
            steps {
                echo '使用Helm部署Chart到Kubernetes集群...'
                configFileProvider([configFile(fileId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) {
                    sh """
                        helm upgrade --install ${HELM_RELEASE_NAME} ${HELM_CHART_PATH} \
                            --namespace ${K8S_NAMESPACE} \
                            --create-namespace \
                            --set image.repository=${NEXUS_REGISTRY}/${IMAGE_NAME} \
                            --set image.tag=${IMAGE_TAG} \
                            --wait
                    """
                }
            }
        }

        stage('验证部署结果') {
            steps {
                echo '验证应用部署状态...'
                configFileProvider([configFile(fileId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) {
                    // 等待Pod就绪
                    sh "kubectl wait --for=condition=ready pod -l app=${HELM_RELEASE_NAME} --namespace ${K8S_NAMESPACE} --timeout=5m"
                    // 查看服务状态
                    sh "kubectl get svc ${HELM_RELEASE_NAME} --namespace ${K8S_NAMESPACE}"
                    // 可选:调用应用健康检查接口
                    sh 'curl -s http://$(kubectl get svc ${HELM_RELEASE_NAME} -n ${K8S_NAMESPACE} -o jsonpath="{.status.loadBalancer.ingress[0].ip}")/actuator/health | grep "UP"'
                }
            }
        }
    }
    post {
        always {
            // 清理本地临时镜像(可选)
            sh "docker rmi ${NEXUS_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} || true"
        }
        success {
            echo '部署流程执行成功!'
        }
        failure {
            echo '部署流程执行失败,请检查日志!'
        }
    }
}

前置准备说明

  1. Jenkins凭证配置:
    • 添加Bitbucket用户名密码凭证(ID:bitbucket-creds)。
    • 添加Nexus镜像仓库用户名密码凭证,通过环境变量注入NEXUS_USER和NEXUS_PWD。
    • 添加Kubernetes集群的kubeconfig文件凭证(ID:kubeconfig-prod)。
  2. Agent环境要求:
    • 安装Git、Docker、Helm、kubectl工具。
    • 若使用Docker-in-Docker,需配置Agent的Docker权限。

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:30:30