最近,要搭建多套测试环境,需要把 Jenkins 中 dev 视图下的所有任务批量复制到 sit 等视图下。

说明

Jenkins 任务名称规则为:[测试环境标识]-[工程名称],如:dev-daodaotest,sit-daodaotest

视图中显示任务的正则表达式:[测试环境标识]-.* ,如:dev-.*,sit-.*

第一种:目录下批量复制

Jenkins 的任务都是以 xml 文件方式存储的,所有可以通过复制 xml 的方式来批量创建。

# 进入 jobs 目录下
$ cd ~/.jenkins/jobs # 创建批量复制 shell 脚本
$ vi copyViewJobs.sh
#!/bin/bash # 视图名称
viewName=$1
# 新视图名称
newViewName=$2 cd /home/jenkins/.jenkins/jobs/
# 循环复制任务
for jobName in `ls /home/jenkins/.jenkins/jobs/`
do
# 判断文件存在并且是目录
if test -d $jobName
then
# 目录为 $viewName 开头,则进行复制
if [[ $jobName == $viewName-* ]]; then
# 截取工程名称
name=`echo $jobName|awk 'BEGIN{FS="'$viewName'-"} {print $2}'`
newJobName=$newViewName-$name
echo $newJobName
# 复制 config.xml
mkdir $newJobName && cp $jobName/config.xml $newJobName/
fi
fi
done # 执行批量复制脚本,dev 视图下的任务负责到 sit 视图下
$ sh copyViewJobs.sh dev sit

注意:复制完成后,Jenkins 需要重新加载配置才可以生效。操作菜单路径:Manage Jenkins --》 Reload Configuration from Disk

第二种:jenkins-cli

实现步骤与第一种类似,大家可以根据自己擅长的脚本语言来实现即可。下面简单介绍下关键命令。

jenkins-cli 使用方法见:http://localhost:8080/cli

# 下载 jenkins-cli.jar
$ wget http://localhost:8080/jnlpJars/jenkins-cli.jar # 获取视图下的所有任务
$ java -jar jenkins-cli.jar -s http://localhost:8080/ -auth daodaotest:daodaotest list-jobs dev # 复制任务
$ java -jar jenkins-cli.jar -s http://localhost:8080/ -auth daodaotest:daodaotest copy-job dev-daodaotest sit-daodaotest

第三种:REST API

同第二种,仅介绍关键命令。这里以 python-jenkins api 为例。

python-jenkins 官网地址:https://opendev.org/jjb/python-jenkins

安装 Python Jenkins

# 安装 pip
$ sudo yum install epel-release && sudo yum install python-pip # 安装 python-jenkins
$ pip install python-jenkins

获取视图下任务名称

import jenkins

server = jenkins.Jenkins('http://localhost:8080', username='daodaotest', password='daodaotest')

# 查询 dev 视图下的所有任务
jobs = server.get_jobs(folder_depth=0, view_name='dev') # 循环打印任务名称
for job in jobs:
print(job['fullname'])

复制任务

import jenkins

server = jenkins.Jenkins('http://localhost:8080', username='daodaotest', password='daodaotest')

# 任务是否存在,True 为存在,Fasle 为不存在
print(server.job_exists('dev-daodaotest')) # 复制任务
server.copy_job('dev-daodaotest','sit-daodaotest') # 打印任务信息
jobinfo = server.get_job_info('sit-daodaotest')
print(jobinfo)

请求报错 "Error 403 No valid crumb was included in the request"

错误原因: jenkins 在 http 请求头部中放置了一个名为 .crumb 的 token。在使用了反向代理,并且在 jenkins 设置中勾选了“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)”之后此 token 会被转发服务器 nginx 认为是不合法头部而去掉,导致跳转失败。

解决办法:在 Jenkins 的安全设置中取消“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)”。

Jenkins 批量创建任务的三种方法的更多相关文章

  1. java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  2. 《Java多线程面试题》系列-创建线程的三种方法及其区别

    1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...

  3. cocos2dx中创建动画的三种方法

    1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...

  4. Java并发编程(二)创建线程的三种方法

    进程与线程 1.  进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线 ...

  5. python 多线程编程之threading模块(Thread类)创建线程的三种方法

    摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...

  6. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 一.继承Thread类来创建线程 1.创建一个任务类,继承Thread线程类,因为Thread类已经实现了Runnable接口,然后重写run( ...

  7. MySQL创建用户的三种方法 (并授权)转

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  8. ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3

    老师信息管理   三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边:  s ...

  9. Java中创建线程的三种方法以及区别

    Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线 ...

随机推荐

  1. Symantec NBU :Unable to retrieve version of the server xxx.xxx.xxx

    Symantec NetBackup  是赛门铁克收购的veritas公司的一款产品,该产品功能强大,据称堪称备份界的鼻祖. 其具体原理和备份方式可见:https://blog.51cto.com/s ...

  2. tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发

    为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...

  3. 修改imx6ull开机LOGO(一)

    imx6ull启动的时候默认显示uboot自带的开机画面,按照如下步骤修改为我们想要的开机画面,如下: 首先去掉液晶屏右上角的打印信息   修改/drivers/video/cfb_console.c ...

  4. CF1324E Sleeping Schedule 题解

    原题链接 简要题意: 每次可以将 \(a_i\) 减 \(1\) 或不变.求让 \(a_i\) 的前缀和 \(\% h\) 的值在 \([l,r]\) 区间中的最多的个数. E题是个水dp,也不怎样 ...

  5. 升级 nop 4.1 Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.

    Incorrect syntax near 'OFFSET'.  Invalid usage of the option NEXT in the FETCH statement. nop.web 项目 ...

  6. 1、Spark Core所处位置和主要职责

    Spark组件是基于分布式资源引擎层(Yarn等)和分布式存储层(HDFS等)之上的一个组件,Spark本质上是一个计算引擎,负责计算的,根据不同计算场景划分出了SQL.Streaming.MLib. ...

  7. 多线程之旅(ThreadPool 线程池)

    一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...

  8. Thinking in Java学习杂记(5-6章)

    Java中可以通过访问控制符来控制访问权限.其中包含的类别有:public, "有好的"(无关键字), protected 以及 private.在C++中,访问指示符控制着它后面 ...

  9. Java GC(垃圾回收)机制知识总结

    目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...

  10. CF 1012C Dp

    Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlasting cit ...