【实战】采用jenkins pipeline实现自动构建并部署至k8s

文章目录

前言

在前面的kubernetes系列博文中我们分享了从创建kubernetes集群到各种中间件的安装,以及从springboot项目的容器化部署到kubernetes外网映射,基本上包含了从0到1的K8S基础实战的整个过程。今天我们再分享一期采用jenkins pipeline实现自动构建并部署至k8s的实战演示,各位大大敬请鉴赏。

本文中采用jenkins pipeline执行整个jenkins的构建过程,在pipeline中使用docker执行maven构建。构建后通过dockerfile将jar包构建为docker镜像,并上传到阿里云仓库。然后执行deployment部署到k8s集群。

部署jenkins

这里采用docker的方式部署jenkins。

编写docker-compose-jenkins.yaml

root@master app\]# mkdir -p jenkins/jenkins_home \[root@master app\]# mkdir -p jenkins/jenkins_config \[root@master app\]# vim docker-compose-jenkins.yaml ```java version: '3' services: jenkins: image: registry.cn-hangzhou.aliyuncs.com/senfel/jenkins:2.346.3-2-centos7-jdk8 container_name: jenkins restart: unless-stopped #指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器 volumes: - "/usr/bin/docker:/usr/bin/docker" - "/var/run/docker.sock:/var/run/docker.sock" - "/usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7" - "./jenkins/jenkins_home:/var/jenkins_home" - "./jenkins/jenkins_config:/var/jenkins_config" environment: TZ: Asia/Shanghai LANG: en_US.UTF-8 JAVA_OPTS: '-Xmx2048M -Xms2048M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:MaxNewSize=128m -Djava.util.logging.config.file=/var/jenkins_home/log.properties -Duser.timezone=Asia/Shanghai' user: root ports: - "10000:8080" ``` #### 配置maven源 创建maven配置文件目录 \[root@master app\]# mkdir -p jenkins/jenkins_home/appconfig/maven 新增settings.xml \[root@master app\]# vim jenkins/jenkins_home/appconfig/maven/settings.xml ```java nexus-aliyun central Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public /root/.m2 jdk-1.8 1.8 1.8 1.8 1.8 ``` #### 启动jenkins \[root@master app\]# docker-compose -f docker-compose-jenkins.yaml up -d 访问 http://10.10.22.91:10000地址,等待出现下面解锁界面。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/9dea3bb51c8c3ba674d937e56634c86c.webp) #### 解锁jenkins \[root@master app\]# cat jenkins/jenkins_home/secrets/initialAdminPassword ea87fa2fb6b34e8a8415e6c3c6dc6658 解锁jenkins后,在界面中选择"安装建议的插件"并重启 ### Jenkins默认插件及git、镜像仓库、k8s凭证配置 #### host key verification configuration修改为不验证 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/0c18f3b018c3b28c36b8f94e30e768f4.webp) #### Gitee ssh 创建用户名密码类型的github代码仓库凭证,ID为git 进入容器创建rsa \[root@master app\]# docker exec -it b33560517ea0 bash $ ssh-keygen -t rsa -C senfel123@sina.cn 后续步骤全部enter ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/9b20d21690d5adbcc5423dde10f3ebed.webp) 查看公匙并配置在gitee ssh $ cat /root/.ssh/id_rsa.pub ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/87c8e622869c7da71e8cf1813ef02443.webp) 查看私匙并记住后面jenkins创建流水线配置凭证 $ cat /root/.ssh/id_rsa ssh username with private key ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/fd8cabfaa224a287a58bd76ddae0b018.webp) #### 阿里云镜像仓库ssh 创建用户名密码类型的aliyun registry镜像仓库凭证,ID为aliyun username with password ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/834249b9f788e7292e6c77bc691b2d1d.webp) #### 编写pipeline安装以下常用插件 确认Pipeline、Docker Pipeline、 Pipeline: GitHub Groovy Libraries、Pipeline: Stage View Plugin (按照了pipeline默认就有) Gitee plugin(我的git仓库是阿里云的,其他的可以按照GitLab) 是否已经安装 #### 将kubectl命令文件拷贝到jenkins容器 \[root@master \~\]# find / -name kubectl \[root@master \~\]# docker cp /usr/bin/kubectl jenkins:/usr/bin #### 将k8s集群配置文件拷贝到jenkins \[root@master \~\]# docker cp /root/.kube jenkins:/root/.kube #进入jenkins容器增加config文件执行权限 \[root@master \~\]# docker exec -it jenkins bash \[root@9c4198ba00e7 .kube\]# chmod +x config ### 准备java示例工程 java工程自行准备一个springboot项目即可,这里重点是在项目根目录下新增Dockerfile、deployment.yaml、Jenkinsfile。 #### 准备Dockerfile ```java # version 1.0 # 基础镜像 FROM openjdk:8-jre # 维护人 MAINTAINER senfel<187@sina.cn> # 创建目录 RUN mkdir -p /home/app # 拷贝项目jar COPY ./target/k8s-demo-0.0.1-SNAPSHOT.jar /home/app/app.jar # 执行命令启动jar ENTRYPOINT ["java","-jar","/home/app/app.jar"] # 暴露端口 EXPOSE 8888 ``` #### 添加k8s的deployment.yaml配置 ```java apiVersion: apps/v1 kind: Deployment # 声明一个Deployment资源对象 metadata: name: deployment-k8s-demo spec: replicas: 3 # 通过replicas声明pod个数是3 selector: # 通过标签选择被控制的pod matchLabels: app: k8s-demo template: # 在template中定义pod metadata: labels: # 给pod打上标签app=k8s-demo app: k8s-demo spec: containers: - name: k8s-demo # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中 image: k8s-demo-image ports: - name: http containerPort: 8888 --- # 在一个yaml文件中通过---分割多个资源对象 apiVersion: v1 kind: Service # 声明一个Service资源对象 metadata: name: service-k8s-demo spec: type: NodePort selector: # service-k8s-demo将选择标签包含app=k8s-demo的pod app: k8s-demo ports: - name: http port: 8888 # Service监听端口 targetPort: 8888 # 转发到后端Pod的端口号 protocol: TCP # tcp协议 nodePort: 30888 # 外网访问端口,范围:30000-32767 ``` #### 添加Jenkinsfile ```java pipeline{ agent any environment { WS = "${WORKSPACE}" REGISTRY= "registry.cn-hangzhou.aliyuncs.com" IMAGE_NAME = "registry.cn-hangzhou.aliyuncs.com/senfel/k8s-demo:${env.BUILD_ID}" K8S_NAMESPACE = "default" } //定义流水线的加工流程 stages { //流水线的所有阶段 stage('step1:env check'){ steps { sh 'pwd && ls -alh' sh 'printenv' sh 'docker version' sh 'java -version' sh 'git --version' } } stage('step2:compile'){ agent { docker { image 'maven:3-alpine' args '-v maven-repository:/root/.m2' } } steps { sh 'pwd && ls -alh' sh 'mvn -v' sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true' } } stage('step3:build image'){ steps { sh 'pwd && ls -alh' sh 'docker build -t ${IMAGE_NAME} .' } } stage('step4:push image'){ steps { withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'aliyun', usernameVariable: 'REGISTRY_USERNAME', passwordVariable: 'REGISTRY_PASSWORD']]) { sh """ docker login -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD} ${REGISTRY} docker push ${IMAGE_NAME} docker rmi ${IMAGE_NAME} """ } } } stage('step5:deployment'){ steps { sh """ sed -i "s#k8s-demo-image#${IMAGE_NAME}#g" deployment.yaml kubectl apply --kubeconfig=/root/.kube/config -f deployment.yaml --namespace=${K8S_NAMESPACE} """ } } } } ``` ### 配置jenkins pipeline任务 创建jenkins pipeline任务,并设置需要的参数。 #### 新建pipeline任务 点击"新建任务",输入名称并选择"流水线"(pipeline),然后点击确定。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/3db5316f4ac3c937a54f4916a8e72ec9.webp) #### 新建pipeline 配置 pipeline任务 进入任务的配置界面,在流水线(pipeline)设置部分,选择"Pipeline script from SCM"。SCM选项选为"Git",配置好工程的git地址以及获取代码的凭证信息。然后在"Additional Behaviours"中添加"Clean before checkout"。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/1ad9db75084a700b983fa463109c253c.webp) #### 测试pipeline任务 在创建的pipeline任务中,点击"立即构建"即可立即执行pipeline任务。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/f634fec312f2e8947f1d11af718d1978.webp) 在项目k8s-demo主页默认会有阶段视图 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/7d69623894372841d49c0fd3ef738ba8.webp) #### 查看k8s是否已经部署k8s \[root@master k8s\]# kubectl get pods,svc \| grep k8s-demo pod/deployment-k8s-demo-694c84bd48-blwjj 1/1 Running 0 12m pod/deployment-k8s-demo-694c84bd48-nfwqz 1/1 Running 0 12m pod/deployment-k8s-demo-694c84bd48-tkrv2 1/1 Running 0 12m service/service-k8s-demo NodePort 10.107.193.30 8888:30888/TCP 14h ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/a37a08782ff646221b1ee9b8689bc9fd.webp) 至此,Jenkins已经将git 分支部署在k8s集群 ### 设置gitee自动触发jenkins 前面的步骤中已经完成了手动执行jenkins执行pipeline任务完成构建部署任务,下面说明如何在代码提交后让gitlab/gitee自动触发jenkins执行pipeline任务。 #### 插件确认 jenkins中安装gitlab/gitee插件,我们在初始已经安装了gitee并配置了凭证。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/8bca05f265f64922f7b29854b17bb3e7.webp) 以下直接以gitee测试,gitlab也是一样的步骤和操作。 #### 查看jenkins webhook调用路径并生成密匙 webhook调用路径 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/efae54e35c8c7f806ad75da72f22ac82.webp) 生成webhook调用密匙 ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/f541a770bad30067109cc8b35ae8c573.webp) #### gitee配置webhook 在gitee k8s-demo项目设置中新建一个webhook ![在这里插入图片描述](https://file.jishuzhan.net/article/1789326928419753985/3cf008587ac017a6bb9536bbe6b17a67.webp) 必须保证gitee能够调通你的ip, k8s-demo 代码push测试自动构建即可。

