同步jenkinsfile流水线(sync-job)

环境

  • 变量:env(环境变量:sit/dev/simulation/prod/all),job(job-name/all)
  • 目录:/var/lib/jenkins/jenkinsfile

  • environment.json:
[root@test-01 jenkinsfile]# cat environment.json | jq .
{"environment": [{"sit": "http://xxxx.xx.xx.com/|test:xxxxxxxxxxxxxxxx","dev": "http://xxxx.xx.xx.com/|test:xxxxxxxxxxxxxxxx","simulation": "http://xxxx.xx.xx.com/|test:xxxxxxxxxxxxxxxx","prod": "http://xxxx.xx.xx.com/|test:xxxxxxxxxxxxxxxx",}]
}

设计思路

  • 以sit环境的url和token作为基准baseUrl/baseToken
  • 若env=all则表示同步至所有环境
    • 循环获取env的环境变量,获取url和token
    • 若job=all则表示同步所有job
      • 获取当前基准环境下的job_list,循环获取jobname
      • 判断当前的job是否有config.xml的文件
        • 若第一行=<html>则无xml文件,在目标环境创建job
        • 若存在xml文件,则更新job
    • 若job=jobname则同步单个job
    • 判断当前的job是否有config.xml的文件
        • 若第一行=<html>则无xml文件,在目标环境创建job
        • 若存在xml文件,则更新job
  • 若env=env则表示同步至单个环境
    • 获取目标环境的url和token
    • 若job=all则表示同步所有job
      • 获取当前基准环境下的job_list,循环获取jobname
      • 判断当前的job是否有config.xml的文件
        • 若第一行=<html>则无xml文件,在目标环境创建job
        • 若存在xml文件,则更新job
    • 若job=jobname则同步单个job
    • 判断当前的job是否有config.xml的文件
        • 若第一行=<html>则无xml文件,在目标环境创建job
        • 若存在xml文件,则更新job

完整代码

pipeline {agent anyoptions {disableConcurrentBuilds()}parameters {string(name: "env", defaultValue: '', description: '')string(name: "job", defaultValue: '', description: '')}stages {stage("Sync job") {steps {script {dir("/var/lib/jenkins/jenkinsfile") {baseUrl = "http://xxx.xx.xx.com/"baseToken = "test:xxxxxxxxxxxxxxxxxxxxxxxxxx"def env = "${params.env}"if ( env == "all" ) {getEnvNumber = "cat environment.json | jq -r .environment[][] | wc -l"def envNumber = sh(script: "$getEnvNumber", returnStdout:true).trim()for ( i=2; i<=jobNumber.toInteger(); i++ ) {getAllUrlCommand = "cat environment.json | jq -r .environment[][] | sed -n $i'p' | awk -F \"|\" '{print\$1}'"getAllTokenCommand = "cat environment.json | jq -r .environment[][] | sed -n $i'p' | awk -F \"|\" '{print\$2}'"def url = sh(script: "$getAllUrlCommand", returnStdout:true).trim()def token = sh(script: "$getAllTokenCommand", returnStdout:true).trim()def job = "${params.job}"if ( job== "all" ) {sh "sudo curl -X GET $baseUrl/api/json?pretty=true -u $baseToken > job_list.txt"getJobNumber = "cat job_list.txt | jq -r .jobs[].name | wc -l"def jobNumber = sh(script: "$getJobNumber", returnStdout:true).trim()for (j=1; j<=jobNumber.toInteger(); j++) {def jobname = sh(script: "cat job_list.txt | jq -r .jobs[].name | sed -n $j'p'", returnStdout:true).trim()sh "sudo curl -X GET $baseUrl/job/$jobname/config.xml -u $baseToken -o config.xml"getCRUMBCommand= "sudo curl -s '$url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)' -u $token"def CRUMB = sh(script: "$getCRUMBCommand", returnStdout:true).trim()def str = sh(script: "curl -sX GET $url/job/$jobname/config.xml -u $token | sed -n 1p", returnStdout:true).trim()if( str == "<html>") {sh "sudo curl -s -XPOST '$url/createItem?name=$jobname' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}else {sh "sudo curl -s -XPOST '$url/job/$jobname/config.xml' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}}}else {sh "sudo curl -X GET $baseUrl/api/json?pretty=true -u $baseToken > job_list.txt"sh "sudo curl -X GET $baseUrl/job/$job/config.xml -u $baseToken -o config.xml"getCRUMBCommand= "sudo curl -s '$url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)' -u $token"def CRUMB = sh(script: "$getCRUMBCommand", returnStdout:true).trim()def str = sh(script: "curl -sX GET $url/job/$job/config.xml -u $token | sed -n 1p", returnStdout:true).trim()if( str == "<html>") {sh "sudo curl -s -XPOST '$url/createItem?name=$job' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}else {sh "sudo curl -s -XPOST '$url/job/$job/config.xml' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}}}}else {getUrlCommand = "cat environment.json | jq -r .environment[].$env | awk -F \"|\" '{print\$1}'"getTokenCommand = "cat environment.json | jq -r .environment[].$env | awk -F \"|\" '{print\$2}'"def url = sh(script: "$getUrlCommand", returnStdout:true).trim()def token = sh(script: "$getTokenCommand", returnStdout:true).trim()def job = "${params.job}"if ( job== "all" ) {sh "sudo curl -X GET $baseUrl/api/json?pretty=true -u $baseToken > job_list.txt"getJobNumber = "cat job_list.txt | jq -r .jobs[].name | wc -l"def jobNumber = sh(script: "$getJobNumber", returnStdout:true).trim()for (j=1; j<=jobNumber.toInteger(); j++) {def jobname = sh(script: "cat job_list.txt | jq -r .jobs[].name | sed -n $j'p'", returnStdout:true).trim()sh "sudo curl -X GET $baseUrl/job/$jobname/config.xml -u $baseToken -o config.xml"getCRUMBCommand= "sudo curl -s '$url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)' -u $token"def CRUMB = sh(script: "$getCRUMBCommand", returnStdout:true).trim()def str = sh(script: "curl -sX GET $url/job/$jobname/config.xml -u $token | sed -n 1p", returnStdout:true).trim()if( str == "<html>") {sh "sudo curl -s -XPOST '$url/createItem?name=$jobname' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}else {sh "sudo curl -s -XPOST '$url/job/$jobname/config.xml' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}}}else {sh "sudo curl -X GET $baseUrl/api/json?pretty=true -u $baseToken > job_list.txt"sh "sudo curl -X GET $baseUrl/job/$job/config.xml -u $baseToken -o config.xml"getCRUMBCommand= "sudo curl -s '$url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)' -u $token"def CRUMB = sh(script: "$getCRUMBCommand", returnStdout:true).trim()def str = sh(script: "curl -sX GET $url/job/$job/config.xml -u $token | sed -n 1p", returnStdout:true).trim()if( str == "<html>") {sh "sudo curl -s -XPOST '$url/createItem?name=$job' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}else {sh "sudo curl -s -XPOST '$url/job/$job/config.xml' -u $token --data-binary @config.xml -H \"$CRUMB\" -H \"Content-Type:text/xml\""}}}}}}}}
}

