基于k8s的Jenkins CI/CD平台部署实践(二):流水线构建与自动部署全流程

基于k8s的Jenkins CI/CD平台部署实践(二):流水线构建与自动部署全流程


随着容器化和微服务架构的深入发展,企业对持续集成与持续交付(CI/CD)系统的自动化程度、可扩展性与可维护性提出了更高要求。Jenkins 作为主流的 CI/CD 工具,凭借其丰富的插件生态与强大的流水线能力,能够灵活对接各类开发、构建、发布工具链。

在前文中,我们已基于 Kubernetes 成功部署 Jenkins 并实现持久化存储挂载。本篇将进一步聚焦 Jenkins 在 Kubernetes 环境中的流水线实践,介绍如何通过声明式流水线实现代码变更触发、自动构建、镜像制作与推送、以及部署至 Kubernetes 集群的全流程自动化。

一、Jenkins简介

Jenkins 是一款开源的自动化持续集成与持续交付(CI/CD)工具,拥有丰富的插件生态和高度可配置的流水线系统。它能够帮助开发团队实现自动化构建、测试、打包、部署等流程,从而提高开发效率与软件交付质量。
得益于其良好的可扩展性和与主流版本控制、构建工具、容器平台(如 Docker、Kubernetes)的高度兼容,Jenkins 已成为 DevOps 实践中的核心工具之一。通过与 Kubernetes 集成,Jenkins 可以动态调度构建任务至集群中的 Pod 中运行,实现弹性伸缩与资源隔离,适用于构建大规模分布式的 CI/CD 系统。
在这里插入图片描述

二、系统架构与环境说明

1. 系统架构

为实现 Jenkins 在 Kubernetes 环境下的自动构建与部署流水线,整体系统架构如下:

  • Kubernetes 集群(CI/CD 编排平台)主机范围:192.168.100.130 ~ 192.168.100.132
  • Docker 主机(镜像构建节点)地址:192.168.100.30
  • GitLab 代码仓库服务器地址:192.168.100.100

当前已部署测试Pod,名字为xxx-7db499bfb8-whjsj,命名空间cicd,使用的镜像版本是hwj:v1.0.5

在这里插入图片描述
在这里插入图片描述

2. 网络通信与认证准备

由于 Jenkins 需要跨主机访问 Docker,为简化认证过程与保障流水线顺利运行,需配置如下免密通道:

✅ Jenkins Pod → Docker 主机(SSH 免密)
用于将构建产物(如 jar 包)传输到 Docker 主机,并远程执行镜像构建与推送 Harbor 的命令。
✅ Jenkins Pod → Kubernetes 集群(SSH 免密)
用于通过 SSH 远程登录至 Kubernetes 节点主机,执行 kubectl apply -f 命令,实现部署自动化。

# 进入Jenkins Pod内部
kubectl exec -it -n cicd jenkins-xxxx -- /bin/bash

# 生成ssh公钥
ssh-keygen -t rsa

# 分发公钥,配置免密
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.30
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.130

三、配置Jenkins凭据

为了让 Jenkins 能够无缝访问 GitLab 仓库、我们需要在 Jenkins 中提前配置好外部系统的认证凭据。Jenkins 凭据统一通过「系统管理 → 凭据管理」进行配置,供流水线任务在运行时调用。
在这里插入图片描述
在这里插入图片描述
配置凭据

在这里插入图片描述
在这里插入图片描述

四、Jenkins流水线设计

以下为一个完整的声明式流水线,包含从拉取代码、构建打包、构建镜像、推送 Harbor 到自动部署至 Kubernetes 的全流程

pipeline {
    agent any
    environment {
        git_address = "http://192.168.100.100/yw/hwj.git"
        git_auth = "jenkins-to-gitlab"                 // Jenkins中配置的GitLab凭据ID
		docker_build_host = "192.168.100.30"
		k8s_build_host = "192.168.100.130"
        branch_name = "master"
        // BUILD_NUMBER 是 Jenkins 的内置环境变量,代表当前构建的编号(递增)
        // 例如第一次构建为 1,第二次为 2,用于版本号控制
    }
    stages {
        stage('清空工作目录') {
            steps {
                echo '清理工作目录...'
                deleteDir() // 删除当前工作目录的所有内容
            }
        }
        stage('拉取代码'){
            steps{
                checkout([$class: 'GitSCM', branches: [[name: "*/${branch_name}"]],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
            }
        }
        stage('代码打包'){
            steps{
                sh "mvn -U clean package -Dmaven.test.skip=true"
            }
        }
        stage('传输Jar包到Docker主机') {
            steps {
                sh """
                scp -rp hwj-main/target/hwj-main.jar root@${docker_build_host}:/root/docker-build/hwj/
                """
            }
		}
        stage('Docker主机构建镜像并推送仓库') {
            steps {
                script {
                    sh """
                    ssh root@${docker_build_host} '
                        cd /root/docker-build/hwj &&
                        docker build -t harbor.local/k8s/hwj:v1.0.${BUILD_NUMBER} . &&
                        docker push harbor.local/k8s/hwj:v1.0.${BUILD_NUMBER}
                   	 	'
                    """
                }
            }
        }
		stage('替换镜像并apply到K8s') {
			steps {
				script {
					sh """
					ssh root@${k8s_build_host} '
						sed -i "s|image: harbor.local/k8s/hwj:.*|image: harbor.local/k8s/hwj:v1.0.${BUILD_NUMBER}|g" /root/kubernetes/zhsy/zhsy-deploy.yaml
						kubectl apply -f /root/kubernetes/hwj/hwj-deploy.yaml
					'
					"""
				}
			}
		}
	}
}

在这里插入图片描述

再次查看Pod状态,可以看到Pod已经更新,镜像版本变更为hwj:v1.0.8

kubectl describe pod -n cicd xxx

在这里插入图片描述


总结

🚀 本文详细介绍了在 Kubernetes 环境中,如何基于 Jenkins 搭建完整的自动化构建与部署流水线,涵盖从源代码拉取、Maven 构建、镜像制作、推送 Harbor 到 K8s 自动部署的全过程。
✅ 通过 SSH 免密 + 分层主机职责,将 Jenkins 的构建逻辑高效分发至 Docker 和 Kubernetes 节点,提升了系统可维护性与可扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值