热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

K8S结合Jenkins实现持续集成的动态配置详情分享

前言:Kubernetes,简称K8s,相信大家都不会陌生。这是一个开源的,用于管理云平台中多个主机上的容器化的应用。Jenkins,是一个开源软件项目,是基于Java开发的一种持

前言:

Kubernetes,简称K8s,相信大家都不会陌生。这是一个开源的,用于管理云平台中多个主机上的容器化的应用。

Jenkins,是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。

在程序员日常的开发当中,使用着各种不同的编程语言,流程中少不了开发、测试、打包、发布等等的步骤,这其中的部分环节,是重复且必须的工作。所以慢慢地引入了持续集成的概念,从而减轻开发人员,运维人员的操作和时间成本,更好地服务好我们的程序猿(嗷嗷嗷 ~ 程序员太苦啦,是时候来点甜啦~)。

接下来让我来给大家分享一下,如何结合K8S和Jenkins可以实现快速地实现以上的一些重复性且必要的工作,让我们的攻城狮更好地专注在开发工作当中!

前置环境条件:

1、已经有部署好的K8S集群环境;

2、已经在K8S环境中已经部署好Jenkins应用;

3、代码仓库(如gitlab、GitHub等)已经通过webhook等方式,和Jenkins能进行通讯;

4、jenkins添加好代码仓库对应的流水线作业。

 

1、登录到Jenkins UI进行模版配置

 

登录到Jenkins – 左菜单(系统设置) – 节点管理 – Configure Clouds,进行模版的配置

 

1.1 编辑Kubernetes模版

 

第一页详细配置如上图,基本都是用默认值即可,有几个地方需要根据实际的集群信息进行填写就可以啦,挺简单的!!

 

1.2 编辑pod模版

2-1和2-2是pod模版的名称和模版标签

 

第二页详细配置如上图,按照上图说明即可。俗话说,工欲善其事,必先利其器,至此,jenkins的模版关键配置已经完成啦,接下来就是使用这些模版的时候啦,请继续往下阅读!!

 

2、可持续集成配置

2.1 Jenkinsfile使用详解

这里的lable是 上面的标签设置的值

