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

文章目录

    • 前言
    • 部署jenkins
      • 编写docker-compose-jenkins.yaml
      • 配置maven源
      • 启动jenkins
      • 解锁jenkins
    • Jenkins默认插件及git、镜像仓库、k8s凭证配置
      • host key verification configuration修改为不验证
      • Gitee ssh
      • 阿里云镜像仓库ssh
      • 编写pipeline安装以下常用插件
      • 将kubectl命令文件拷贝到jenkins容器
      • 将k8s集群配置文件拷贝到jenkins
    • 准备java示例工程
      • 准备Dockerfile
      • 添加k8s的deployment.yaml配置
      • 添加Jenkinsfile
    • 配置jenkins pipeline任务
      • 新建pipeline任务
      • 新建pipeline
      • 测试pipeline任务
      • 查看k8s是否已经部署k8s
    • 设置gitee自动触发jenkins
      • 插件确认
      • 查看jenkins webhook调用路径并生成密匙
      • gitee配置webhook

前言

在前面的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

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

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <pluginGroups>
  </pluginGroups>
  <proxies>
  </proxies>
  <servers>
  </servers>
  <mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <localRepository>/root/.m2</localRepository>
  <profiles>
        <profile>
                <id>jdk-1.8</id>
                <activation>
                        <jdk>1.8</jdk>
                </activation>
                <properties>
                        <maven.compiler.source>1.8</maven.compiler.source>
                        <maven.compiler.target>1.8</maven.compiler.target>
                        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
                </properties>
        </profile>
  </profiles>
</settings>

启动jenkins

[root@master app]# docker-compose -f docker-compose-jenkins.yaml up -d
访问 http://10.10.22.91:10000地址,等待出现下面解锁界面。
在这里插入图片描述

解锁jenkins

[root@master app]# cat jenkins/jenkins_home/secrets/initialAdminPassword
ea87fa2fb6b34e8a8415e6c3c6dc6658
解锁jenkins后,在界面中选择“安装建议的插件”并重启

Jenkins默认插件及git、镜像仓库、k8s凭证配置

host key verification configuration修改为不验证

在这里插入图片描述

Gitee ssh

创建用户名密码类型的github代码仓库凭证,ID为git

进入容器创建rsa
[root@master app]# docker exec -it b33560517ea0 bash
$ ssh-keygen -t rsa -C senfel123@sina.cn
后续步骤全部enter
在这里插入图片描述

查看公匙并配置在gitee ssh
$ cat /root/.ssh/id_rsa.pub
在这里插入图片描述

查看私匙并记住后面jenkins创建流水线配置凭证
$ cat /root/.ssh/id_rsa

ssh username with private key
在这里插入图片描述

阿里云镜像仓库ssh

创建用户名密码类型的aliyun registry镜像仓库凭证,ID为aliyun
username with password
在这里插入图片描述

编写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

# 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配置

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

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),然后点击确定。
在这里插入图片描述

新建pipeline

配置 pipeline任务
进入任务的配置界面,在流水线(pipeline)设置部分,选择“Pipeline script from SCM”。SCM选项选为“Git”,配置好工程的git地址以及获取代码的凭证信息。然后在“Additional Behaviours”中添加“Clean before checkout”。
在这里插入图片描述

测试pipeline任务

在创建的pipeline任务中,点击“立即构建”即可立即执行pipeline任务。
在这里插入图片描述

在项目k8s-demo主页默认会有阶段视图
在这里插入图片描述

查看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
在这里插入图片描述

至此,Jenkins已经将git 分支部署在k8s集群

设置gitee自动触发jenkins

前面的步骤中已经完成了手动执行jenkins执行pipeline任务完成构建部署任务,下面说明如何在代码提交后让gitlab/gitee自动触发jenkins执行pipeline任务。

插件确认

jenkins中安装gitlab/gitee插件,我们在初始已经安装了gitee并配置了凭证。
在这里插入图片描述

以下直接以gitee测试,gitlab也是一样的步骤和操作。

