如何完善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 '部署流程执行失败,请检查日志!' } } }
前置准备说明
- Jenkins凭证配置:
- 添加Bitbucket用户名密码凭证(ID:
bitbucket-creds)。 - 添加Nexus镜像仓库用户名密码凭证,通过环境变量注入
NEXUS_USER和NEXUS_PWD。 - 添加Kubernetes集群的kubeconfig文件凭证(ID:
kubeconfig-prod)。
- 添加Bitbucket用户名密码凭证(ID:
- Agent环境要求:
- 安装Git、Docker、Helm、kubectl工具。
- 若使用Docker-in-Docker,需配置Agent的Docker权限。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

