Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?...

关注「WeiyiGeek

将我设为「特别关注」,每天带你玩转网络安全运维、应用开发、物联网IOT学习!

f8b46d6a1fd33efc465640ede6554844.png

 

1.Jenkins 如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?

描述: 通常每个项目代码库都会有不同的分支,(如果你没有用多分支流水线的情况下)对于普通的流水线项目我们可以让一条流水线来支持多个分支的发布,其实有时候你会发现每个分支的集成步骤都是差不多的,对于常规的我们可以安装使用git parameter插件,其次还需配置参数化构建过程。

方式1.手动动态拉取指定分支

  • 1.配置 GitHub 或者 Gitlab 项目 URL 地址, 并指定 GitLab Connection。

  • 2.配置 参数化构建过程 , 使用 Git 参数 输入变量名称【TagBranchName】,选择参数类型【分支或标签】以及设置默认值【origin/master】。

  • 3.执行 Build with Parameters 选择查看构建部署可用的Tag或Branch名称?

此时流水线代码可以这样写:

// # pipeline 片段
checkout([$class: 'GitSCM', branches: [[name: "origin/${params.TagBranchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${env.GITLAB_PUB}", url: "${env.GITLAB_URL}"]]])

Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?..._第1张图片

方式2.使用 GitLab Plugin 让代码提交自动触发拉取

  • 1.配置构建触发器, 此处启用Enabled GitLab triggers, 下拉到Build when a change is pushed to GitLab,获得 GitLab webhook URL,并点击高级获得 Secret Token, 注意需要安装【 GitLab Plugin 】插件以配置 GitLab 以向您的 Jenkins 实例(如 GitLab CI)发送 POST 请求。。

Build when a change is pushed to GitLab. GitLab webhook URL: http://jenkins.weiyigeek.top/project/HelloWorld
  • 2.通常企业内部代码仓库会采用Gitlab作为私有的代码仓库, 为了使项目可以自动触发我们需要针对指定项目设置Webhook, 打开方式->项目->设置->Webhook设置-> 填入 GitLab webhook URL 以及 配置的 Secret token。

  • 3.勾选【Tag push events】通常只是打Tag时触发。

此时流水线代码可以这样写:

// # pipeline 片段
// 判断是 gitlab 自动触发还是手动触发
if( env.gitlabSourceBranch != null ) {
  checkout([$class: 'GitSCM', branches: [[name: "origin/${env.gitlabSourceBranch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${env.GITLAB_PUB}", url: "${env.GITLAB_URL}"]]])
  updateGitlabCommitStatus name: '代码拉取', state: 'success'  
} else {
  checkout([$class: 'GitSCM', branches: [[name: "${params.PREJECT_BRANCHTAG}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${env.GITLAB_PUB}", url: "${env.GITLAB_URL}"]]])
  updateGitlabCommitStatus name: '代码拉取', state: 'success'  
}

Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?..._第2张图片

插件参考地址: https://plugins.jenkins.io/gitlab-plugin/

温馨提示: 在 groovy 中如果变量不存在其值为null而非字符串类型的null。

方式3.使用 Generic Webhook Trigger Plugin 让代码提交自动触发拉取
描述: 在 Github 或者 Gitlab 中的 webhook 触发到底给 Jenkins 发了什么, 以Gitlab为例我们从下述看到其发送的POST请求。

# Request headers:
Content-Type: application/json
X-Gitlab-Event: Tag Push Hook
X-Gitlab-Token: 11c503a496e0a573d278357836dd3e1c4f