查看jenkins webhook调用路径并生成密匙

webhook调用路径
在这里插入图片描述

生成webhook调用密匙
在这里插入图片描述

gitee配置webhook

在gitee k8s-demo项目设置中新建一个webhook
在这里插入图片描述

必须保证gitee能够调通你的ip,
k8s-demo 代码push测试自动构建即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

System Verilog通过CORDIC算法迭代16次求sin和cos值

求5~85度的sin和cos值 其它角度和Verilog实现代码类似&#xff0c;查表、移位和加法器 define DIE 16 //迭代次数 define PIE 3.1415926 define MUL 100_000_000 //同比放大 initial begin int die; int x[17]; int y[17]; int z[17…

学习软考----数据库系统工程师25

关系规范化 1NF&#xff08;第一范式&#xff09; 2NF&#xff08;第二范式&#xff09; 3NF&#xff08;第三范式&#xff09; BCNF&#xff08;巴克斯范式&#xff09; 4NF&#xff08;第四范式&#xff09; 总结

排序算法(Java版)

目录 1、直接插入排序2、希尔排序3、直接选择排序4、堆排序5、冒泡排序6、快速排序6.1 递归实现6.2 非递归实现 7、归并排序7.1 递归实现7.2 非递归实现 8、性能分析 今天我们学习一种算法&#xff1a;排序算法&#xff08;本文的排序默认是从小到大顺序&#xff09;&#xff0…

深度学习常用优化算法笔记介绍,各种梯度下降法详细介绍

优化算法 mini-batch梯度下降法 当一个数据集其数据量非常大的时候&#xff0c;比如上百万上千万的数据集&#xff0c;如果采用普通的梯度下降法&#xff0c;那么运算速度会非常慢&#xff0c;因为如果使用梯度下降法在每一次迭代的时候&#xff0c;都需要将这整个上百万的数…

基于边缘智能网关的工业燃气管网监测应用

随着城市化和工业化的飞速发展&#xff0c;燃气的使用量和应用范围持续增加&#xff0c;燃气管网作为承载燃气输送的设施&#xff0c;安全问题至关重要。一旦燃气管网发生泄漏事故&#xff0c;极易引发起火、爆炸等&#xff0c;从而酿成人员伤亡及财产损失的恶性事故。 得益于物…

流量分析利器arkime的学习之路(三)---结合Suricata攻击检测

1、基础 Arkime安装部分参考《流量分析利器arkime的学习之路&#xff08;一&#xff09;—安装部署》 在此基础上安装suricata软件并配置。 2、安装suricata yum install suricate 可能依赖的文件包括libyaml&#xff0c;PyYAML&#xff0c;这些可能在之前安装arkime或者其他…

Vue接收后端POST、GET返回的zip文件流打开报异常

近期接到一个小任务是将内容导出为 Zip 文件流的行式给前端 Vue 供用户下载&#xff1b;过程中发现一个问题打开 zip 文件报异常&#xff0c;如下&#xff1a; 首先后端这块单独在服务端请求是落盘的文件是正常的&#xff1b;因此后端的这块的逻辑没有问题&#xff1b;但中间前…

微服务拆分

目录 前言&#xff1a; 逻辑视图架构风格 一、分层式架构风格 二、六边形架构 如何定义微服务架构 微服务的拆分 业务能力进行服务拆分 子域进行服务拆分 拆分的原则 单一职责 闭包原则 前言&#xff1a; 我们在软件开发的时候一直在谈论架构&#xff0c;那么什么是…

线程池复习

手写线程池 - C语言版 | 爱编程的大丙 (subingwen.cn) 1. 线程池原理 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a;如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&…

8款好用的电脑监控软件分享丨好资源不私藏!

电脑已经成为我们日常生活和工作的重要工具。随之而来的是&#xff0c;电脑监控的需求也逐渐增加。为了帮助大家更好地管理和监控电脑使用情况&#xff0c;本文将为您推荐8款好用的电脑监控软件。这些软件功能强大&#xff0c;易于使用&#xff0c;适用于各种场景&#xff0c;让…

