背景
众所周知,在实现CICD过程中,jenkins在其强大工具集之中,独占一席,使用的企业非常普遍,自由风格结合各种插件可以实现任意项目的集成部署,但当企业项目达到一定规模之后,会发现传统风格的自动集成已不能满足敏捷开发的速度、以及运维同学的效率,所以更适用于编码人员使用的pipeline应运而生,以一种编码方式实现项目的CICD,从而实现更高效率的集成部署
使用前提
版本:jenkins 2.326+
插件搜索pipeline,安装会默认将相关依赖插件全部安装,后续使用过程中在安装需要的即可,参考下图
pipeline使用方式
新建pipeline任务–>参考下图
- 此处提供两种方式,直接写脚本的方式和从代码仓库拉去的方式,在初次使用时,可以使用写脚本方式更快的实现自己的第一个pipeline
- 根据提示自动生成一个hellword脚本如下:
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
声明式
脚本式
脚本语法参考中文官方文档
声明式+脚本式(推荐)
参考示例:
#!groovy
// 高级特性(非必须),可以定义一些公共的类库,以供不同的job使用,比如发送邮件、发送报警等
@Library('my-jenkins-lib@master') _
def alert= new org.myshare.alert(this)
//声明式语法
pipeline {
agent any //指定部署机器,可以选择不同的节点,any之所有节点
options {
timestamps() //日志中打印时间,需要安装插件:Timestamper
timeout(time:1,unit:'HOURS') // 任务构建超时时间
}
environment { //设置自定义的环境变量
product_name='****'
branch="${branch_name}"
target_dir="/data/apps/${product_name}"
tar_name="*********.${branch}.tar.gz" //项目打包的文件
target_host="${host}" //部署的目标机器
bin_name = "***********" //可执行文件名称
}
//构建阶段语法
stages {
stage('clone-code') {
//下载代码语法,可通过jenkins提供的“流水线语法”自动生成即可
steps {
checkout([$class: 'GitSCM',
branches: [[name: '*/master']], //代码分支,可以通过git参数传入
extensions: [],
userRemoteConfigs: [[
credentialsId: '****************', //配置凭证的id
url: 'git@newgit.*********************.git' //仓库地址
]]])
echo 'checkout to $branch'
sh 'git checkout $branch'
sh 'git pull origin $branch'
script{
tools.printMes("clone success " , "info") // 通过自定义的全局方法,打印带颜色的log,需插件:ansiColor
}
}
}
stage('build') {
//项目安装阶段,通常打成一个压缩包放在指定目录
steps {
//项目打包脚本,可自定义
sh 'sudo sh $PWD/build.sh $PWD 1 $branch $PWD/version '
sh 'ls $PWD'
script{
tools.printMes("build success " , "info")
}
}
}
stage('deploy') {
// 项目部署阶段,发送到服务,解压,并启动,此处可以结合ansible,salt等工具,或者公司允许情况下用户名和密码,也可使用agentssh插件推送应用包
steps {
sh 'sudo scp -i ~/.ssh/***_ras -r $PWD/$tar_name root@${target_host}:${target_dir} '
sshagent (credentials: ['es-key']) { //需安装插件 : sshagent,进行远端服务器交互
sh 'ssh -o StrictHostKeyChecking=no -l root ${target_host} tar -zxvf $target_dir/$tar_name -C ${target_dir}'
sh 'ssh -o StrictHostKeyChecking=no -l root ${target_host} sh $target_dir/restart.sh restart ${bin_name} ${target_dir} '
}
script{
tools.printMes("deploy success " , "info")
}
}
}
}
//构建后的执行
post {
always {
script{
tools.printMes("pipeline end... " , "info")
}
}
success {
script {
alert.alert("success")
tools.printMes("build failer " , "info")
}
}
failure {
script{
alert.alert("failer")
tools.printMes("build failer " , "error")
}
}
}
}
构建效果如下:需插件(pipeline step)
BlueOcean:使用React实现的一套UI界面,可自行安装插件(非必须)
Jenkinsfile最佳实践理解
- 在job中直接写入脚本命令(不推荐)(pipeline script)
- 在代码仓库中加入jenkinsfile (pipeline script from scm)
1、新建项目单独存放每个项目的jenkinsfile,统一管理
2、在每个项目里面根目录,创建对应项目的jenkinsfile文件(推荐),类似Dockfile文件
ShareLibrary使用(需了解groovy语言)
//引用语法
@Library('my-jenkins-lib@master') _
def alert= new org.myshare.alert(this)
//使用方法
alert.alert("failer")
tools.printMes("deploy success " , "info")
- 类似java中maven特性,golang中mod特性,依赖自定义或者第三方的库,实现代码的复用
- 配置参考 Configure System—>Global Pipeline Libraries ,如下
- 配置自己的lib仓库
- sharelib项目目录结构如下
- src 存放源码文件,如公共类,类方法等
- vars 存放全局变量,如工具类,变量等
- resources 存放模板文件
异常记录
- 读取环境变量时不能使用单引号,应该使用双引号,groovy语法中单引号表示声明字符串
- 获取构建人信息插件使用记录,需插件:build user vars plugin,语法如下
wrap([$class: 'BuildUser']) {
script {
BUILD_USER_ID = "${env.BUILD_USER_ID}"
BUILD_USER = "${env.BUILD_USER}"
BUILD_USER_EMAIL = "${env.BUILD_USER_EMAIL}"
}
}
通过全局配置,达到任何地方都可用,开启后,可在任意脚本使用变量,Configure System --> Build User Variables,使用构建人示例demo
#!groovy
pipeline {
agent any
stages {
stage('test') {
steps {
sh 'echo ${BUILD_USER}'
}
}
}
}
*未完待续~~~~~~~~~~~~~*