# Request body:
{
  "object_kind": "tag_push",
  "event_name": "tag_push",            # 事件名称 Tag 触发
  "before": "0000000000000000000000000000000000000000",
  "after": "013f157ce81016be5bce9fda641633ba28141055",
  "ref": "refs/tags/Test_cet_v1.0.0",  # 分支名称
  "checkout_sha": "32a16de55f7d0c6bc6dcbb1b110db10016a2ba27",
  "message": "Test_cet_v1.0.0",        # 分支信息
  "user_id": 5,
  "user_name": "weiyigeek",
  "user_username": "project",
  "user_email": "",
  "user_avatar": "http://gitlab.weiyigeek.top/uploads/-/system/user/avatar/5/avatar.png",
  "project_id": 70,
  "project": {
    "id": 70,
    "name": "xxsbpt",
    "description": "信息上报管理端",
    "web_url": "http://gitlab.weiyigeek.top/project/xxsbpt",
    "avatar_url": null,
    "git_ssh_url": "ssh://[email protected]/project/xxsbpt.git",
    "git_http_url": "http://gitlab.weiyigeek.top/project/xxsbpt.git",
    "namespace": "weiyigeek",
    "visibility_level": 0,
    "path_with_namespace": "project/xxsbpt",
    "default_branch": "master",
    "ci_config_path": "",
    "homepage": "http://gitlab.weiyigeek.top/project/xxsbpt",
    "url": "ssh://[email protected]/project/xxsbpt.git",
    "ssh_url": "ssh://[email protected]/project/xxsbpt.git",
    "http_url": "http://gitlab.weiyigeek.top/project/xxsbpt.git"
  },
  "commits": [
    {
      "id": "32a16de55f7d0c6bc6dcbb1b110db10016a2ba27",
      "message": "xxsbpt cet",
      "title": "xxsbpt cet",
      "timestamp": "2022-05-18T09:34:39+08:00",
      "url": "http://gitlab.weiyigeek.top/project/xxsbpt/-/commit/32a16de55f7d0c6bc6dcbb1b110db10016a2ba27",
      "author": {
        "name": "weiyigeek",
        "email": "[email protected]"
      },
      "added": [],
      "modified": ["KsXxsbPt/pom.xml"],
      "removed": []
    }
  ],
  "total_commits_count": 1,
  "push_options": {
  },
  "repository": {
    "name": "xxsbpt",
    "url": "ssh://[email protected]/project/xxsbpt.git",
    "description": "信息上报管理端",
    "homepage": "http://gitlab.weiyigeek.top/project/xxsbpt",
    "git_http_url": "http://gitlab.weiyigeek.top/project/xxsbpt.git",
    "git_ssh_url": "ssh://[email protected]/project/xxsbpt.git",
    "visibility_level": 0
  }
}

