如何在 jenkins 管道中为 httpRequest 编写包装器

问题描述 投票:0回答:0

问题描述:

我正在 jenkins 管道中处理一些任务,这些任务会调用 rest api 很多时间。而且我发现 httpRequest 能够通过以下示例完成任务,因为我有很多调用会有很多代码与下面类似,只有一点点不同。

def response = httpRequest acceptType: 'APPLICATION_JSON', contentType: 'APPLICATION_JSON',
                           httpMode: 'PATCH', requestBody: patchOrg,
                           url: "https://api.github.com/orgs/${orgName}"

我试过的事情

参考https://www.jenkins.io/doc/pipeline/steps/http_request/,httpRequest有很多选项。所以我在下面的函数中添加了一些参数

你可以通过下面的例子调用它

/* refering to https://www.jenkins.io/doc/pipeline/steps/http_request/
*/
def httpCall(url, httpMode='GET', params=[:]) {
    def headers = []
    valuedParams = [
        'acceptType': 'APPLICATION_JSON',
        'authentication': null,
        'consoleLogResponseBody': false,
        'contentType': 'APPLICATION_JSON',
        'headers': [:],
        'requestBody': null,
        'quiet': true,
        'responseHandle': 'NONE',
        'timeout': null,
        'validResponseCodes': '200, 404',
        'validResponseContent': null,
    ]

    for (header in params.get('headers', valuedParams['headers'])) {
        headers.add(['maskValue': true, 'name': header.key, 'value': header.value])
    }
    def response = [
        status: 500,
        content: 'Failed to call ' + url
    ]
    try {
        response = httpRequest \
                    url: url,
                    acceptType: params.get('acceptType', valuedParams['acceptType']),
                    authentication: params.get('authentication', valuedParams['authentication']),
                    consoleLogResponseBody: params.get('consoleLogResponseBody', valuedParams['consoleLogResponseBody']),
                    contentType: params.get('contentType', valuedParams['contentType']),
                    customHeaders: headers,
                    requestBody: params.get('requestBody', valuedParams['requestBody']),
                    quiet: params.get('quiet', valuedParams['quiet']),
                    responseHandle: params.get('responseHandle', valuedParams['responseHandle']),
                    timeout: params.get('timeout', valuedParams['timeout']),
                    validResponseCodes: params.get('validResponseCodes', valuedParams['validResponseCodes']),
                    validResponseContent: params.get('validResponseContent', valuedParams['validResponseContent']),
                    httpMode: httpMode
    } catch (hudson.AbortException e) {
        print('Failed to call api:' + url + 'with exception' + e.message)
    }

    return response
}

pipeline {
    agent any
    stages {
        stage('Hello') {
            steps {
                script {
                    def params = [
                        'acceptType': 'APPLICATION_JSON',
                        'contentType': 'APPLICATION_FORM_DATA',
                        'formData': [:],
                        'quiet': true,
                        'responseHandle': 'NONE',
                        'timeout': null,
                        'validResponseCodes': '200, 404',
                        'validResponseContent': 'token',
                        'customHeaders': [:],
                        'headers': ['Authorization': 'your-token']
                    ]
                    httpCall('https://api.github.com/orgs/', 'GET', params)
                }
            }
        }
    }
}

我的问题:

  1. 如何让这个函数可以处理所有选项https://www.jenkins.io/doc/pipeline/steps/http_request/提供?
  2. 通过添加这个包装函数来减少重复代码是最佳实践吗?
jenkins jenkins-pipeline jenkins-groovy
© www.soinside.com 2019 - 2024. All rights reserved.