背景
众所周知,在实现CICD过程中,jenkins在其强大工具集之中,独占一席,使用的企业非常普遍,自由风格结合各种插件可以实现任意项目的集成部署,但当企业项目达到一定规模之后,会发现传统风格的自动集成已不能满足敏捷开发的速度、以及运维同学的效率,所以更适用于编码人员使用的pipeline应运而生,以一种编码方式实现项目的CICD,从而实现更高效率的集成部署

使用前提

版本:jenkins 2.326+

插件搜索pipeline,安装会默认将相关依赖插件全部安装,后续使用过程中在安装需要的即可,参考下图

用jenkins的pipeline部署git jenkins之pipeline_jenkins

pipeline使用方式

新建pipeline任务–>参考下图

用jenkins的pipeline部署git jenkins之pipeline_jenkins_02


用jenkins的pipeline部署git jenkins之pipeline_自定义_03

  • 此处提供两种方式,直接写脚本的方式和从代码仓库拉去的方式,在初次使用时,可以使用写脚本方式更快的实现自己的第一个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

用jenkins的pipeline部署git jenkins之pipeline_devops_04


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仓库
  • 用jenkins的pipeline部署git jenkins之pipeline_自定义_05

  • sharelib项目目录结构如下
  • src 存放源码文件,如公共类,类方法等
  • vars 存放全局变量,如工具类,变量等
  • resources 存放模板文件

异常记录

  1. 读取环境变量时不能使用单引号,应该使用双引号,groovy语法中单引号表示声明字符串
  2. 获取构建人信息插件使用记录,需插件: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

用jenkins的pipeline部署git jenkins之pipeline_devops_06

#!groovy
pipeline {
    agent any
    stages {
        stage('test') {
            
           steps {
               sh 'echo ${BUILD_USER}'
            }
        }  
    }
}

*未完待续~~~~~~~~~~~~~*