首页 > 解决方案 > 从 Jenkins 上传的 JRXML 提供 HTTP-500,但在其他地方也可以使用

问题描述

我正在使用 Jasper REST API 在 Jasper 服务器上发布报告。

以下是场景:

  1. 当我从 POSTMAN 上传 .JRXML 文件,然后使用 JRXML 从 POSTMAN 创建报告时。有用。
  2. 当我从 POSTMAN 上传 .JRXML 文件,然后使用 JRXML 从 Jenkins 创建报告时。有用。
  3. 当我从 Jenkins 上传 .JRXML 文件,然后使用 JRXML 从 Jenkins 创建报告时。它给了我 HTTP 500 错误
  4. 当我从 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"
                            '''    
                        }
                    }
                }
            }
        }
    }
}    

我究竟做错了什么?任何帮助是极大的赞赏。

标签: jenkinscurljasperserver

解决方案


好的,所以我让它工作了。显然,我没有意识到在使用 --data-binary 选项引用/传递文件时,您需要在其前面加上“@”符号。

因此将第 61 行从--data-binary "$WORKSPACE/report-templates/${JRXML_FILE}"改为--data-binary "@$WORKSPACE/report-templates/${JRXML_FILE}"就可以了。否则,它只是将绝对路径保存为文件的内容,而不是实际的 XML 数据。


推荐阅读