基于Jenkins Pipeline自动化部署
微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 老司机倾囊相授,带你一路进阶,来不及解释了快上车!
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么优秀,那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并且实现多分支构建,还实现了所有项目共享一个Pipeline脚本。
使用Jenkins前的一些设置
为了快速搭建Jenkins,我这里使用Docker安装运行Jenkins:
$ sudo docker run -it -d \ --rm \ -u root \ -p 8080:8080 \ -v jenkins-data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$HOME":/home \ --name jenkins jenkinsci/blueocean
初次使用jenkins,进入Jenkins页面前,需要密码验证,我们需要进入docker容器查看密码:
$ sudo docker exec -it jenkins /bin/bash $ vi /var/jenkins_home/secrets/initialAdminPassword
Docker安装的Jenkins稍微有那么一点缺陷,shell版本跟CenOS宿主机的版本不兼容,这时我们需要进入Jenkins容器手动设置shell:
$ sudo docker exec -it jenkins /bin/bash $ ln -sf /bin/bash /bin/sh
由于我们的Pipeline还需要在远程服务器执行任务,需要通过ssh连接,那么我们就需要在Jenkins里面生成ssh的公钥密钥:
$ sudo docker exec -it jenkins /bin/bash $ ssh-keygen -C "root@jenkins"
在远程节点的~/.ssh/authorized_keys中添加jenkins的公钥(id_rsa.pub)
还需要安装一些必要的插件:
- Pipeline Maven Integration
- SSH Pipeline Steps
安装完插件后,还需要去全局工具那里添加maven:
这里后面Jenkinsfile有用到。
mutiBranch多分支构建
由于我们的开发是基于多分支开发,每个开发环境都对应有一条分支,所以普通的Pipeline自动化构建并不能满足现有的开发部署需求,所以我们需要使用Jenkins的mutiBranch Pipeline。
首先当然是新建一个mutiBranch多分支构建job:
接着设置分支源,分支源就是你项目的git地址,选择Jenkinsfile在项目的路径
接下来Jenkins会在分支源中扫描每个分支下的Jenkinsfile,如果该分支下有Jenkinsfile,那么就会创建一个分支Job
该job下的分支job如下:
这里需要注意的是,只有需要部署的分支,才加上Jenkinsfile,不然Jenkins会将其余分支也创建一个分支job。
通用化Pipeline脚本
到这里之前,基本就可以基于Pipeline脚本自动化部署了,但如果你是一个追求极致,不甘于平庸的程序员,你一定会想,随着项目的增多,Pipeline脚本不断增多,这会造成越来越大的维护成本,随着业务的增长,难免会在脚本中修改东西,这就会牵扯太多Pipeline脚本了,而且这些脚本基本都相同,那么对于我这么优秀的程序员,怎么会想不到这个问题呢,我第一时间就想到通用化pipeline脚本。所幸,Jenkins已经看出了我不断骚动的心了,Jenkins甩手就给我一个Shared Libraries。
Shared Libraries是什么呢?顾名思义,它就是一个共享库,它的主要作用是用于将通用的Pipeline脚本放在一个地方,其它项目可以从它那里获取到一个全局通用化的Pipeline脚本,项目之间通过不通的变量参数传递,达到通用化的目的。
接下来我们先创建一个用于存储通用Pipeline脚本的git仓库:
仓库目录不是随便乱添加了,Jenkins有一个严格的规范,下面是官方说明:
官方已经讲得很清楚了,大概意思就是vars目录用于存储通用Pipeline脚本,resources用于存储非Groovy文件。所以我这里就把Pipeline需要的构建脚本以及编排文件都集中放在这里,完全对业务工程师隐蔽,这样做的目的就是为了避免业务工程师不懂瞎几把乱改,导致出bug。
创建完git仓库后,我们还需要在jenkins的Manage Jenkins » Configure System » Global Pipeline Libraries
中定义全局库:
这里的name,可以在jenkinsfile中通过以下命令引用:
@Library 'objcoding-pipeline-library'
下面我们来看通用Pipeline脚本的编写规则:
#!groovy def getServer() { def remote = [:] remote.name = 'manager node' remote.user = 'dev' remote.host = "${REMOTE_HOST}" remote.port = 22 remote.identityFile = '/root/.ssh/id_rsa' remote.allowAnyHosts = true return remote } def call(Map map) { pipeline { agent any environment { REMOTE_HOST = "${map.REMOTE_HOST}" REPO_URL = "${map.REPO_URL}" BRANCH_NAME = "${map.BRANCH_NAME}" STACK_NAME = "${map.STACK_NAME}" COMPOSE_FILE_NAME = "docker-compose-" + "${map.STACK_NAME}" + "-" + "${map.BRANCH_NAME}" + ".yml" } stages { stage('获取代码') { steps { git([url: "${REPO_URL}", branch: "${BRANCH_NAME}"]) } } stage('编译代码') { steps { withMaven(maven: 'maven 3.6') { sh "mvn -U -am clean package -DskipTests" } } } stage('构建镜像') { steps { sh "wget -O build.sh https://git.x-vipay.com/docker/jenkins-pipeline-library/raw/master/resources/shell/build.sh" sh "sh build.sh ${BRANCH_NAME} " } } stage('init-server') { steps { script { server = getServer() } } } stage('执行发版') { steps { writeFile file: 'deploy.sh', text: "wget -O ${COMPOSE_FILE_NAME} " + " https://git.x-vipay.com/docker/jenkins-pipeline-library/raw/master/resources/docker-compose/${COMPOSE_FILE_NAME} \n" + "sudo docker stack deploy -c ${COMPOSE_FILE_NAME} ${STACK_NAME}" sshScript remote: server, script: "deploy.sh" } } } } }
- 由于我们需要在远程服务器执行任务,所以定义一个远程服务器的信息其中
remote.identityFile
就是我们上面在容器生成的密钥的地址; - 定义一个call()方法,这个方法用于在各个项目的Jenkinsfile中调用,注意一定得叫call;
- 在call()方法中定义一个pipeline;
- environment参数即是可变通用参数,通过传递参数Map来给定值,该Map是从各个项目中定义的传参;
- 接下来就是一顿步骤操作啦,“编译代码”这步骤需要填写上面我们在全局工具类设置的maven,“构建镜像”的构建脚本巧妙地利用wget从本远程仓库中拉取下来,”执行发版“的编排文件也是这么做,“init-server”步骤主要是初始化一个server对象,供“执行发版使用”。
从脚本看出来Jenkins将来要推崇的一种思维:配置即代码。
写完通用Pipeline脚本后,接下来我们就需要在各个项目的需要自动化部署的分支的根目录下新建一个Jenkinsfile脚本了:
接下来我来解释一下Jenkinsfile内容:
#!groovy // 在多分支构建下,严格规定Jenkinsfile只存在可以发版的分支上 // 引用在jenkins已经全局定义好的library library 'objcoding-pipeline-library' def map = [:] // 远程管理节点地址(用于执行发版) map.put('REMOTE_HOST','xxx.xx.xx.xxx') // 项目gitlab代码地址 map.put('REPO_URL','https://github.com/objcoding/docker-jenkins-pipeline-sample.git') // 分支名称 map.put('BRANCH_NAME','master') // 服务栈名称 map.put('STACK_NAME','vipay') // 调用library中var目录下的build.groovy脚本 build(map)
- 通过
library 'objcoding-pipeline-library'
引用我们在Jenkins定义的全局库,定义一个map参数; - 接下来就是将项目具体的参数保存到map中,调用build()方法传递给通用Pipeline脚本。
Shared Libraries共享库极大地提升了Pipeline脚本的通用性,避免了脚本过多带来的问题,也符合了一个优秀程序员的审美观,如果你是一个有追求的程序员,你一定会爱上它。
流程图:
demo git 地址:
pipeline: https://github.com/objcoding/jenkins-pipeline-library
单项目部署: https://github.com/objcoding/docker-jenkins-pipeline-sample
多项目部署: https://github.com/objcoding/docker-jenkins-pipeline-sample2

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
细谈 vue - transition 篇
本篇文章是细谈 vue 系列的第三篇,这篇文章主要会介绍一下 vue 的内置组件 transition 。前几篇链接如下 《细谈 vue 核心- vdom 篇》 《细谈 vue - slot 篇》 开始之前,我们先看下官方对 transition 的定义 自动嗅探目标元素是否使用了 CSS 过渡或动画,如果使用,会在合适的时机添加/移除 CSS 过渡 class。 如果过渡组件设置了 JavaScript 钩子函数,这些钩子函数将在合适的时机调用。 如果没有检测到 CSS 过渡/动画,并且也没有设置 JavaScript 钩子函数,插入和/或删除 DOM 的操作会在下一帧中立即执行 一、抽象组件 在 vue 中,对于 options 有一条属性叫 abstract ,类型为 boolean ,他代表组件是否为抽象组件。但找寻了有关 options 的类型定义,却只找到这么一条 static options: Object; 但实际上,vue 还是有对 abstract 属性进行处理的,在 lifecycle.js 的 initLifecycle() 方法中有这么一段逻辑 let par...
- 下一篇
基于Selenium+Python的web自动化测试框架
一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并把录制的操作以多种语言(例如java、python等)的形式导出成测试用例。 Selenium WebDriver:提供Web自动化所需的API,主要用作浏览器控制、页面元素选择和调试。不同的浏览器需要不同的WebDriver。 Selenium Grid:提供了在不同机器的不同浏览器上运行selenium测试的能力。 本文将详细介绍如何运用Python结合Selenium WebDriver库搭建web自动化测试框架。 二、自动化测试框架 一个典型的自动化测试框架一般包括用例管理模块、自动化执行控制器、报表生成模块和log模块,这些模块相辅相成。 接下来介绍各模块的逻辑单元: 1、用例管理模块 用例管理模块包括新增、修改、删除等操作单元,这些单元又...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- 2048小游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7安装Docker,走上虚拟化容器引擎之路