相关推荐
晚风_END11 小时前
Linux|操作系统|elasticdump的二进制方式部署
运维·服务器·开发语言·数据库·jenkins·数据库开发·数据库架构
知识即是力量ol11 小时前
初识 Kafka(一):分布式流平台的定义、核心优势与架构全景
java·分布式·kafka·消息队列
爱吃生蚝的于勒11 小时前
【Linux】线程概念(一)
java·linux·运维·服务器·开发语言·数据结构·vim
kong790692811 小时前
Nginx性能优化
java·nginx·性能优化
Pluchon11 小时前
硅基计划4.0 算法 简单模拟实现位图&布隆过滤器
java·大数据·开发语言·数据结构·算法·哈希算法
我命由我1234511 小时前
Java 泛型 - Java 泛型通配符(上界通配符、下界通配符、无界通配符、PECS 原则)
java·开发语言·后端·java-ee·intellij-idea·idea·intellij idea
Seven9711 小时前
AQS深度探索:以ReentrantLock看Java并发编程的高效实现
java
4311媒体网11 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
淡忘_cx11 小时前
使用Jenkins自动化部署spring-java项目+宝塔重启项目命令(2.528.2版本)
java·自动化·jenkins
毕设源码-钟学长11 小时前
【开题答辩全过程】以 基于SSM的孤儿救助信息管理系统设计与实现为例,包含答辩的问题和答案
java