//模板需要修改的值:label(配置的jenkins的slave标签),cloud:(配置的jenkins的cloud)
//定义变量
def label = "jenkins-slave-js"
//设置pod模版的信息,label是模版标签,cloud是第一步设置的jenkins模版名
//以下操作都是在打包容器里面进行,内容可以高度自定义,贴合不同的需求
podTemplate(label: label , cloud: 'kubernetes') {
node(label) {
//拉取仓库代码
def myRepo = checkout scm
def gitBranch = myRepo.GIT_BRANCH.replaceAll("origin/","").replaceAll("/","-").replaceAll("\\.","-")
def timestamp = sh(script: "echo `date '+%Y%m%d%H%M%S'`", returnStdout: true).trim()
def gitCommit = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()
gitCommit = "${gitCommit}_${timestamp}"
//镜像标签,这里使用git分支名作为镜像的tag
def imageTag = "${gitBranch}"
//镜像仓库基础地址
def dockerRegistryUrl = "http://xxxxx"
//应用服务名称,统一用于以下各个变量名称
def appName = "testAbc"
//模板需要更改的值 开始
//helm工具发布时,使用的名称,这里使用【应用名-分支名】的格式
def helmReleaseName = "${appName}-${gitBranch}"
//部署应用服务的命名空间
def namespace = "${appName}"
//镜像的中间名称,用于平均基础镜像地址
def imageEndpoint = "${appName}/webapi"
//模板需要更改的值 结束
//完整镜像地址(不包含镜像tag)
def image = "${dockerRegistryUrl}/${imageEndpoint}"
//helmChart模版的仓库名称
def chartName = "${appName}"
//helmChart的版本
def chartVersion = "1.0"
//helmChart完整名称
def chartDirName = "${appName}/${appName}"
//K8S的网络模式,一般有Cluster(不对外访问)、NodePort(释放端口对外访问)
def serviceType = "ClusterIP"
//如果serviceType值是NodePort,这里可以设置指定供对外访问的端口号,不指定则随机,范围详见K8S的NodePort范围,默认是30000-32767
def serviceNodePort = ""
//是否使用外部K8S存储,是则设置true,否则设置false
def createPvc = true
//如果设置了使用外部存储,则这里需要填写k8s的PVC资源的名称,以便以发布的应用服务能绑定此外部存储
def pvcName = "${gitBranch}-${appName}-configs-pvc"
//设置外部存储对应应用服务容器里面的路径
def pvcMountPath = "/var/www/${appName}/storage"
//定义不同阶段,可以方便清晰地在jenkins UI上看到每个阶段的耗时
stage('单元测试阶段') {
script{
}
}
stage('项目编译阶段') {
//此处使用container指定第二步配置的容器名称,就可以使用该容器环境的命令进行操作,如下面命令是前端node编译代码
container("node"){
sh "npm build ./main"
sh "npm run serve"
}
}
stage('构建 Docker 镜像阶段') {
container('构建 Docker 镜像') {
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'docker-harbor',
usernameVariable: 'DOCKER_HUB_USER',
passwordVariable: 'DOCKER_HUB_PASSWORD']]) {
//此处是引入了docker环境,进行docker的打包,推送到远程仓库等操作
container('docker') {
sh """
docker login ${dockerRegistryUrl} -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD}
docker build -t ${imageEndpoint}:${imageTag} .
docker tag ${imageEndpoint}:${imageTag} ${dockerRegistryUrl}/${imageEndpoint}:${imageTag}
docker push ${image}:${imageTag}
"""
}
}
}
}
//K8S使用了helm发布工具进行应用服务的发布
stage('Helm 部署阶段') {
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'docker-harbor',
usernameVariable: 'DOCKER_HUB_USER',
passwordVariable: 'DOCKER_HUB_PASSWORD']]) {
container('helm') {
// 这里也可以做一些其他的分支判断是否要直接部署
echo "[INFO] 开始 Helm 部署"
echo "1 初始化helm client"
sh "helm init --client-only --stable-repo-url https://mirror.azure.cn/kubernetes/charts/"
//添加打包容器里面的本地helm仓库
sh "helm repo add --username ${DOCKER_HUB_USER} --password ${DOCKER_HUB_PASSWORD} ${chartName} http://${dockerRegistryUrl}/chartrepo/${chartName}"
echo "2 如果更新了chart包则需要更新repo仓库"
sh "helm repo update"
echo "3 更新 ${helmReleaseName} 应用服务"
sh """
helm upgrade --install ${helmReleaseName} ${chartDirName} \
--version ${chartVersion} \
--set namespace=${namespace} \
--set gitCommit=${gitCommit} \
--set gitBranch=${gitBranch} \
--set productionDeployment.image.repository=${image} \
--set canaryDeployment.image.repository=${image} \
--set productionDeployment.image.tag=${imageTag} \
--set canaryDeployment.image.tag=master \
--set createPvc=${createPvc} \
--set pvcName=${pvcName} \
--set pvcMountPath=${pvcMountPath} \
--set service.type=${serviceType} \
--set service.nodePort=${serviceNodePort} \
--namespace=${namespace}
"""
echo "[INFO] Helm 部署应用成功..."
}
}
}
}
}

 

至此,我们已经完成配置好jenkins模版和jenkinsfile完整的一套可持续集成系统的工作,我们后续开发时,只需要合并好代码,触发webhook流水线,通知jenkins进行打包、发布、部署的操作即可,实现真正解放我们的双手啦!!!哈哈哈!!!


原文链接:https://www.cnblogs.com/eflypro/p/14985337.html



推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了程序员最美的情人节礼物,即使用JS渲染的3D玫瑰,通过在QQ空间和人人网上分享这个特殊的礼物,可以给情人带来惊喜和喜悦。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
author-avatar
谢超4444
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有