ide思路:

每个环境不同

  • 进入code目录中,进入jenkins-pipeline/目录
  • ls -l获取目录下所有的子目录及文件,count所有子目录及文件的数量
  • for循环整个Jenkins-pipeline下的子目录和文件
    • 获取子目录或文件的name
    • 判断是否为目录
      • 若为目录则cd $name
        • ls -l获取目录下的所有文件,dircount所有文件的数量
          • for循环整个name下的所有文件
            • 获取jobname
            • 获取jobname所对应job的config.xml文件
            • 判断当前的job是否有config.xml的文件
              • 若第一行=<html>则无xml文件,在目标环境创建job
              • 若存在xml文件,则更新job
      • 若为文件则
        • 获取jobname
        • 获取jobname所对应job的config.xml文件
        • 判断当前的job是否有config.xml的文件
          • 若第一行=<html>则无xml文件,在目标环境创建job
          • 若存在xml文件,则更新job

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/94977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elementUI时间选择器el-time-picker的坑

//开始时间<el-time-pickerplaceholder"选择时间":format"HH:mm:ss" //显示的时间样式value-format"HH:mm:ss" //绑定值的样式 //不给默认为 Date 对象值&#xff1a;"2023-07-31T16:00:00.000Z"v-model"FormData.startTime&…

JavaWeb-Servlet服务连接器(终)

上一篇文章JavaWeb-Servlet服务连接器&#xff08;三&#xff09;_Alphamilk的博客-CSDN博客 目录 1.ServletContext通信 会话技术Cookie与Session 1.Cookie 2.Session 1.ServletContext通信 概念&#xff1a;代表了整个web应用&#xff0c;用于与服务器实现通信 可以通…

docker-php扩展

生成扩展骨架 环境&#xff1a;docker-compose、php74 1.本地要有一份 php-src git clone https://github.com/php/php-src.git cd php-src git checkout PHP-7.4.52.\www\php-src\ext可以看到有一个 ext_skel.php 文件 3.通过ext_skel.php脚本创建了一个hello扩展&#xf…

同步请求和异步请求

同步请求和异步请求是在网络编程中常用的两种通信模式&#xff0c;它们有以下区别&#xff1a; 同步请求&#xff1a; 在发送一个请求后&#xff0c;程序会一直等待服务器返回响应&#xff0c;期间无法进行其他操作。请求发出后&#xff0c;程序会阻塞在请求处&#xff0c;直…

变压器故障诊断(python代码,逻辑回归/SVM/KNN三种方法同时使用,有详细中文注释)

视频效果&#xff1a;变压器三种方法下故障诊断Python代码_哔哩哔哩_bilibili代码运行要求&#xff1a;tensorflow版本>2.4.0,Python>3.6.0即可&#xff0c;无需修改数据路径。 1.数据集介绍&#xff1a; 采集数据的设备照片 变压器在电力系统中扮演着非常重要的角色。…

