【实战】采用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-jdk8container_name: jenkinsrestart: 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/ShanghaiLANG: en_US.UTF-8JAVA_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: rootports:- "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个数是3selector:   # 通过标签选择被控制的podmatchLabels:app: k8s-demotemplate:   # 在template中定义podmetadata:labels: # 给pod打上标签app=k8s-demoapp: k8s-demospec:containers:- name: k8s-demo  # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中image: k8s-demo-imageports:- name: httpcontainerPort: 8888
--- # 在一个yaml文件中通过---分割多个资源对象
apiVersion: v1
kind: Service # 声明一个Service资源对象
metadata:name: service-k8s-demo
spec:type: NodePortselector: # service-k8s-demo将选择标签包含app=k8s-demo的podapp: k8s-demoports:- name: httpport: 8888  # Service监听端口targetPort: 8888 # 转发到后端Pod的端口号protocol: TCP # tcp协议nodePort: 30888 # 外网访问端口,范围:30000-32767

添加Jenkinsfile

pipeline{agent anyenvironment {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.yamlkubectl 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.rhkb.cn/news/324934.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Threejs 动态修改InstanceMesh实例化几何体中单个实例的颜色

目录 InstanceMesh多实例 场景 思路 注意点 实现 效果 InstanceMesh多实例 instanceMesh 是使用InstancedMesh类来创建实例化的几何体。它适用于当需要大量重复的几何体时&#xff0c;但是每个实例之间有不同的变换属性&#xff08;如位置、旋转、缩放等&#xff09; 场…

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用&#xff0c;然后启动应用&#xff0c;注意启动docker引擎 打开右上角的设置&#xff0c;进入Docker Engine设…

【系统分析师】软件架构设计

文章目录 1、构件与软件复用1.1 主流构件标准1.2 构件获取与管理1.3 构件复用的方法 2、软件架构概述3、软件架构建模4、软件架构风格4.1 经典架构风格4.2 层次架构风格4.3 富互联网应用-RIA 5、面向服务的架构5.1 SOA概述5.2 SOA的关键技术5.3 SOA的实现方法 6、软件架构评估6…

Golang | Leetcode Golang题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; func deleteDuplicates(head *ListNode) *ListNode {if head nil {return nil}cur : headfor cur.Next ! nil {if cur.Val cur.Next.Val {cur.Next cur.Next.Next} else {cur cur.Next}}return head }

前端开发工程师——ajax

express框架 终端输入 npm init --yes npm i express 请求报文/响应报文 // 1.引入express const express require(express);// 2.创建应用对象 const app express();// 3.创建路由规则 // request:是对请求报文的封装 // response&#xff1a;是对响应报文的封装 app.get(…

【数据结构】浅谈

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 一、概念&#xff1a; 二、物理结构&#xff1a; 1、顺序存储结构&#xff1a; 2、链式存储结构&#xff1a; 3、数据索引存储结构: 4、数据散列存储结构&#xf…

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M&#xff0c;GitHub 是会被限制推送到仓库中的&#xff0c;大概率情况会显示下面的错误&#xff1a; remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b re…

声明变量的六种方法

ES6 声明变量的六种方法 varfunctionletconstclassimport 顶层对象的属性 1. ES6 声明变量的六种方法 ES5 只有两种声明变量的方法&#xff1a; var 命令和 function 命令。 ES6 除了添加 let 和 const 命令&#xff0c;还有另外两种声明变量的方法&#xff1a; import 命令和…

笨方法自学python(二)-注释

注释和#号 程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时&#xff0c;你还可以用注解的方式将这段代码临时禁用。 # A comment, this is so you can read your program later. # Anything after the # is ignored by py…

Python专题:八、列表(1)

Python的内置数据类型 数据类型&#xff1a;列表 list类型 可以是字符串&#xff0c;浮点数&#xff0c;整数&#xff0c;列表 列表特性 ①集合性的数据类型 ②列表是有序的 ③列表是可更新的 访问列表元素的方式也是[索引]&#xff0c;也是从0开始的&#xff0c;不能超过…

【前端】桌面版docker并部署前端项目

环境 win10专业版 2004 , 需科学 官网下载安装包并安装4.29.0版本 终端输入 wsl --installdocker桌面版和模拟器只能选一个&#xff0c;不然一直转圈圈 镜像配置加速&#xff0c;在settings—>docker engine下 {"builder": {"gc": {"defaultKee…

二叉树介绍

引入 定义 区别 定义不同 形态不同 基本形态

自动驾驶中的神经辐射场:综述

24年4月清华大学论文“Neural Radiance Field in Autonomous Driving: A Survey”。 神经辐射场&#xff08;NeRF&#xff09;由于其固有的优势&#xff0c;特别是其隐式表示和新视图合成能力&#xff0c;引起了学术界和工业界的广泛关注。 随着深度学习的快速发展&#xff0c…

攻防世界-web-unseping

题目 知识点 PHP代码审计PHP序列化和反序列化PHP中魔术方法命令执行绕过方式 解读源码 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function …

视频资源汇聚平台常见的几种接入方式

视频资源汇聚平台 视频汇聚平台可以实现海量资源的接入、汇聚、存储、处理、分析、运维等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP、ONVIF、RTMP、FLV、WEBSOCKET等&#xff0c;以及厂家私有协议与SDK接…

网络安全的未来:挑战、策略与创新

引言&#xff1a; 在数字化时代&#xff0c;网络安全已成为个人和企业不可忽视的议题。随着网络攻击的日益频繁和复杂化&#xff0c;如何有效保护数据和隐私成为了一个全球性的挑战。 一、网络安全的现状与挑战 网络安全面临的挑战多种多样&#xff0c;包括但不限于恶意软件、…

第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…

【Linux:lesson1】的基本指令

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;打开Xshell&#xff0c;登陆root…

ASP.NET WebApi 如何使用 OAuth2.0 认证

前言 OAuth 2.0 是一种开放标准的授权框架&#xff0c;用于授权第三方应用程序访问受保护资源的流程。 OAuth 2.0 认证是指在这个框架下进行的身份验证和授权过程。 在 OAuth 2.0 认证中&#xff0c;涉及以下主要参与方&#xff1a; 资源所有者&#xff08;Resource Owner&…

springboot 引入第三方bean

如何进行第三方bean的定义 参数进行自动装配