同步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.mzph.cn/news/43337.shtml

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

相关文章

C++ string类的模拟实现

模拟实现string类不是为了造一个更好的轮子&#xff0c;而是更加理解string类&#xff0c;从而来掌握string类的使用 string类的接口设计繁多&#xff0c;故而不会全部涵盖到&#xff0c;但是核心的会模拟实现 库中string类是封装在std的命名空间中的&#xff0c;所以在模拟…

使用PostgreSQL构建强大的Web应用程序:最佳实践和建议

PostgreSQL是一个功能强大的开源关系型数据库,它拥有广泛的用户群和活跃的开发社区。越来越多的Web应用选择PostgreSQL作为数据库 backend。如何充分利用PostgreSQL的特性来构建健壮、高性能的Web应用?本文将给出一些最佳实践和建议。 一、选择合适的PostgreSQL数据类型 Pos…

【Vue】Mixin 混入

Vue Mixin 混入 1.简介 混入&#xff08;mixin&#xff09;提供了一种非常灵活的方式&#xff0c;来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项&#xff08;如data、methods、mounted等等&#xff09;。当组件使用混入对象时&#xff0c;所有混入对象的…

鸿蒙剥离 AOSP 不兼容 Android 热门问题汇总,不吹不黑不吵

上周发了一篇 《鸿蒙终于不套壳了&#xff1f;纯血 HarmonyOS NEXT 即将到来》的相关资讯&#xff0c;没想到大家「讨&#xff08;fa&#xff09;论&#xff08;xie&#xff09;」的热情很高&#xff0c;莫名蹭了一波流量&#xff0c;虽然流量对我来说也没什么用&#xff0c;但…

私密数据采集:隧道爬虫IP技术的保密性能力探究

作为一名专业的爬虫程序员&#xff0c;今天要和大家分享一个关键的技术&#xff0c;它能够为私密数据采集提供保密性能力——隧道爬虫IP技术。如果你在进行敏感数据采集任务时需要保护数据的私密性&#xff0c;那么这项技术将是你的守护神。 在进行私密数据采集任务时&#xff…

图像去雨-雨线清除-图像处理-(计算机作业附代码)

背景 多年来&#xff0c;图像去雨已经被广泛研究&#xff0c;使用传统方法和基于学习的方法。然而&#xff0c;传统方法如高斯混合模型和字典学习方法耗时&#xff0c;并且无法很好地处理受到严重雨滴影响的图像块。 算法 通过考虑雨滴条状特性和角度分布&#xff0c;这个问…

【Leetcode】98. 验证二叉搜索树

一、题目 1、题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1: 输入:root = …

马上七夕到了,用各种编程语言实现10种浪漫表白方式

目录 1. 直接表白&#xff1a;2. 七夕节表白&#xff1a;3. 猜心游戏&#xff1a;4. 浪漫诗句&#xff1a;5. 爱的方程式&#xff1a;6. 爱心Python&#xff1a;7. 心形图案JavaScript 代码&#xff1a;8. 心形并显示表白信息HTML 页面&#xff1a;9. Java七夕快乐&#xff1a;…

QT的布局与间隔器介绍

布局与间隔器 1、概述 QT中使用绝对定位的布局方式&#xff0c;无法适用窗口的变化&#xff0c;但是&#xff0c;也可以通过尺寸策略来进行 调整&#xff0c;使得 可以适用窗口变化。 布局管理器作用最主要用来在qt设计师中进行控件的排列&#xff0c;另外&#xff0c;布局管理…

Android 远程真机调研

背景 现有的安卓测试机器较少&#xff0c;很难满足 SDK 的兼容性测试及线上问题&#xff08;特殊机型&#xff09;验证&#xff0c;基于真机成本较高且数量较多的前提下&#xff0c;可以考虑使用云测平台上的机器进行验证&#xff0c;因此需要针对各云测平台进行调研、比较。 …

服装定制小程序

如今&#xff0c;人们对时尚的追求已不仅仅停留在传统的购买与穿搭上&#xff0c;而是更加注重个性化和定制化的需求。为满足这一需求&#xff0c;乔拓云网推出了一款创新的服装定制小程序&#xff0c;为用户提供定制专属时尚的全新旅途。 通过进入【乔拓云】后台&#xff0c;用…

Ordinals 之后,以太坊铭文协议 Ethscriptions 如何再塑 NFT 资产形态

随着加密市场的发展&#xff0c;NFT 赛道逐渐形成了其独有的市场。但在加密熊市的持续影响下&#xff0c;今年 NFT 赛道的发展充满坎坷与挑战。据 NFTGO 数据显示&#xff0c;截至 8 月 7 日&#xff0c;与去年相比&#xff0c;NFT 市值总计约 56.4 亿美元&#xff0c;过去 1 年…

搜狗拼音暂用了VSCode及微信小程序开发者工具快捷键Ctrl + Shit + K 搜狗拼音截图快捷键

修改搜狗拼音的快捷键 右键--更多设置--属性设置--按键--系统功能快捷键--系统功能快捷键设置--取消Ctrl Shit K的勾选--勾选截屏并设置为Ctrl Shit A 微信开发者工具设置快捷键 右键--Command Palette--删除行 微信开发者工具快捷键 删除行&#xff1a;Ctrl Shit K 或…

无脑入门pytorch系列(四)—— scatter_

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

深入理解内存 —— 函数栈帧的创建与销毁

前言 一位优秀的程序员&#xff0c;必须对内存的分布有深刻的理解&#xff0c;在初学编程的时候&#xff0c;往往有诸如以下很多问题困扰着初学者&#xff0c;而通过今天的分享&#xff0c;我们就可以通过自己的观察&#xff0c;将这些问题统统解决掉 局部变量是怎么创建的&…

keepalived集群

keepalived概述 keepalived软件就是通过vrrp协议来实现高可用功能。 VRRP通信原理 VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选一种协议机制来将路由交个某台VRRP路由器。 VRRP 用IP多播的方式&#xff08;多播地…

C语言中常见的一些语法概念和功能

常用代码&#xff1a; 程序入口&#xff1a;int main() 函数用于定义程序的入口点。 输出&#xff1a;使用 printf() 函数可以在控制台打印输出。 输入&#xff1a;使用 scanf() 函数可以接收用户的输入。 条件判断&#xff1a;使用 if-else 语句可以根据条件执行不同的代码…

【力扣每日一题】2023.8.15 字符中的查找与替换

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目很长&#xff0c;简而言之就是检查字符串中对应索引的位置是否有特定的字符串&#xff0c;如果有&#xff0c;那么替换&#xff0c;返…

Ceph如何操作底层对象数据

1.基本原理介绍 1.1 ceph中的对象(object) 在Ceph存储中&#xff0c;一切数据最终都会以对象(Object)的形式存储在硬盘&#xff08;OSD&#xff09;上&#xff0c;每个的Object默认大小为4M。 通过rados命令&#xff0c;可以查看一个存储池中的所有object信息&#xff0c;例如…