基于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 节点,提升了系统可维护性与可扩展性。