前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Jenkins API+Pipeline深度实践之input的自动化

Jenkins API+Pipeline深度实践之input的自动化

作者头像
仙人技术
发布于 2021-03-24 09:19:03
发布于 2021-03-24 09:19:03
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

本文分享的小Tips是在我前面的文章DevOps建设之基于钉钉OA审批流的自动化上线中提到的,当通过API自动触发Jenkins Pipeline流水线执行时,如果原来的流水线中定义了在构建正式开始后还需要接收用户input的步骤,想要自动绕过或自动执行input的方法

1、pipeline input概述

首先回过头再来看看pipeline input的语法及功能,参考我之前总结的pipeline input语法

input指令stage允许使用input step提示输入。在stage将暂停任何后options已被应用,并在进入前agent块为stage或评估when的条件stage。如果input批准,stage则将继续。作为input提交的一部分提供的任何参数将在其余的环境中可用stage

可选项

  • message 必需的,这将在用户提交时显示给用户input
  • id 可选标识符input,默认为stage名称
  • ok input表单上“确定”按钮的可选文本
  • submitter 可选的逗号分隔列表,这些列表允许用户提交此用户或外部组名input。默认为允许任何用户。
  • submitterParameter 环境变量的可选名称,用该submitter名称设置(如果存在)
  • parameters 提示提交者提供的可选参数列表。请参阅Pipeline parameters以获取更多信息

2、背景概述

基于上面的语法描述,我这里线上发布流水线中input的功能仅仅是需要用户进行确认,所以没有传递任何参数,通过这种简单的input控制及timeout超时机制,实现了用户选择参数并点击开始构建后需要在60秒内二次确认的功能,流水线的部分内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stage('Deploy to prod'){
    when {
        environment name: 'PerformType', value: 'Deploy'
    }
    steps{
        timeout(time:60, unit:'SECONDS') {
        input "确认要部署到线上环境吗?"              
            script{
                try {
                    ...
                }
                catch (exc) {
                    ...
                    throw(exc)
                }
            }
        }
    }
}

到这里问题就产生了,input的过程是在流水线运行过程中动态出现的,如果是想要在钉钉OA审批通过后自动通过调用jenkins api并传入参数让整个流水线自动执行,并且自动进行input的确认操作或者绕过input,应该怎么做呢?

3、推理及测试

刚开始没有任何思路,唯一想到的办法就是把input的过程从pipeline中去除掉,这样就没有任何烦恼了

但是为了保留原有pipeline设计的完整性,显然这种做法不够友好,只是避开了这个难点,是不可取的

通过查找发现这方面的资料很少,最终有用的资料如下

input语法中可选字段包含id,每个input步骤都有一个唯一的ID。在生成的URL中可以使用它来继续或中止

例如,可以使用特定的ID来机械地响应来自某些外部过程/工具的输入

  • https://www.thinbug.com/q/48799442

这篇文章中讲到了如何通过Jenkins REST API恢复暂停的管道?作为参考起到了一定帮助

为了完成整个自动化input的过程,具体的演进流程如下

3.1 通过Crumb安全操作Jenkins

Crumb指的是JenkinsCSRF tokenJenkins服务器为了阻止不安全的跨域请求,默认开启了CSRF保护,参考Jenkins远程API访问

JenkinsCSRF配置可以在「系统管理」——> 「全局安全配置」——> 「CSRF Protection」相关配置中关闭此保护,跨站请求伪造这是一个很常见的安全问题,为了安全起见建议不关闭。如果关闭,这里的内容可以略过。

Jenkins开启CSRF保护后,可以通过固定的接口获得一个安全的Crumb以便于通过API操作Jenkins,以curl请求为例,请求的可选方式一般是两种,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
方法一:
curl -u <username>:<password> 'https://jenkins.ssgeek.com/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
Jenkins-Crumb:dc78dfb9615fb56bbf2001fb99c64dbd3331c5e14c8d4edd54722e7ca790529e%

方法二:
curl -u <username>:<password> 'https://jenkins.ssgeek.com/crumbIssuer/api/json'
{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"52d605f43328f15303c2e68eb492b9656e229ce124c2f5f2e39b6f552f54e4ac","crumbRequestField":"Jenkins-Crumb"}%