【Spring源码】小白速通解析Spring源码,从0到1,持续更新!

Spring源码 参考资料 https://www.bilibili.com/video/BV1Tz4y1a7FM https://www.bilibili.com/video/BV1iz4y1b75q bean工厂 DefaultListableBeanFactory&#xff08;最原始&#xff09; bean的生命周期 创建&#xff08;实例化&#xff09;–>依赖注入–>-初始化…

【数据结构】循环队列

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java课题笔记~ 整合第三方技术

1. 整合JUnit 问题导入 回忆一下Spring整合JUnit的步骤&#xff1f; 1.1 Spring整合JUnit&#xff08;复习&#xff09; 1.2 SpringBoot整合JUnit 【第一步】添加整合junit起步依赖(可以直接勾选) <dependency><groupId>org.springframework.boot</groupId…

1.SpringMVC接收请求参数及数据回显:前端url地址栏传递参数通过转发显示在网页

1、SpringMVC 处理前端提交的数据 1.1 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.2 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.3 提交的是一个对象 2、前端url地址栏传递的是一个参数 请求地址url&#xff1a;http://localhost:8080/s…

如何运用小程序技术闭环运营链路?

如何通过线上小程序获取用户线索&#xff0c;提高企业抗风险能力&#xff0c;建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时&#xff0c;从「推广」到「转化」&#xff0c;再到最终的「留存」都是运营过程…

React 全栈体系(二)

第二章 React面向组件编程 一、基本理解和使用 1. 使用React开发者工具调试 2. 效果 2.1 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函数式组件</title> </head> &l…

Qt应用开发(基础篇)——选项卡窗口 QTabWidget

一、前言 QTabWidget类继承于QWidget&#xff0c;是一个拥有选项卡的窗口部件。 QTabWidget类有一个选项卡栏QTabBar和一个页面区域&#xff0c;用来显示和选项卡相关联的界面。用户通过点击选项卡或者自定义快捷方式(ALTKey)切换页面。 二、QTabWidget类 1、count 该属…

文本挖掘 day5:文本挖掘与贝叶斯网络方法识别化学品安全风险因素

文本挖掘与贝叶斯网络方法识别化学品安全风险因素 1. Introduction现实意义理论意义提出方法&#xff0c;目标 2. 材料与方法2.1 数据集2.2 数据预处理2.3 关键字提取2.3.1 TF-IDF2.3.2 改进的BM25——BM25WBM25BM25W 2.3.3 关键词的产生(相关系数) 2.4 关联规则分析2.5 贝叶斯…

Pytorch源码搜索与分析

PyTorch的的代码主要由C10、ATen、torch三大部分组成的。其中&#xff1a; C10 C10&#xff0c;来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码&#xff0c;可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。C10的代…

【Java 回忆录】Java全栈开发笔记文档

这里能学到什么&#xff1f; 实战代码文档一比一记录实战问题和解决方案涉及前端、后端、服务器、运维、测试各方面通过各方面的文档与代码&#xff0c;封装一套低代码开发平台直接开腾讯会议&#xff0c;实实在线一起分享技术问题核心以 Spring Boot 作为基础框架进行整合后期…

大数据Flink学习圣经:一本书实现大数据Flink自由

学习目标&#xff1a;三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本&#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下&#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来&#xff0c; 已经汇集了 好几百题&#xff0c;大量的大厂面试…

记一次较为详细的某CMS代码审计

前言 本次审计的话是Seay昆仑镜进行漏洞扫描 Seay的话它可以很方便的查看各个文件&#xff0c;而昆仑镜可以很快且扫出更多的漏洞点&#xff0c;将这两者进行结合起来&#xff0c;就可以发挥更好的效果。 昆仑镜官方地址 https://github.com/LoRexxar/Kunlun-M 环境 KKC…

前端笔试+面试分享

以下是个人线下面试遇到的真实的题&#xff0c;仅供参考和学习 1. css 选择符有哪些&#xff1f;哪些属性可以继承&#xff1f;优先级算法加何计算&#xff1f; CSS选择符有很多种&#xff0c;例如类型选择器、类选择器、ID选择器、属性选择器、伪类选择器、伪元素选择器等。 …

前端常用算法(一):防抖+节流

目录 第一章 防抖 1.1 防抖&#xff08;debounce&#xff09;简介 1.2 应用场景 1.3 实现思路 1.4 手撕防抖代码 第二章 节流 2.1 节流&#xff08;throttle&#xff09;简介 2.2 应用场景 2.3 实现思路 2.4 手撕节流代码&#xff08;方法&#xff1a;时间戳和计时器…

简单的洗牌算法

目录 前言 问题 代码展现及分析 poker类 game类 Text类 前言 洗牌算法为ArrayList具体使用的典例&#xff0c;可以很好的让我们快速熟系ArrayList的用法。如果你对ArrayList还不太了解除&#xff0c;推荐先看本博主的ArrayList的详解。 ArrayList的详解_WHabcwu的博客-CSD…