jenkins中pipeline发送http请求
前提:第⼀次接触pipeline,完全是边查边写,有些艰难,所以写⼀下,备忘
1、需求
pipeline中,编译打包的流程已经完成了,现在需要将打好的包(制品),上传到产品发布系统,产品发布系统没有直接提供上传的⽬录,⽽是给了三个接⼝
1)get_token:发送secret_str(RSA公钥加密),获取token;
2)upload_file:发送token以及⽂件,获取返回值中的file_id;
3)software_info:发送token以及file_id,最终发布成功
2、发送Http请求
1、其中第⼀个GET请求,第三个POST请求都可以在⽹上查到
使⽤HttpRequest,需要先安装HttpRequest插件:jenkins---系统管理---插件管理---可选插件---搜索:“HTTP Request Plugin”---安装(不⽤重启jenkins也能使⽤)
2、POST请求上传⽂件,⽹上不到资料,各种尝试也没成功
@Grab报错
//@Grab(group='vy.modules.http-builder', module='http-builder', version='0.7' )
//import groovyx.http.HTTPBuilder
2)最终⽤命令实现的
def response = sh returnStdout: true, script: """curl ip:port/testController/upload_file -F "file=@${filePath}" -F "sys_id=${sys_id}" -F 'token=${token}' ""刚开始直接使⽤sh命令,由于对语法不熟,为了获取curl命令的返回值还折腾了很久,后来同事帮忙才知道直接可以获取返回值!
设置returnStdout: true 就可获取返回值
不靠谱的⽅式如下:
def proc = """${env.WORKSPACE}/ci/publish/publish_upload.sh ${token}""".execute()
proc.waitForOrkill(9000) ##这个⽅法总导致失败
println "out> $sout"
3、脚本中涉及到加密函数、解析json函数,需要在pipeline代码块之外,写个⽅法 加@NonCPS注解(原因不清楚)
4、如果都使⽤curl命令,其实postman可以直接导出shell脚本,这⾥只上传⽂件的接⼝使⽤了curl命令
postman测试接⼝成功后,可以直接点击“Code”---选择语⾔
5、脚本如下:
pto.Cipher
import java.security.KeyFactory
import java.security.PublicKey
import java.security.spec.X509EncodedKeySpec
import groovy.json.JsonSlurperClassic
import java.util.Base64;
import java.util.Base64.Decoder;
@NonCPS
def jsonParse(def json) {
new groovy.json.JsonSlurperClassic().parseText(json)
}
@NonCPS
def getSecretStr(def sysName){
//RSA最⼤加密明⽂⼤⼩
int MAX_ENCRYPT_BLOCK = 117;
//secret_str 参数规范: DataEcho+时间戳
String inputText = sysName + "-" +System.currentTimeMillis();
String publicKeyStr = "秘钥串";
//获取公钥
byte[] keyBytes =(MimeDecoder()).decode(publicKeyStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = Instance("RSA");
PublicKey publicKey = atePublic(keySpec);
//加密
byte[] Bytes();
Cipher cipher = Instance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
int inputLen = plainText.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
int i = 0;
byte[] cache;
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(plainText, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(plainText, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptText = ByteArray();
out.close();
//Base64编码
String secret_str = new String((MimeEncoder()).encode(encryptText));
return secret_str
}
pipeline {
agent {
label 'master'
}
options {
// 只保存最近20条构建
buildDiscarder(logRotator(numToKeepStr: '20'))
}
parameters {
// 是否构建制品包
booleanParam(name: 'generated_console_products', defaultValue: false, description: '是否⽣成制品') }
stages {
stage(...){
...其他步骤
}
//调⽤接⼝上传console包⾄产品发布系统
stage('上传产品发布系统') {
steps {
script {
if (generated_console_products) { //⽤户选择⽣成console制品
def sys_id = "Test"
def basic_name = "Test"
def version = 1.2.3
def svn_address = "ip/test/src/Test/code/trunk/test"
def new_function_desc = "new function desc 0508"
def fix_bug_desc = "fix bug desc 0508"
def test_report = "test repoet 0508"
//⼀、获取token (Get请求 ip:port/AutoPublishController/get_token?secret_str=参数) // 参数:secret_str ( ⾮对称加密(sys_id-时间戳,传递时请使⽤Base64转码)、必传)
//返回值:token
//1、1⽣成secret_str
def secret_str = de(getSecretStr("Test"), "UTF-8");
def response1 = httpRequest contentType: 'APPLICATION_JSON',
httpMode: "GET",
url: "ip:port/AutoPublishController/get_token?secret_str=${secret_str}"
println response1.status
t
t
def states = t)
def token = states['token']
println "token:" + token
if (t != null && 200 == states['code']) {
println "获取token成功"
//⼆、上传压缩包(post请求 ip:port/AutoPublishController/upload_file?token=参数1&sys_id=参数2 file 参数3)
//参数1:sys_id (系统id,参考固定参数说明、必传)
//参数2:token (票据(系统返回的内容)、必传)
//参数3:file (⽂件流必传)
//返回值:file_id(系统返回的⽂件id)
def filePath = "/data/jenkins/workspace/TestA/package/boot/package/1.3_boot/distr/"
def response2 = sh returnStdout: true, script: """curl ip:port/AutoPublishController/upload_file -F "file=@${
filePath
}" -F "sys_id=${sys_id}" -F 'token=${token}' """
println "response2" + response2
states = jsonParse(response2)
if (response2 != null && 200 == states['code']) {
println "上传⽂件成功"
def file_id = states['file_id']
println file_id
//三、发布信息(post请求 ip:port/AutoPublishController/software_info/)
//参数1:sys_id
//参数2:token
/
/参数3:basic_name (⽤于关联产品、必传)
//参数4:version (版本必传)
//参数5:new_function_desc (新功能描述信息,可在svn提交记录中抓取暂时⾮必传)
//参数6:fix_bug_desc(修复问题描述可在svn提交记录中抓取暂时⾮必传)
//参数7:test_report(测试报告⾮必传)
//参数8:svn_address (svn地址必传)
//参数9:file_id(⽂件上传后返回的id 必填)
def param3 = "sys_id=${sys_id}&token=${token}&basic_name=${basic_name}&version=${version}&new_function_desc=${new_function_desc println param3
cipher命令def response3 = httpRequest consoleLogResponseBody: true,
contentType: 'APPLICATION_FORM',
httpMode: 'POST',
requestBody: param3,
url: "ip:port/AutoPublishController/software_info",
validResponseCodes: '200'
println response3.status
t
} else {
println "上传⽂件失败"
}
} else {
println "获取token失败"
}
}else{
println "因为未⽣成制品,所以未上传产品发布系统!"
}
} }
}
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论