以上两种方式都可以获取一个Crumb,然后就能带着它去请求JenkinsAPI

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -u <username>:<password> -X POST -H "Jenkins-Crumb:b220147dbdf3cfebbeba4c29048c2e33" -d <data> 'https://jenkins.ssgeek.com/<jenkins api url>'

3.2 通过Token安全操作Jenkins

在官方文档的描述中有这样一句话:API tokens are preferred instead of crumbs for CSRF protection.

意为在开启了CSRF的情况下,首选的是通过API token操作而不是crumb,这里的API token指的就是Jenkins中用户的API token

可以通过「用户」——> 「设置」——> 「API Token」——> 「添加新Token」来获得一个api token,有了这个Token之后,以curl请求为例操作JenkinsAPI方式如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -u user_id:user_api_token -X POST -d <data> 'https://jenkins.ssgeek.com/<jenkins api url>'

3.3 API操作

参考上面的文档资料使用Jenkins REST API恢复暂停的管道

对于input有这样的api接口地址可以使用,用于将输入发送到等待的输入步骤。url格式如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://<JenkinsURL>/<JobURL>/<Build#>/input/<InputID>/submit

需要满足的条件

  • 如果Jenkins启用了CSRF保护,则您需要使用CrumbAPI Token
  • 请求通过POST方式发送
  • 需要提供参数名为proceed的值,并且以OK作为参数值
  • 为了提供数据,需要带有json格式的参数,这些参数就是在input阶段需要接收的参数,格式为 { "parameter":[ { "name":"param1", "value":"valueOfParam1" }, { "name":"param2", "value":"valueOfParam2" } ] } 如果没有发送有效的json参数,则流水线也将继续进行,只是不会获得任何参数(这也可能导致流水线最终执行失败),如果成功则返回302状态码并重定向到用户界面
  • 必须填写input id,因此要从外部连接到的input步骤配置唯一的id
  • 也可以使用下面的url,如果流水线成功,则返回状态码为200且响应为空 http://<Jenkins URL>/job/<YOUR_PROJECT>/<BUILD_NUMBER>/wfapi/inputSubmit

其他可用的api接口地址以及作用

  • 用于中止流水线
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://<Jenkins URL>/job/<YOUR_PROJECT>/<BUILD_NUMBER>/input/<INPUT_ID>/abort
  • 不传入任何参数并继续进行流水线
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://<Jenkins URL>/job/<YOUR_PROJECT>/<BUILD_NUMBER>/input/<INPUT_ID>/proceedEmpty

对于本文中我的需求,只需要在input执行时自动确认且无需传入任何参数即可,因此使用的接口地址为上面的最后一种(其余接口地址未测试)

3.4 input的改造

为了实现在input执行时自动确认,需要对流水线的input部分进行改造,加入一个固定的id即可

由于定义的id都是固定的,因此可以利用脚本对所有的流水线涉及到这种input的部分批量更新,这里就不列出具体方法了

最终我的流水线调整如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stage('Deploy to prod'){
    when {
        beforeInput true
        environment name: 'PerformType', value: 'Deploy'
    }
    options {
        timeout(time:60, unit:'SECONDS')
    }
    input {
        message "确认要部署到线上环境吗?"
        id "CustomId"
    }
    steps{
        script{
            try {
                ...
            }
            catch (exc) {
                ...
                throw(exc)
            }
        }
    }
}

4、自动化input的最终实现

经过上面的推理和测试,解决了通过API自动执行input进行流水线确认的问题

这里还剩下最后一个问题,通过测试发现,想要自动执行input过程,其接口对应的url地址并不是一直存在的,而是在流水线执行开始后到达input的时候才会出现,出现时通过浏览器访问查看如下

而其余时间发送请求都会返回404状态码,此时是无法接收post请求的,因此想要自动化执行input并不只是简单的向接口发送POST请求了

我这里的解决思路

在发送流水线开始执行的请求后,立即通过代码循环请求并判断接口地址返回的状态码是否是200

如果不是,那么表示流水线还没执行到这里;如果是,就可以完美的向这个地址发送自动执行的请求了

python语言调用Jenkins api为例,用到了python-jenkins这个包,在触发构建时使用build_job这个方法,这个方法返回值刚好是job任务的build number,这恰好是接口地址组成中需要的一部分

