从 Jenkins Groovy 脚本访问 GitLab JSON
Accessing GitLab JSON from Jenkins Groovy script
在我正在进行的项目中,我们将 GitLab CE 与 Jenkins 一起用于 CI。
目前我们使用 Jenkins 作业合并更改,只需将分支名称作为输入参数传递。我想创建一个作业,它采用合并请求 ID(例如 123)并使用 GitLab URL API 来获取信息,例如源分支、目标分支等,然后完成其余的工作(构建、合并)。
我是一个完全的初学者(对于 Jenkins 和 Groovy)我所做的只是:
// Removing whitespace from input parameter
def mergeRequest = MergeRequestID
mergeRequest = mergeRequest.replaceAll("\s","")
// Obtaining JSON with merge request information, 13 is an ID of the project
def apiURL = new URL("https://example.com/api/v4/projects/13/merge_requests/" + mergeRequest)
List json = new JsonSlurper().parse(apiUrl.newReader())
// Here: check for upvotes/downvotes, discussions or anything else.
assert json.upvotes >= 2 : "Request should have at least 2 upvotes"
assert json.downvotes == 0 : "Request cannot have any downvotes"
assert json.target_branch == "master": "Target branch is not set to master"
def map = ["sourceBranchName ": json.source_branch, "targetBranchName ": json.target_branch]
return map
我最终遇到了 FileNotFoundException,后来,我发现在尝试从该作业访问此 URL 时收到 404 响应,但它在我的浏览器中有效。我认为这可能是 Jenkins 机器的授权问题。
我知道我们在 Jenkins 中有一些 gitlab 插件并且可以进行通信(过去我们设法使用 webhook 或 post 返回 GitLab 上的构建状态来触发构建)。 我可以使用任何其他方式在 groovy 脚本(在开始或作业执行)中获取此 JSON 吗?
原来是身份验证问题。
我通过在请求的 header 中提供 GitLab API 私有令牌解决了这个问题:
...
import com.cloudbees.plugins.credentials.CredentialsProvider
import com.dabsquared.gitlabjenkins.connection.GitLabApiTokenImpl
def branch = Branch
branch = branch.replaceAll("\s","")
// Get GitLab API token(s) already stored in Jenkins credentials
def gitlabToken = CredentialsProvider.lookupCredentials(GitLabApiTokenImpl.class).apiToken[0]
def mergeRequestURL = new URL("https://example.com/api/v4/projects/1/merge_requests/" + branch)
// Put the token in request properties before sending it
def contentJson = new JsonSlurper().parse(
mergeRequestURL.newReader(
requestProperties: ['Private-Token': gitlabToken.toString()]))
def map = ["Branch": contentJson.source_branch]
return map
在我正在进行的项目中,我们将 GitLab CE 与 Jenkins 一起用于 CI。
目前我们使用 Jenkins 作业合并更改,只需将分支名称作为输入参数传递。我想创建一个作业,它采用合并请求 ID(例如 123)并使用 GitLab URL API 来获取信息,例如源分支、目标分支等,然后完成其余的工作(构建、合并)。
我是一个完全的初学者(对于 Jenkins 和 Groovy)我所做的只是:
// Removing whitespace from input parameter
def mergeRequest = MergeRequestID
mergeRequest = mergeRequest.replaceAll("\s","")
// Obtaining JSON with merge request information, 13 is an ID of the project
def apiURL = new URL("https://example.com/api/v4/projects/13/merge_requests/" + mergeRequest)
List json = new JsonSlurper().parse(apiUrl.newReader())
// Here: check for upvotes/downvotes, discussions or anything else.
assert json.upvotes >= 2 : "Request should have at least 2 upvotes"
assert json.downvotes == 0 : "Request cannot have any downvotes"
assert json.target_branch == "master": "Target branch is not set to master"
def map = ["sourceBranchName ": json.source_branch, "targetBranchName ": json.target_branch]
return map
我最终遇到了 FileNotFoundException,后来,我发现在尝试从该作业访问此 URL 时收到 404 响应,但它在我的浏览器中有效。我认为这可能是 Jenkins 机器的授权问题。
我知道我们在 Jenkins 中有一些 gitlab 插件并且可以进行通信(过去我们设法使用 webhook 或 post 返回 GitLab 上的构建状态来触发构建)。 我可以使用任何其他方式在 groovy 脚本(在开始或作业执行)中获取此 JSON 吗?
原来是身份验证问题。
我通过在请求的 header 中提供 GitLab API 私有令牌解决了这个问题:
...
import com.cloudbees.plugins.credentials.CredentialsProvider
import com.dabsquared.gitlabjenkins.connection.GitLabApiTokenImpl
def branch = Branch
branch = branch.replaceAll("\s","")
// Get GitLab API token(s) already stored in Jenkins credentials
def gitlabToken = CredentialsProvider.lookupCredentials(GitLabApiTokenImpl.class).apiToken[0]
def mergeRequestURL = new URL("https://example.com/api/v4/projects/1/merge_requests/" + branch)
// Put the token in request properties before sending it
def contentJson = new JsonSlurper().parse(
mergeRequestURL.newReader(
requestProperties: ['Private-Token': gitlabToken.toString()]))
def map = ["Branch": contentJson.source_branch]
return map