jenkins流水线之pipeline入门

目录

pipeline学习脑图

一、pipeline基本介绍

1、pipeline是什么

2、语法类型

二、语法说明

三、pipeline实际应用


pipeline学习脑图

jenkins流水线之pipeline入门_第1张图片


一、pipeline基本介绍

1、pipeline是什么

jenkins2.x开始流行pipeline(groovy语言编写)的写法,目的是通过以代码的方式来进行job的构建,减少人工操作导致的人为出错。它是用于描述整条流水线是如何进行,流水线的内容一般包括执行编译、打包、测试、部署及告警通知等步骤。

2、语法类型

pipeline有两种语法类型,分别是声明式pipeline和脚本式

2.1 声明式pipeline

pipeline {
    agent { docker 'maven:3.3.3' }
    stages {
        stage('build') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}

字段说明

agent : any任意可用的执行器,none:每个stage需指定相应的agent,、node(指定节点)、docker(指定容器)

stages:整个流水线的所有执行阶段,里面包含多个stage

stage:流水线中的某个阶段,如拉取代码,编译构建,部署等阶段

steps:代表阶段内需要执行的命令,如shell命令等

2.2 脚本式

node('docker') {
    checkout scm
    stage('Build') {
        docker.image('maven:3.3.3').inside {
            sh 'mvn --version'
        }
    }
}

字段说明

node:执行器节点,和agent类似

Stage:代表流水线中的某个阶段,如拉取代码,编译构建,部署等阶段

2.3 区别

声明式

脚本式

pipeline代码校验

会校验pipeline流水线语法是否正确

不校验

重启stage

pipeline某个stage执行失败后可通过修复错误后直接回到此stage步骤开始执行

不可以

option指令

可以和pipeline代码逻辑分开

和pipeline代码逻辑嵌套,可读性差

语法逻辑

在 script{} 标记里面

不限制

总结

官方推荐,语法简单,严谨

灵活,逻辑复杂


二、语法说明

以声明式为例,完整pipeline流水线,由以下5部分组成,缺一不可,否则jenkins会报错

  • pipeline: 代表整条流水线,包含整条流水线的逻辑。
  • agent
  • stages
  • stage
  • steps

除以上5个必要组成部分,还可以自定义选择以下选项

  • 字符串变量: def xxx=xxx,可在Pipeline中引用,$xxx
  • environment:配置环境变量,可用于step中,参考 localhost:8080 / pipeline-syntax / globals
  • options:允许执行pipeline内置的专用选项,也可以使用由插件提供的,如timeout,retry,timestamps等
# 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline。例如: 
options { timeout(time: 1, unit: 'HOURS') }

 # 失败后,重试整个Pipeline指定的次数。例如: 
options { retry(3) } 

# 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间。例如: 
options { timestamps() }
  • parameters:参数列表,如字符参数、布尔参数等
# 字符参数 
parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
  • trigger:定义了触发pipeline的方式(jenkins1.x中的pollscm定时构建)
  • tools:支持maven、jdk、gradle,需在jenkins全局配置中已经定义好
  • when:代码逻辑
  • script:流控制,如if/else
stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } }
  • post:有always,unstable,success,failure,和 changed等多种情况,常用于构建完成或失败时的通知告警(如email/wx/dingding等)
post {
     always{
            script{
                    sh  """ 
                  echo "This is test."

                    """
                }
     }
     success {

     }
     failure {
     }    
 } 

内置工具

部分脚本语法可以使用jenkins中的Pipeline Syntax来生成:localhost:80/pipeline-syntax/

如拉取代码操作,通过代码生成器,可以快速生成需要的pipeline代码段

jenkins流水线之pipeline入门_第2张图片

如生成git拉取代码

git credentialsId: 'xxx', url: '192.168.1.1/test.git'

三、pipeline实际应用

jenkins流水线之pipeline入门_第3张图片

 正常来说,一个CI流水线基本包含代码拉取、编译构建、代码测试及部署,以及部署成功/失败后的通知推送,用pipeline实现这一个流程:从代码库中拉取最新的代码,如果构建成功/失败,发送钉钉到指定群上。具体的配置如下:

def code_url = 'http://192.168.1.1/test.git'
def project = 'test'
def serverName = 'betatest'
def branch = 'beta'
def devDockerDaemon = "tcp://192.168.1.3:2375"
def dockerParam = "--name ${serverName} -p 80:80 --restart=always"
def registryUrl = 'hub.docker.com'
def newImage = "${registryUrl}/${project}/${serverName}:$BUILD_NUMBER"
def credentialsId = 'jenkins'

    pipeline {
        agent any
            stages {

                stage('代码更新') {
                  steps {
                    git branch: "$branch", credentialsId: "$credentialsId", url: "$code_url"

                }
                }
   
                stage('代码编译') {
                    steps {
                        sh """
                            /usr/local/maven3.5/bin/mvn clean compile
                            /usr/local/maven3.5/bin/mvn package
                            
                          """
                    }
                }

                stage('创建镜像') {
                    steps {
                        sh """
                            docker build -t $newImage -f Dockerfile-beta .
                        """
                    }
                }

                stage('推送镜像') {
                    steps {
                        sh """
                            docker push $newImage
                            docker rmi $newImage
                        """
                    }
                }

                stage('部署服务') {
                    steps {
                        sh """
                            docker -H ${devDockerDaemon} pull ${newImage}
                            docker -H ${devDockerDaemon} stop ${serverName} | true
                            docker -H ${devDockerDaemon} rm -f ${serverName} | true
                            docker -H ${devDockerDaemon} run -d ${dockerParam} ${newImage}
                        """
                    }
                }
            }

            post {
            success {
                 dingtalk (
                        robot: jenkins-dingding,
                        type: MARKDOWN,
                        title: ${project}更新成功,
                        text: [
                            ### ${JOB_NAME}发布更新 ,
                            ---,
                            1. 服务名:${project},
                            2. 分支:${branch} ,
                            3. 更新结果:成功 ,
                            4. [详情查看](${BUILD_URL}changes),
                
                        ],
                        at: [
                            111111111, //要@的人的手机
                        ]
                    )
                }
            failure {
                dingtalk (
                        robot: jenkins-dingding,
                        type: MARKDOWN,
                        title: ${project}更新失败,
                        text: [
                           ### ${JOB_NAME}发布更新 ,
                            ---,
                            1. 服务名:${project},
                            2. 分支:${branch} ,
                            3. 更新结果:失败 ,
                            4. [详情查看](${BUILD_URL}console),
                        ],
                        at: [
                            111111111, //要@的人的手机
                        ],
                        atAll: false,
                        )

                }    
            }
    }      
    
        }

该流水线分为三部分,第一部分是全局变量,通过dev 变量名,定义代码仓库地址、分支、镜像仓库、部署命令等;第二部分是流水线的执行部分(各stage),分别是拉取代码、编译、创建镜像、推送镜像及部署;第三部分是告警通知部分,可以通过微信、钉钉及邮件的方式,以上三部分组成了一个完整的CI流程(测试部分根据实际情况自行添加,这里就不作展现)。

需要的同学,可以参考这个实例进行修改,也可自己编写。

觉得有用就收藏吧~

你可能感兴趣的:(devops,docker,jenkins,运维)