关于jenkins:自动化集成Pipeline流水语法详解

21次阅读

共计 4014 个字符,预计需要花费 11 分钟才能阅读完成。

前言:该系列文章,围绕继续集成:Jenkins+Docker+K8S 相干组件,实现自动化治理源码编译、打包、镜像构建、部署等操作;本篇文章次要形容 Pipeline 流水线用法

一、Webhook 原理

Pipeline 流水线工作通常状况下都是主动触发的,在 Git 仓库中配置源码改变后告诉的地址即可。

例如在 Gitee 仓库中,基于 WebHook 的配置,能够在向仓库 push 代码后,主动回调事后设定的申请地址,从而触发代码更新后的打包动作,根本流程如下:

这里波及到两个外围配置:

  • Gitee 回调:即仓库接管到 push 申请后的告诉地址;在仓库治理的 WebHooks 选项中;
  • Jenkins 流程:编写流水线工作,解决代码提交后的自动化流程;这里须要 Jenkins 地址能够在外网拜访,网上的组件很多,自行抉择搭建即可;

留神:能够先随便设置回调地址,在申请日志中间接拷贝申请参数,在 postman 中去触发 Jenkins 工作,这样在测试时会不便很多。

这里联合 Gitee 的帮忙文档,去剖析不同 push 动作的参数标识,能够判断分支的创立、推送、删除等操作,例如:

"after": "1c50471k92owjuh37dsadfs76ae06b79b6b66c57",
"before": "0000000000000000000000000000000000000000",

创立分支:before 字符都是 0;删除分支:after 字符都是 0;

二、流水线配置

1、插件装置

在 Jenkins 插件治理中,装置 Generic-Webhook-Trigger 插件,流水线 pipeline 相干组件在 Jenkins 初始化的时候曾经装置了。

2、创立流水线

新建 Item,输出工作名称,抉择 pipeline 选项即可:

抉择 Webhook 选项,页面提醒了触发的形式。

3、触发流水线

http:// 用户名: 明码 @JENKINS_URL/generic-webhook-trigger/invoke

基于如上形式通过认证,触发流水线执行,会生成工作日志,即流程是通顺的。

三、Pipeline 语法

1、构造语法

  • triggers:基于 hook 模式触发流水线工作;
  • environment:申明全局通用的环境变量;
  • stages:定义工作步骤,即流程分段解决;
  • post.always:最终执行的动作;

惯例流程中的整体构造如下:

pipeline {
    agent any
    triggers {}
    environment {}
    stages {}
    post {always {}}
}

把各个节点下的脚本配置进去,就会生成一个自动化的流水线工作。留神这里 不勾选 应用 Groovy 沙盒 选项。

2、参数解析

这里说的参数解析是指,Gitee 通过 hook 机制申请 Jenkins 服务携带的参数,这里次要解析 post 参数即可,解析形式看阐明:

这里从 hook 回调的参数当选了几个流程中应用的参数,上面看具体解析形式,在上图中点击新增:

{
    "ref":"refs/heads/master",
    "repository":{
        "name":"butte-auto-parent",
        "git_http_url":"仓库地址 -URL"
    },
    "head_commit":{
        "committer":{"user_name":"提交人名称",}
    },
    "before":"277bf91ba85996da6c",
    "after":"178d56ae06b79b6b66c"
}

把上述参数顺次做好配置即可,这样在工作流中就能够应用这些参数。

3、触发器节点

这里即 triggers 模块配置,核心作用是加载触发流程的一些参数,后续在脚本中应用,其余相干配置按需抉择即可,留神这里的参数须要在上个步骤中配置:

triggers {
    GenericTrigger(
        genericVariables: [[key: 'ref', value: '$.ref'],
            [key: 'repository_name', value: '$.repository.name'],
            [key: 'repository_git_url', value: '$.repository.git_http_url'],
            [key: 'committer_name', value: '$.head_commit.committer.user_name'],
            [key: 'before', value: '$.before'],
            [key: 'after', value: '$.after']
        ],
        // causeString: 'Triggered on $ref' ,
        // printContributedVariables: true,
        // 打印申请参数
        // printPostContent: true
    )
}

