jenkins项目迁移

jenkins利用rest api项目迁移

  • 引言
  • 具体方案
  • 具体实现
  • 注意事项

引言

jenkins 怎么玩这里不做重复,主要是说jenkins迁移的问题,差了网上的方案都是复制整个jobs、users、plugin目录还有config.xml,如果数据不多还好但是jobs如果保留了很多的构建历史,那么真个jobs目录可能会达到10g甚至更多,这里提供一个相对来说优雅的方案

具体方案

Jenkins 提供了rest api可以用来进行构建等操作,api地址,这个主要是api的大致描述
如果想看具体的api访问 自己的JENKINS_URL/api 即可
jenkins项目迁移_第1张图片
红框部分是关键,我们可以通过api调用方式生成job,如果按照指定的xml也行,name参数指定job名
xml在jenkins目录的jobs下面
jenkins 默认调用时开启伪站点访问的,也就是说需要在请求头中加入某些密钥参数,这部分描述可以在上文api地址中找到
jenkins项目迁移_第2张图片
那么接下来事情就简单了,我们需要事先拿到这个访问密钥,然后通过密钥的指定的xml调用api来生成job

具体实现

我是通过shell脚本实现的

#!/bin/bash

para="para: ";
# jenkins用户名
user=''
# jenkins密码
pass=''
# 旧的jenkins 文件目录
dir=''
# 新的jenkins地址 
url=''

while [ $# -ge 2 ] ; do
        case "$1" in
                -u) user=$2; shift 2;;
                -p) pass=$2; shift 2;;
		-d) dir=$2; shift 2;;
		-l) url=$2; shift 2;;
                *) echo "unknown parameter $1." ; exit 1 ; break;;
        esac
done

echo "user=$user  pass=$pass  dir=$dir url=$url"

echo "获取jenkins crumb....."
# 请求获取jenkins crumb
crumb=`wget -q --auth-no-challenge --user $user --password $pass --output-document - ''${url}'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'`

echo "crumb ==> $crumb"

job_dir=$dir/jobs

jobs=`ls $job_dir`
echo "jenkins job迁移 $jobs"

# 调用api创建job的函数
function createItem(){
	xml=$1
	item=$2
	echo "当前创建的item ==> $item, xml 地址 ==> $xml"
	result=`curl -X POST -u $user:$pass -H "Content-Type:application/xml" -H "$crumb" -d "@$xml" $url/createItem?name=$item`
	#echo $result
}

# 便利原来的jenkins的jobs目录,获取job的config.xml,
for job_file in $jobs
do
	configPath=$job_dir/$job_file/config.xml
	if [ ! -f "$configPath" ]; then
 		echo "config文件不存在 $configPath"
		break
	fi
	echo $configPath
	createItem $configPath $job_file
	sleep 1
done

将脚本保存为jenkins_backup.sh

下面执行下就行

 sh jenkins_backup.sh -u {user} -p {pass} -d /var/lib/jenkins -l http://xxxx:8080

注意事项

  • jenkins的crumb机制要测试下,看看一样的用户在同一天访问会不会改编,我试过在一天内2.176.2版本的jenkins的crumb是不会改变的,最新版的2.40是会改变的,可能有时效性,那么就需要每次请求创建job之前都需要请求接口去获取crumb
  • 迁移的Jenkins和旧的Jenkins版本最好一致,环境也最好一致(特别是插件),因为如果缺少插件有些config.xml是解析不了的,会导致有些项目能导入有些不行

你可能感兴趣的:(jenkins,jenkens,服务器)