jenkins - 从 Jenkins 上传的 JRXML 提供 HTTP-500,但在其他地方也可以使用
问题描述
我正在使用 Jasper REST API 在 Jasper 服务器上发布报告。
以下是场景:
- 当我从 POSTMAN 上传 .JRXML 文件,然后使用 JRXML 从 POSTMAN 创建报告时。有用。
- 当我从 POSTMAN 上传 .JRXML 文件,然后使用 JRXML 从 Jenkins 创建报告时。有用。
- 当我从 Jenkins 上传 .JRXML 文件,然后使用 JRXML 从 Jenkins 创建报告时。它给了我 HTTP 500 错误
- 当我从 Jenkins 上传 .JRXML 文件,然后使用 JRXML 从 Jenkins 创建报告时。它给了我 HTTP 500 错误。
我什至尝试过使用 cURL 并且效果很好。它只是给出错误的詹金斯。我尝试了很多东西,但没有结果。
邮递员的卷曲:
#To upload JRXML
curl --location --request POST 'https://server-url/jasperserver-pro/rest_v2/resources/Reports/' \
--header 'Content-Type: application/jrxml' \
--header 'Content-Disposition: attachment; filename=form.jrxml' \
--header 'Content-Description: Uploaded jrxml file POSTMAN' \
--header 'Authorization: Basic %Base64 Creds%' \
--data-binary 'report-templates/form.jrxml'
#To create report
curl --location --request POST 'https://server-url/jasperserver-pro/rest_v2/resources/Reports' \
--header 'Content-Type: application/repository.reportUnit+xml' \
--header 'Authorization: Basic Base64 Creds' \
--data-raw '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportUnit>
<description/>
<label>new_report1</label>
<permissionMask>1</permissionMask>
<uri>/Reports</uri>
<version>0</version>
<dataSourceReference>
<uri>/Data_Sources/mysql</uri>
</dataSourceReference>
<alwaysPromptControls>true</alwaysPromptControls>
<controlsLayout>popupScreen</controlsLayout>
<inputControlRenderingView/>
<jrxmlFileReference>
<uri>/Reports/form.jrxml</uri>
</jrxmlFileReference>
</reportUnit>'
詹金斯文件:
pipeline {
agent any
parameters{
string(defaultValue: 'form5_report', description: 'Provide the name of JRXML file, without the extension that should be used to create report. Defaults to form5_report.', name: 'JRXML_FILE', trim: false)
string(defaultValue: "${params.JRXML_FILE}.${BUILD_NUMBER}", description: 'Provide a name for the generated report. By default, it would be same as JRXML with BUILD_NUMBER.', name: 'TESTUNIT', trim: false)
}
environment{
JRXML_FILE = "${JRXML_FILE}.jrxml"
def XML = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<reportUnit>
<description/>
<label>${TESTUNIT}</label>
<permissionMask>1</permissionMask>
<uri>/Reports</uri>
<version>0</version>
<dataSourceReference>
<uri>/Data_Sources/mysql</uri>
</dataSourceReference>
<alwaysPromptControls>true</alwaysPromptControls>
<controlsLayout>popupScreen</controlsLayout>
<inputControlRenderingView/>
<jrxmlFileReference>
<uri>/Reports/${JRXML_FILE}</uri>
</jrxmlFileReference>
</reportUnit>"""
}
stages {
stage('File Check') {
steps {
script {
String url = "https://server-url/jasperserver-pro/rest_v2/resources?q=${JRXML_FILE}"
def (String code) =
sh(script: "curl -s -o /dev/null -w '%{http_code}' -H 'Authorization: Basic base64 creds' $url", returnStdout: true).trim().tokenize("\n")
if(code == '200'){
stage ('Create Report'){
sh '''
curl --location --request POST 'https://server-url/jasperserver-pro/rest_v2/resources/Reports' \
--header 'Content-Type: application/repository.reportUnit+xml' \
--header 'Authorization: Basic base64 creds' \
-d "$XML"
'''
}
}else{
stage('SCM Checkout'){
git branch: 'branchname',
credentialsId: 'git',
url: 'repo_URL'
}
stage('Upload JRXML File to JasperServer'){
sh '''
curl --location --request POST 'https://server-url/jasperserver-pro/rest_v2/resources/Reports/' \
--header 'Content-Type: application/jrxml' \
--header "Content-Disposition: attachment; filename=${JRXML_FILE}" \
--header 'Content-Description: Uploaded jrxml file' \
--header 'Authorization: Basic base64 creds' \
--data-binary "$WORKSPACE/${JRXML_FILE}"
'''
}
stage('Create Report'){
sh '''
curl --location --request POST 'https://server-url/jasperserver-pro/rest_v2/resources/Reports' \
--header 'Content-Type: application/repository.reportUnit+xml' \
--header 'Authorization: Basic base64 creds' \
-d "$XML"
'''
}
}
}
}
}
}
}
我究竟做错了什么?任何帮助是极大的赞赏。
解决方案
好的,所以我让它工作了。显然,我没有意识到在使用 --data-binary 选项引用/传递文件时,您需要在其前面加上“@”符号。
因此将第 61 行从--data-binary "$WORKSPACE/report-templates/${JRXML_FILE}"
改为--data-binary "@$WORKSPACE/report-templates/${JRXML_FILE}"
就可以了。否则,它只是将绝对路径保存为文件的内容,而不是实际的 XML 数据。
推荐阅读
- jenkins-pipeline - Jenkins 管道“git push”在 Windows 构建节点上失败?
- javascript - 在对象中具有未定义/未设置参数的建议方法
- java - 休眠验证器规范
- python - 无法将对象数据类型转换为在熊猫数据框中浮动
- laravel - Laravel Notification Markdown - 未定义的变量
- c# - GCP Google Cloud Platform - Cloud Run - .NET 5.0 - 来自秘密或转换 appsettings.json 的应用程序设置
- docker-compose - 在普罗米修斯中无法获得正确的实例名称
- javascript - 这两个逻辑运算符条件相同吗?
- docker - VSCODE 扩展远程容器不允许我使用“workspaceMount”
- python - SQLParse 删除注释后截断剩余的 sql