哪些博客类型是最受欢迎的?

在创建博客时&#xff0c;您可能会想到的最常见的问题之一是哪些是最受欢迎的博客类型&#xff1f;有许多不同类型的博客涉及广泛的主题&#xff0c;兴趣和受众。对于一个成功的博客&#xff0c;你需要提前计划并选择适合你的利基市场。在本文中&#xff0c;我们将分享您可以立…

数字工厂管理系统如何实现生产过程透明化

随着科技的飞速发展&#xff0c;数字化转型已成为制造业不可逆转的趋势。数字工厂管理系统作为实现生产自动化、智能化的重要工具&#xff0c;其在提升生产效率、降低运营成本、优化资源配置等方面的作用日益凸显。其中&#xff0c;实现生产过程的透明化是数字工厂管理系统的重…

东莞厂家环保水空调的应用场所

环保水空调&#xff08;也被称为蒸发式冷风机、水冷式环保空调等&#xff09;由于其独特的节能环保特性&#xff0c;适用于多种需要降温和通风的场所。以下是一些常见的应用场所&#xff1a; 工业厂房&#xff1a;工业厂房通常对温度、湿度和空气质量有较高要求。环保水空调不…

【C++】匿名对象超详细详解(什么是匿名对象?对象可以是哪些类型呢?)

目录 一、前言 二、匿名对象的概念详解 &#x1f95d; 语法结构 &#x1f34d;概念理解 三、匿名对象的对象类型 四、匿名对象的使用 &#x1f347;简单场景的使用 &#x1f349;复杂场景的使用 五、总结 六、共勉 一、前言 在C中&#xff0c;匿名对象&#xff08;Ano…

如何提高日语听力?日语学习日语培训柯桥小语种学校

每次一说起练日语听力&#xff0c;总离不开一个词&#xff0c;那就是“磨耳朵”。 可是&#xff0c;“磨耳朵”真的有用吗&#xff1f; 在讨论这个问题之前&#xff0c;我们需要先知道&#xff1a;什么是“磨耳朵”&#xff1f; 所谓的“磨耳朵”&#xff0c;其实就是让我们的耳…

C语言(操作符)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

【JUC】并发编程 AQS,ReentryLock,CyclicBarrier,CountDownLatch 原理总结

AQS AQS是什么&#xff1f;重写AQS就能实现锁的效果&#xff1f; AQS是一个抽象类&#xff0c;是一个并发包的基础组件&#xff0c;用来实现各种锁&#xff0c;同步组件的工具&#xff08;通过volatile cas进行实现&#xff09;。它包含了共享成员变量state、等待队列、条件…

6层板学习笔记1

说明:笔记基于6层全志H3消费电子0.65MM间距BGA 目的:掌握各类接口的布局思路和布线,掌握DDR高速存储设计 1、网表的导入是原理图的元件电气连接关系,位号,封装,名称等参数信息的总和 2、原理图文件包含(历史版本记录,功能总框图,电源树,GPIO分配,DDR功能,CPU,US…

【跨境商家必读】TikTok Shop商城运营全指南

随着社交媒体和电子商务之间界限的日益模糊&#xff0c;一种全新的购物平台——TikTok商城&#xff0c;正在迅速成为全球跨境商家们关注的焦点。在这个竞争激烈的TikTok跨境电商领域中&#xff0c;了解如何有效利用TikTok Shop的各项功能&#xff0c;理解其独特的运营模式&…

OpenAI 高管:一年后,你会觉得现在的 ChatGPT 像笑话一样糟糕|TodayAI

OpenAI 的首席运营官 Brad Lightcap 表示&#xff0c;一年后&#xff0c;你会觉得现在的 ChatGPT 像笑话一样糟糕。未来的 ChatGPT 版本将会有重大升级。他还讨论了 AI 取代人类工作和对电网的压力的可能性。 虽然我们不知道 OpenAI 何时会推出 GPT-5&#xff0c;但公司高管已…