好了,上最终的部分代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def auto_job_input(self, server_url, job_name, build_number):
    """
    根据input阶段生成的url http状态码,判断当前job流水线运行的stage否进行到了input步骤
    自动执行input or 继续判断
    :param job_name:
    :param build_number:
    :return:
    """
    # https://jenkins.ssgeek.com/job/input-demo/64/input
    get_url = server_url + "/job/" + job_name + "/" + str(build_number) + "/input"
    # https://jenkins.ssgeek.com/job/input-demo/64/input/CustomId/proceedEmpty
    post_url = get_url + "/CustomId/proceedEmpty"
    s = requests.Session()
    res_code_get = s.get(url=get_url, auth=('user_id', 'user_token')).status_code
    while res_code_get != 200:
        res_code_get = s.get(url=get_url, auth=('user_id', 'user_token')).status_code
    res_code_post = s.post(url=post_url, auth=('user_id', 'user_token'), data=None).status_code
    return res_code_post

关键部分代码量很少,利用request并且携带认证参数进行请求,如果有大佬有更好的方案欢迎与我交流

5、小结

到这里,通过一步步推理演进,在流水线中input的自动化执行就完美实现了,最终既实现了调用api触发自动构建并执行input进行自动确认,同时也保留了原流水线的input设计,对原有流水线只需要做很小的调整。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「持续集成实践系列 」Jenkins 2.x 构建 CI 自动化流水线常见技巧 (二)
在上一篇文章中,我们介绍了Jenkins 2.x实现流水线的两种语法,以及在实际工作中该如何选择脚本式语法或声明式语法。原文可查阅:「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点(一)
测试开发技术
2020/06/05
1.3K0
「持续集成实践系列 」Jenkins 2.x 构建 CI 自动化流水线常见技巧 (二)
打造企业级自动化运维平台系列(六):Jenkins Pipeline 入门及使用详解
作为一种流行的持续集成和交付工具,Jenkins有多种方式来实现交付流水线。其中,Jenkins Pipeline是一种比较流行的方式,它提供了一个DSL(Domain Specific Language 的缩写,中文翻译为:领域特定语言)来描述交付流水线。
民工哥
2024/01/18
2.4K0
打造企业级自动化运维平台系列(六):Jenkins Pipeline 入门及使用详解
自动化集成:Pipeline流水语法详解
Pipeline流水线任务通常情况下都是自动触发的,在Git仓库中配置源码改动后通知的地址即可。
知了一笑
2021/12/24
1.1K0
自动化集成:Pipeline流水语法详解
史诗级整理 Jenkins 流水线详解
jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
我的小碗汤
2023/03/19
8K0
史诗级整理 Jenkins 流水线详解
通过jenkins API去build一个job
背景 查看jenkins的api 直接访问 JENKINS_URL/job/JOB_NAME/api/ 就可以查看jenkins的api build一个job的话,是POST请求 JENKINS_UR
千往
2018/01/24
2.4K0
通过jenkins API去build一个job
Kubernetes 动态创建 Jenkins Agent 压力测试
前面我们利用 Kubernetes 提供的弹性,在 Kubernetes 上动态创建 Jenkins Slave,本文主要是对 Jenkins 进行大规模构建的压力测试。
我是阳明
2020/12/01
1.8K0
Kubernetes 动态创建 Jenkins Agent 压力测试
使用Go案例完成开发到部署实践
我们准备一个apis模块,在该模块中实现一个打印字符串的函数Says(str string):所以
公众号: 云原生生态圈
2020/06/12
8710
【Jenkins系列】-Pipeline语法全集
parameters指令提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步骤
DevOps在路上
2023/05/16
2K0
【Jenkins系列】-Pipeline语法全集
从0搭建属于自己的Jenkins持续集成平台
Jenkins在日常工作中占据了一个非常重要的角色,帮助我们节省了大量用于构建的时间。有些公司有运维大哥对Jenkins进行维护,如果没有那只能自己动手了。俗话说的好自己动手丰衣足食,所以本文就从0开始搭建属于自己的Jenkins持续平台。主要包含,普通项目构建、流水线构建、多分支流水线构建并将构建结果辅以钉钉通知。
不一样的科技宅
2020/07/08
1.1K1
2.Jenkins进阶之流水线pipeline语法入门学习
Q: 什么是 Groovy 语言 答: Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)
全栈工程师修炼指南
2022/09/29
17.9K0
2.Jenkins进阶之流水线pipeline语法入门学习
kubernetes 基于jenkins spinnaker的ci/cd实践一增加制品镜像扫描
早期jenkins承担了kubernetes中的ci/cd全部功能Jenkins Pipeline演进,这里准备将cd持续集成拆分出来到spinnaker!
对你无可奈何
2021/11/20
1.1K0
Jenkins学习19 - pipline 构建项目生成 allure报告并发送邮箱
个人其实一直的不太喜欢用邮箱发送报告,测试报告用邮件通知这都是五六年前的事情了,但有部分小伙伴依然执着于发邮件报告通知。 这里整理了下发邮箱通知的教程。
上海-悠悠
2023/12/18
3180
Jenkins学习19 - pipline 构建项目生成 allure报告并发送邮箱
Jenkins集成GitLab的正确姿势,实现Git代码提交触发CI/CD
首先创建GitLab凭证,将凭证填充到 Manage Jenkins->System->enable authentication for '/project' end-point。
DevOps在路上
2024/04/22
5.2K0
Jenkins集成GitLab的正确姿势,实现Git代码提交触发CI/CD
【云原生 | Devops篇】Jenkins安装与实战
Jenkins,之前叫做Hudson,由SUN公司启动,2010年oracle收购SUN导致hudson商标归oracle保留,hudson的主要贡献者基于hudson更名为jenkins并持续更新。很长一段时间内lenkins和Hudson继续作为两个独立的项目,每个都认为对方是自己的分支。目前Hudson已经停止开发,最新的版本发布于2016年,而Jenkins的社区和开发却异常活跃。Jenkins是目前市场上使用最多的CICD工具。
Lansonli
2022/05/21
6900
【云原生 | Devops篇】Jenkins安装与实战
Jenkins input插件最佳实践(交互)
你是否用过Shell编程中的read交互式赋值? 是否用过Python中的input()函数完成在屏幕中的交互赋值操作呢?
DevOps云学堂
2019/10/31
4.8K0
基于GitLab+Jenkins的DevOps赋能实践
    随着微服务、中台架构的兴起,DevOps也变得非常关键,毕竟是一些基础设施层面的建设,如果搞好了对后面的研发工作会有很大的效率提升。关于DevOps本身的概念,网上已经非常多了,在园子里随便搜索一些都一堆概念,我就不再重复介绍了。下面直接进入正题,怎么使用GitLab+Jenkins来完成DevOps的建设。
