我正在设置Jenkins管道构建,并开始在多个作业中使用相同的方法,因此是时候将这些常用方法放入共享库中了。
我创建的第一个函数是使用某些单元测试的结果更新GitHub。我有一个问题,我可以从命令行运行此函数,但在我的Jenkins构建中使用它时它不起作用,我似乎无法在Jenkins控制台中获得任何调试输出
这是我的共享库的目录结构
my-project
src
vars
- getCommitId.groovy
- gitUpdateStatus.groovy
所以第一个函数getCommitId
工作正常
#!/usr/bin/env groovy
def call() {
commit_id = sh script: 'git rev-parse HEAD', returnStdout: true
commit_id = commit_id.replaceAll("\\s","") // Remove Whitespace
return commit_id
}
返回正确的值
这是gitUpdateStatus
#!/usr/bin/env groovy
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7')
import static groovyx.net.http.ContentType.JSON
import static groovyx.net.http.Method.POST
import groovyx.net.http.HTTPBuilder
String targetUrl = 'https://api.github.com/repos/myRepo/'
def http = new HTTPBuilder(targetUrl)
http.request(POST) {
uri.path = "repo/statuses/12345678"
requestContentType = JSON
body = [state: 'success', description: 'Jenkins Unit Tests', target_url: 'http://test.co.uk', context: 'unit tests']
headers.'Authorization' = "token myOauthTokenHere"
headers.'User-Agent' = 'Jenkins Status Update'
headers.Accept = 'application/json'
response.success = { resp, json ->
println "GitHub updated successfully! ${resp.status}"
}
response.failure = { resp, json ->
println "GitHub update Failure! ${resp.status} " + json.message
}
}
我可以通过命令行运行这个,但是当作为Jenkins构建运行时我没有输出。
我的詹金斯文件
@Library('echo-jenkins-shared')_
node {
GIT_COMMIT_ID = getGitCommitId()
echo "GIT COMMIT ID: ${GIT_COMMIT_ID}"
gitUpdateStatus(GIT_COMMIT_ID)
}
为什么这不起作用或者可以转换为仅使用本机Groovy方法?
答案 0 :(得分:1)
首先,我建议您使用https://requestb.in之类的服务来检查您的代码是否实际执行了HTTP调用。
其次,我建议不要在Jenkins管道中使用基于@Grab
的依赖关系,例如HTTPBuilder
,而是http_request
插件,而不是可下载的&可以.hpi
安装:
https://jenkins.io/doc/pipeline/steps/http_request/
最后,您可以在此处找到用于执行HTTP请求的实用程序类的示例: https://github.com/voyages-sncf-technologies/hesperides-jenkins-lib/blob/master/src/com/vsct/dt/hesperides/jenkins/pipelines/http/HTTPBuilderRequester.groovy 根据其背后的基本原理解释:https://github.com/voyages-sncf-technologies/hesperides-jenkins-lib#httprequester