步骤 01.有了上面的请示例,我们可以在jenkins Job 里 Generic Webhook Trigger 构建触发器中进行设置,首先需要进行勾选,获取到触发URL (http://jenkins.weiyigeek.top/generic-webhook-trigger/invoke)。

  •  Generic Webhook Trigger

步骤 02.然后在Post content parameters中进行配置,例如此处我们想要获取到ref的值可以这样配置。

# 自定义变量名称
Variable: ref

# 表达式采用 JSONPath 方式
Expression: $.ref      # ref 值

# 表达式获取值过滤与匹配,例如 refs/tags/Test_cet_v1.0.0 , 当配置如下时则ref其值为 Test_cet_v1.0.0 
Value filter: refs/tags/ 

# 未匹配到默认值
Default value:master

Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?..._第3张图片

温馨提示: 除此之外我们还可以获得Header parameters以及Request parameters, 并且新增 Post content parameters 参数例如再获取 message 信息。

Variable: message 
Expression: $.message

步骤 03.为了保证webhook未授权访问, 我们可以对其设置 Token 在认证时可以采用如下方式。

Token:weiyigeek-secrets
  • Query parameter invoke?token=weiyigeek-secrets

  • A token header token: TOKEN_HERE

  • A Authorization: Bearer header Authorization: Bearer TOKEN_HERE

步骤 04.配置Optional filter, 此处作用是条件判断,当只有符合Expression中定义的正则的变量Text 才会触发发版(CICD)否则不会发版。Text处的变量是通过前面Post content parameters区域提取的变量 message 。

Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?..._第4张图片

步骤 05.在Gitlab对应的项目中添加Webkook触发接口,即打开方式->项目->设置->Webhook设置-> 填入 GitLab webhook URL (http://jenkins.weiyigeek.top/generic-webhook-trigger/invoke?token=weiyigeek-secrets)

步骤 06.此时假如我们向代码仓库中打一个Tag, 例如 git tag -a Test_devops_v1.0.0 -m "Test_devops_v1.0.0" 等待触发 jenkins 拉取。

String BUILD_ENV = ""
String BUILD_NAME = ""
String BUILD_VERSION = ""

pipeline {
  node(k8s) {
    stage('Generic Webhook Trigger') {
      dir('/home/jenkins/agent/workspace/test') {
        def currentBranch = ref
        git branch: currentBranch, credentialsId: 'xxxx', url: 'http://gitlab.weiyigeek.top/devops.git'
        // 分隔 Tag 信息 或者 message 信息
        def arr = ref.split("_") as List
        // # 构建环境
        BUILD_ENV = arr[0]
        // # 构建名称
        BUILD_NAME = arr[1]
        // # 构建版本
        BUILD_VERSION = arr[1]
      }
    }
  }
}

2.如何在Jenkins pipeline中获取shell命令得返回值?

描述: 在 Pipeline 流水线中通常需要对执行的sh命令获取其值,我们可以通过如下几种方式获取其标准输出或者其执行状态。

  • 无需返回值,仅执行shell命令

pipeline{
  // 主要阶段以及子阶段流程
  stages {
    // [ 阶段.shell命令执行测试 ]
    stage ('代码拉取') {
      steps {
        // 最简单的方式
        sh 'whoami && uname -a'
      }
    }
  }
}
  • 获取标准输出

//第一种
result = sh returnStdout: true ,script: ""
result = result.trim()
//第二种
result = sh(script: "", returnStdout: true).trim()
//第三种
sh " > commandResult"
result = readFile('commandResult').trim()
  • 获取执行状态

//第一种
result = sh returnStatus: true ,script: ""
result = result.trim()
//第二种
result = sh(script: "", returnStatus: true).trim()
//第三种
sh '; echo $? > status'
def r = readFile('status').trim()

温馨提示: trim() 方法用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符等, 在 Jenkins 流水线中非常重要,因为命令执行后总是会在其末尾添加一个换行符。

3.如何在Jenkins pipeline中获取项目的commit id与commit msg并设置为环境变量?

描述: 在CICD中通常我们需要构建的消息提示, 而提示的相关信息必不可少的就是本次构建代码提交的id以及其代码提交主要修改信息等,方便运维以及开发人员进行后续测试、部署以及运维。

// # 1.获取完整 commit id, 例如:b34f93a7d4cbafb67d259edvf5a1f92dd6b4ddc5
sh label: 'commit_id',returnStatus: true  ,script: 'git rev-parse HEAD'

// # 2.获取 short commit id(如:bb4f92a)
sh label: 'short_commit_id',returnStatus: true  ,script: 'git rev-parse --short HEAD'
sh label: 'short_commit_id',returnStatus: true  ,script: 'git rev-parse --short HEAD ${GIT_COMMIT}'
sh label: 'short_commit_id',returnStatus: true  ,script: 'git log --oneline -1 | awk \'{print \$1}\''
sh label: 'git_commitid',returnStdout: true, script: """
  git show --oneline --ignore-all-space --text | head -n 1 | cut -d ' ' -f 1 |tr -d '\\n'
"""


// # 3.获取提交 messges 信息,并将其设置为环境变量
stage('get_commit_msg') {
  steps {
    script {
      env.GIT_COMMIT_MSG = sh (script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim()
      env.GIT_COMMIT_MSG = sh label: 'git_commitmsg',returnStdout: true, script: """
        git show --oneline --ignore-all-space --text | head -n 1 |tr -d '\\n'
      """
    }   
  }
}

本文至此完毕,更多技术文章,尽情期待下一章节!


原文地址: https://blog.weiyigeek.top/2020/12-31-618.html


欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】或者个人公众号【WeiyiGeek】联系我。

更多文章来源于【WeiyiGeek Blog 个人博客 - 为了能到远方,脚下的每一步都不能少 】

个人主页: 【 https://weiyigeek.top】

博客地址: 【 https://blog.weiyigeek.top 】

专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。

  • echo  "【点个赞】,动动你那粗壮的拇指或者芊芊玉手,亲!"

  • printf("%s", "【投个币】,万水千山总是情,投个硬币行不行,亲!")

  • fmt.Printf("【收个藏】,阅后即焚不吃灰,亲!")  

  • console.info("【转个发】,让更多的志同道合的朋友一起学习交流,亲!")

  • System.out.println("【关个注】,后续浏览查看不迷路哟,亲!")

  • cout << "【留个言】,文章写得好不好、有没有错误,一定要留言哟,亲! " << endl;

20b1650b17407eabda87d53ebc8bf0c4.png 往期相关文章ef00b44786830b681f1266c456e48607.png

1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)

2.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(下)

2.Jenkins入门基础使用与Gitlab持续化集成部署

8.Jenkins进阶之流水线pipeline基础使用实践(1)

9.Jenkins进阶之流水线pipeline基础使用实践(2)

11.Jenkins进阶之kubernetes集群搭建分布式架构基础环境

13.Jenkins进阶之自定义工作节点jnlp容器模板(附DockerFile)更新相关软件下载

12ea5198761b2ce464c2f40fc71ea98c.png

b22ca651ddb63694df5e01ea59b126a2.gif

更多网络安全、系统运维、应用开发、全栈文章,尽在【个人博客 - https://blog.weiyigeek.top】站点,谢谢支持!

你可能感兴趣的:(Jenkins,Git,Gitlab,Github)