星哥玩云
2022/07/28
9270
基于GitLab+Jenkins的DevOps赋能实践
CICD之Jenkins使用
jenkins把项目拉倒jenkins服务器,放到workspace(一般我们的源代码都在这里),开始进行流水线处理。
全栈程序员站长
2022/09/02
5300
基于Jenkins Pipeline的ASP.NET Core持续集成实践
最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署,因此这里总结一下。
Edison Zhou
2019/04/21
1.7K0
kubernetes集群使用spinnaker完成自动化部署
Spinnaker 的集群管理和部署功能两大核心功能,但是都是单独演示,没有将两者有机结合起来,今天,我们来通过一个示例来演示如何通过 Spinnaker 结合外部平台完成整个流程的自动化构建以及自动化部署到 Kubernetes 集群中。下边,我针对该示例做一些必要的说明。
王先森sec
2023/04/24
1K0
kubernetes集群使用spinnaker完成自动化部署
Jenkins流水线即代码之扩展共享库
Jenkin的多分支流水线,允许Jenkinsfile与需要 Jenkins 构建的应用程序代码放在一起,然后 Jenkins 从源代码管理系统中检出 Jenkinsfile 文件作为流水线项目构建过程的一部分并接着执行你的流水线。
追马
2020/07/15
1.9K0
Jenkins流水线即代码之扩展共享库
推荐阅读
相关推荐
「持续集成实践系列 」Jenkins 2.x 构建 CI 自动化流水线常见技巧 (二)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验