原因
Jenkins在集成整体包build时会有输入其他Jenkins项目版本号的操作,但有时候会拉取多个
项目的版本号,如果每次手动输入就很麻烦,此时可使用curl命令携带参数进行打包
curl方式打包
格式:curl -X POST JENKINS_URL/job/JOB_NAME/build --user USER:TOKEN --data-urlencode json='{"parameter": [{"name":"id", "value":"123"}, {"name":"verbosity", "value":"high"}]}'
实例:curl --user admin:116359855d83223730b9a6badfe62fb4f7 -X POST http://localhost:8080/job/demo/build --data json='{"parameter":[{"name":"BRANCH","value":"dev-2"},{"name":"BRANCH_NUMBER","value":""},{"name":"buildVersion","value":"1.6"},{"name":"releaseVersion","value":"166"},{"name":"DPServiceBuildID","value":"212"}]}'
注1:--user 可使用--cookie代替,如curl -X POST JENKINS_URL/job/JOB_NAME/build --cookie “...” --data-urlencode json='{"parameter": [{"name":"id", "value":"123"}, {"name":"verbosity", "value":"high"}]}'
注2:token来源于Jenkins用户设置中的token生成
扩展:python脚本
#!/usr/bin/python
#encoding=utf8
#Python 3.10.5
import os,sys
import json
import datetime,getopt,glob,time
import requests, subprocess
from bs4 import BeautifulSoup
def init():
global FILE_NAME
global IOT_VERSION
global JENKINS_USER
global JENKINS_HOST
global JENKINS_TOKEN
global PARAMETER_TYPE
global PARAMETER_JSON
FILE_NAME="Jenkins.html"
JENKINS_USER="louys1"
JENKINS_HOST="http://localhost:8080/jenkins/job/demo"
JENKINS_TOKEN="116359855d83223730b9a6badfe62fb4f7"
PARAMETER_TYPE="notype"
PARAMETER_JSON='{"parameter":[{"name":"BRANCH","value":"master"},{"name":"buildVersion","value":"1.6.6"}]}'
getoptions()
def curl_jenknis():
#cmd = ("curl --user %s:%s %s/%s/parameters/" % (JENKINS_USER,JENKINS_TOKEN,JENKINS_HOST,IOT_VERSION))
#html = subprocess.check_output(cmd)
#return html
html = requests.get(("%s/%s/parameters/" % (JENKINS_HOST,IOT_VERSION)),auth=(JENKINS_USER,JENKINS_TOKEN))
return html.text
def getParameters(soup):
string="{\"parameter\": ["
for aa in soup.html.body.find_all('div'):
if aa.get('class') == None:
continue
if aa.get('class')[0] == "tr":
for bb in aa.find_all('div'):
if bb.get('class') == None:
continue
if bb.get('class')[0] == "setting-name":
string+="{\n \"name\": \"%s\",\n \"value\": \"%s\"\n}," % (bb.contents[0],aa.input['value'])
string = string[:-1]
string += "]}"
return string
def build():
headers={"Content-Type":"application/x-www-form-urlencoded"}
auth=(JENKINS_USER,JENKINS_TOKEN)
#cmd = ("curl --user %s:%s -X POST %s/build --data json=%s" % (JENKINS_USER,JENKINS_TOKEN,JENKINS_HOST,PARAMETER_JSON))
resault=requests.post(JENKINS_HOST+"/build",data=PARAMETER_JSON,auth=auth,headers=headers)
print (resault.text)
def getoptions():
global FILE_NAME
global IOT_VERSION
global JENKINS_USER
global JENKINS_TOKEN
global PARAMETER_TYPE
global PARAMETER_JSON
argv_parse = ["help","fileName=","token=","user=","parameter_json"]
try:
opts, args = getopt.getopt(sys.argv[1:], "v:t:",argv_parse)
if len(opts) == 0:
usage()
except getopt.GetoptError:
usage()
for opt, arg in opts:
if opt in ("-h", "--help"):
usage()
elif opt == '-v':
IOT_VERSION = arg
elif opt == '--fileName':
FILE_NAME = arg
elif opt == '--user':
JENKINS_USER = arg
elif opt == '--token':
JENKINS_TOKEN = arg
elif opt == '--parameter_json':
PARAMETER_JSON = arg
elif opt == '-t':
PARAMETER_TYPE = arg
else:
pass
def usage():
usage_str = '''
usage: %(script)s [选项 ...]
选项:
-t <type> 获取参数类型: local 本地文件读取 jenkins jenkins页面读取 build 传递参数在jenkins打包
jenkins 必要参数:
-v <version> 指定版本,例: -v 674
--user <user> 指定jenkins用户,默认 louys1
--token <token> 指定jenkins使用token值,默认为louys1用户设置值
local 必要参数:
--fileName <string> 从指定文件读取内容获取参数(默认Jenkins.html),例: --fileName=Jenkins.html
build 可选参数:
--parameter_json json类型的参数,例: --parameter_json='json={"parameter":[{"name":"BRANCH","value":"dev"},{"name":"VERSION","value":"166"}'
使用示例:
python -t local --fileName=Jenkins.html
python -t jenkins -v 674
python -t build
''' % {'script':sys.argv[0]}
print(usage_str)
sys.exit(254)
def start():
init()
if PARAMETER_TYPE == "local":
soup = BeautifulSoup(open(FILE_NAME,encoding='UTF-8'),'html.parser')
elif PARAMETER_TYPE == "jenkins":
curl_string = curl_jenknis()
soup = BeautifulSoup(curl_string,'html.parser')
elif PARAMETER_TYPE == "build":
build()
sys.exit(254)
else:
usage()
parameters = getParameters(soup)
print (parameters)
if __name__ == '__main__':
start()