从 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