4、环境变量

申明一些全局的环境变量,也能够间接定义,在流程中用 ${变量} 的形式援用:

environment {branch = env.ref.split("/")[2].trim()
    is_master_branch = "master".equals(branch)
    is_create_branch = env.before.replace('0','').trim().equals("")
    is_delete_branch = env.after.replace('0','').trim().equals("")
    is_success = false
}

这里依据 hook 申请参数,解析出分支的操作类型:是否创立、是否删除、是否骨干分支,以及定义一个 is_success 流程是否胜利的标识。

5、分段流程

这里次要分为五个步骤:解析数据、拉取分支、解决 Pom 文件、分支推送、我的项目打包;

stages {
    // 解析仓库信息
    stage('Parse') {
        
        steps {echo "仓库分支 : ${branch} \n 仓库名称 : ${repository_name} \n 仓库地址 : ${repository_git_url} \n 提交用户 : ${committer_name}"
            script {if ("true".equals(is_master_branch)) {echo "爱护分支 : ${branch}"
                }
                if ("true".equals(is_create_branch)) {echo "创立分支 : ${branch}"
                }
                if ("true".equals(is_delete_branch)) {echo "删除分支 : ${branch}"
                }
            }
        }
    }
        
    // 拉取仓库分支
    stage('GitPull') {
        steps {
            script {if ("false".equals(is_delete_branch)) {echo "拉取分支 : ${branch}"
                    git branch: "${branch}",url: "${repository_git_url}"
                }
            }
        }
    }
        
    // 解析仓库 Pom 文件
    stage('MvnPom') {
        steps {
            script {
                // 解析 Pom 文件内容
                def pom = readMavenPom file: 'pom.xml'
                def version = "${pom.version}"
                def encode = pom.getProperties().get("project.build.sourceEncoding")
                echo "Pom 版本 :"+ version
                echo "Pom 编码 :"+ encode
                def devVersion = "${branch}-"+version
                def jarName = "${branch}-"+version+".jar"
                echo "Now 版本 :"+ devVersion
                echo "Jar 名称 :"+ jarName
                
                // 批改 Pom 文件内容
                // pom.getProperties().put("dev.version","${devVersion}".trim().toString())
                // writeMavenPom file: 'pom.xml', model: pom
                
                echo "update pom success"
            }
        }
    }
        
    // 推送仓库分支
    stage('GitPush') {
        steps {
            script {echo "git push success"}
        }
    }
        
    // 本地打包流程
    stage('Package') {
        steps {
            script {
                sh 'mvn clean package -Dmaven.test.skip=true'
                is_success = true
            }
        }
    }
}
  • 解析数据:解析并输入局部参数信息;
  • 拉取分支:联合 Git 命令,拉取分支代码;
  • 解决 Pom 文件:对 pom 文件的读取和批改;
  • 分支推送:联合 Git 命令,推送分支代码;
  • 我的项目打包:联合 Mvn 命令,实现我的项目打包;

留神:这里在本地测试流程时,并没有推送代码;在我的项目打包实现后,联合 shell 脚本实现服务的启动公布。

6、音讯告诉

在流程的最初,辨认工作的执行标识is_success,告诉相干人员是否打包胜利,这里的告诉形式能够抉择邮件或者其余 API 推送的告诉类型,不过多形容:

post {
    always {
        script {echo "notify : ${committer_name} , pipeline is success : ${is_success}"
        }
    }
}

7、执行日志

实现下面 pipeline 流水线脚本开发后,通过 postman 工具一直发送申请,实现脚本调试:

这里也能够点击流程里的不同模块,查看该模块下的日志信息:

阐明:残缺的 pipeline 脚本内容放在开端的 Gitee 开源仓库中,有须要的自行获取。


同系列举荐

  • Jenkins 管理工具详解
  • 分布式服务部署公布
  • 微服务灰度公布原理
  • 服务自动化部署和治理
  • 微服务组件二次浅封装

四、源代码地址

GitEE·地址
https://gitee.com/cicadasmile/butte-auto-parent
Wiki·地址
https://gitee.com/cicadasmile/butte-java-note

正文完
 0