我正在尝试动态读取数组(每个元素是一个字符串),并使用这些字符串值替换当前的硬编码用户名。这是用于在Bitbucket中创建拉取请求。
下面的#1和#2都属于同一类BitbucketUtil.groovy
def createPullRequest(projectSlug, repoSlug, title, description, sourceBranch, targetBranch) { //this is reading in the array with the user names def names = BitbutkcetUtil.getGroupUsers(teamName, activeOnly) def prResponse = this.steps.httpRequest( acceptType: 'APPLICATION_JSON', authentication: this.userId, contentType: 'APPLICATION_JSON', httpMode: 'POST', ignoreSslErrors: true, quiet: true, requestBody: """ { "title": "${title}", "description": "${description}", "state": "OPEN", "open": true, "closed": false, "fromRef": { "id": "${sourceBranch}" }, "toRef": { "id": "${targetBranch}" }, "locked": false, "reviewers": [ //I want to replace this hardcoded names with the string values inside the array `names` { "user": { "name": "HardCoded1" } }, { "user": { "name": "HardCoded2" } }, { "user": { "name": "HardCoded3" } }, { "user": { "name": "HardCoded4" } } ] } """, responseHandle: 'STRING', url: "https://bitbucket.absolute.com/rest/api/latest/projects/${projectSlug}/repos/${repoSlug}/pull-requests", validResponseCodes: '200:299') def pullRequest = this.steps.readJSON(text: prResponse.content) prResponse.close() return pullRequest['id'] }
def getGroupUsers(groupName, activeOnly) { def getUsersResponse = this.steps.httpRequest( acceptType: 'APPLICATION_JSON', authentication: this.userId, ignoreSslErrors: true, quiet: true, responseHandle: 'STRING', url: "https://bitbucket.absolute.com/rest/api/latest/admin/groups/more-members?context=pd-teamthunderbird", validResponseCodes: '200:299') def usersPayload = this.steps.readJSON(text: getUsersResponse.content)['values'] getUsersResponse.close() def users = [] usersPayload.each { user -> if (!activeOnly || (activeOnly && user['active'])) { users.add(user['name']) } } return users //this is returning an array with string elements inside }
我猜想使用该函数getGroupUsers(groupName参数为teamName),我可以替换函数"reviewers"内部的硬编码字符串createPullRequest。但是我不确定如何在“审阅者”下使用for循环,以便可以动态地输入值:
getGroupUsers
groupName
teamName
"reviewers"
createPullRequest
"reviewers": [ //I want to replace this hardcoded names with the string values inside the array `names` { "user": { "name": "HardCoded1" } }, { "user": { "name": "HardCoded2" } }, { "user": { "name": "HardCoded3" } }, { "user": { "name": "HardCoded4" } } ] }
任何帮助将不胜感激。
如果定义了您的姓名,并且您的最终目标是在其中包含所有名称的地方创建一个地图列表,那么您可以仅从collect名称中选择地图。例如
collect
def names = ["HardCoded1", "HardCoded2"] println([reviewers: names.collect{ [user: [name: it]] }]) // => [reviewers:[[user:[name:HardCoded1]], [user:[name:HardCoded2]]]]
如果您的目标是创建JSON正文,请不要连接字符串。使用Groovy提供的功能来创建JSON。例如
groovy.json.JsonOutput.toJson([ title: title, state: "OPEN", reviewers: names.collect{ [user: [name: it]] }], // ... ])