写点什么

远程触发 Jenkins 的 Pipeline 任务

作者:程序员欣宸
  • 2022-11-25
    广东
  • 本文字数:2326 字

    阅读完需:约 8 分钟

远程触发Jenkins的Pipeline任务

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

场景

  • 虽然能配置提交代码到 Git 时触发 Jenkins 任务,但有时并不需要每次提交代码都触发,而是仅在有需要时才执行。

  • 除了在 Jenkins 页面上手动执行任务,还可以向 Jenkins 网站发起 HTTP 请求,触发指定任务的执行,本文就来实战通过 Http 请求同时触发多个 Jenkins 任务执行。

概述

  • 对于 pipeline 类型的 Jenkins 任务,一般是通过插件 Generic Webhook Trigger 来支持远程触发的,在使用过程中以下三点需要注意:

  • 远程触发 Jenkin 任务,请求的 URL 怎么写;

  • Http 请求的参数,如何作为 pipeline 脚本的参数;

  • 假设有 Jenkins 任务 A,某时刻有 10 个触发该任务的请求同时到达,Jenkins 如何处理?(后面会重点讨论此问题)

  • 针对上述问题,我们来做一次实战:

  • 向 Jenkins 服务发起 http 请求;

  • 请求参数是一个 Github 代码仓库的地址和分支名;

  • Jenkins 收到这个请求后,执行一个 pipeline 任务;

  • 该任务是下载指定的 Github 仓库的代码,流程如下图所示:


环境信息

  1. 操作系统:CentOS 7.7

  2. Jenkins:2.190.3

  3. Generic Webhook Trigger 插件:1.66


实战

  • 先来安装插件,如下图,进入插件管理页面:

  • 安装插件的操作步骤如下图所示,请按照红框数字的顺序操作:

  • 稍等片刻,插件在线安装成功,如下图,接下来创建个 pipeline 任务试试:

  • 新建名为 remote-test 的 pipeline 任务:

  • 进入设置页面,如下图红框所示,出现了 Generic Webhook Trigger 选项:

  • 勾选 Generic Webhook Trigger 之后页面会发生变化,如下图,在红框位置,先设置 token 的值为 token-remote-test ,这样 http 请求中的 token 参数的值如果等于 token-remote-test ,就会触发当前任务:

  • 接下来设置请求参数,如下图红框所示,先输入固定的 ref 参数(插件用到的,必须输入),然后再把 repositoryURLbranch 也设置好,即 Github 代码仓库地址和分支名,这样 http 请求中 repositoryURLbranch 参数就能传递到后面的 pipeline 脚本中去了;

  • 接下来可以写 pipeline 脚本了:


pipeline {    agent any    triggers {        GenericTrigger(            genericVariables: [              [key: 'ref', value: '$.ref'],              [key: 'repositoryURL', value: '$.repositoryURL'],              [key: 'branch', value: '$.branch']            ],            token: 'token-remote-test' ,            causeString: '$ref' ,            printContributedVariables: true,            printPostContent: true        )    }
stages { stage('show-param') { steps { echo 'token参数:$token' echo '代码仓库:$repositoryURL' echo '代码分支:$branch' } }
stage('down-sourcecode') { steps { echo '开始下载源码' checkout([$class: 'GitSCM', branches: [[name: '*/$branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: '$repositoryURL']]]) } } }}
复制代码


  • 上述脚本有以下几个关键点:


a. triggers 、GenericTrigger、genericVariables 这几个参数是固定的,按上述示例去写即可;


b. printContributedVariables 和 printPostContent 为 true,会在执行任务时打印出请求参数的内容来;


c. 这里一共有两个 stage,在执行 show-param 的时候,会将 http 请求参数全部打印出来;


d. checkout 是 pipeline 提供的 API,用于下载 Github 仓库的代码,其 branches 参数的值用上了 http 的请求参数 branch,userRemoteConfigs.url 参数的值用上了 http 的请求参数 repositoryURL


  • 将上述 pipeline 脚本写在下图红框位置,然后点击底部的 Save 按钮保存:

  • 任务配置完成,接下来用 Postman 向 Jenkins 发起请求,验证通过 Http 请求触发 Jenkins 任务;

验证

  • 我这边 jenkins 网站的地址是: http://192.168.133.149:32049 ,因此触发任务的请求地址是: **http://192.168.133.149:32049/generic-webhook-trigger/invoke?token=token-remote-test ** ,注意 token 参数的值和任务设置中的 token 值必须一致;

  • 在 Postman 上的配置如下图所示,请按照数字顺序配置,repositoryURL 参数的值为 https://github.com/zq2599/jenkinsdemo.git ,这是我放在 Github 上的一个 java 工程,可以正常下载:

  • 配置完成后点击 Send 按钮发送请求,正常情况下收到的返回码是 200,如下图红框,如果非 200(例如 404),请检查参数和 Jenkins 任务的参数设置(例如 token 不一致):

  • 回到 Jenkins 页面查看日志,如下图红框,请求参数都被打印出来了:

  • 继续往下,可见 Github 源码成功下载:

  • 至此,通过 Http 触发 Jenkins 的 pipeline 实战就完成了,我们可以通过程序、脚本等各种手段,按照不同的需求来触发 Jenkins 任务,并传给任务不同的参数。

并发问题

  • 远程触发 Jenkins 任务虽然灵活方便,但是在处理并发请求时会有问题:10 个请求同时到达, 只有一个会执行 ,这个问题的详情和解决办法在下一篇文章《远程触发 Jenkins 的 Pipeline 任务的并发问题处理》详细讨论;

源码下载

  • 我的 Github 地址如下所示:



  • 里面有多个工程,请使用 jenkinsremotedemo ,如下图红框所示,这是个 Java 工程,里面的 remote-test 文件就是本文用到的 pipeline 脚本,另外这个工程的 Java 代码(App.java)可以向 Jenkins 同时发起多个远程触发请求:

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022-11-25阅读数: 24
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
远程触发Jenkins的Pipeline任务_jenkins_程序员欣宸_InfoQ写作社区