如何在groovy中使用组件名称通过JIRA REST API获取组件ID

时间:2017-05-08 17:21:24

标签: java groovy jira-rest-api

我正在编写一个脚本,我需要获取所有故事的组件ID,其中组件标签为R TEST 4.4使用JIRA REST API在groovy中为任何项目附加。

我正在尝试以下代码

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7' )
import groovyx.net.http.RESTClient

final String USAGE =
  "Usage: -Djira.username=xxx -Djira.password=xxx -Djira.Component=R TEST 4.4"

String jiraUsername = 'ABCDEF'
String jiraPassword = '**************'
String jiraComponent = 'R TEST 4.4'

println "Getting issues..."
if (!jiraUsername?.trim()) {
    fail("Empty property: jira.username " + USAGE)
}

if (!jiraPassword?.trim()) {
    fail("Empty property: jira.password " + USAGE)
}

if (!jiraComponent?.trim()) {
     fail("Empty property: jira.component " + USAGE)
}

final String JIRA_SEARCH_URL = "https://jira.testing.com/rest/api/latest/"
// see JIRA docs about search:
// https://docs.atlassian.com/jira/REST/latest/#idp1389824
String JQL = "project = ABCD"
JQL += " AND issuetype in standardIssueTypes()"
JQL += " AND status in (Resolved, Closed)"
JQL += " AND component = \"${jiraComponent}\""

def jira = new RESTClient(JIRA_SEARCH_URL)

def query = [:]
query['os_username'] = jiraUsername
query['os_password'] = jiraPassword
query['jql'] = JQL
query['startAt'] = 0
query['maxResults'] = 1000

try {
    def resp = jira.get(path: "search",
                        contentType: "application/json",
                        query: query)
    resp.status == 200
    (resp.data instanceof net.sf.json.JSON)
    resp.data.ids.each { id ->
        println id.key
    }
    println "Total id's: " + resp.data.total
} catch (groovyx.net.http.HttpResponseException e) {
    if (e.response.status == 400) {
        // HTTP 400: Bad Request, JIRA JQL error
        fail("JIRA query failed: ${e.response.data}", e)
    } else {
        fail("Failure HTTP status ${e.response.status}", e)
    }

}

但是这段代码给了我以下错误。

groovy.lang.MissingMethodException: No signature of method: ConsoleScript5.fail() is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl, groovyx.net.http.HttpResponseException) values: [JIRA query failed: [errorMessages:[The value 'R TEST 4.4' does not exist for the field 'component'.], errors:[:]], ...]
Possible solutions: wait(), find(), any(), wait(long), wait(long, int), main([Ljava.lang.String;)

在JIRA UI中,我可以看到Compoenet / s字段的以下值:

M Doc,R ABC 4.3(早期访问),R TEST 4.4

REST API URL     https://youtu.be/Ur5umC4BwN4"," id":" 595"," name":" R TEST 4.4"

所以基本上我想在这个R TEST 4.4附加的地方使用这个id 595。

1 个答案:

答案 0 :(得分:1)

您的脚本存在许多问题,但您几乎就在那里:

1)没有fail方法,但是你在2个地方调用它,你应该创建一个或以不同方式报告错误。

2)(至少在我的Jira版本中)ids下没有属性resp.data。我想你想循环issues属性。

3)属性fixVersioncomponent实际上是数组(键名是复数)

所以要修复第2点和第2点3你可以这样做:

def resp = jira.get(path: "search",
                    contentType: "application/json",
                    query: query)
assert resp.status == 200
resp.data.issues.each { issue ->
    println "${issue.key} : components:${issue.fields.components*.name} + fixVersions:${issue.fields.fixVersions*.name}"
}
println "Total issues: " + resp.data.total

我正在使用Groovy的扩展点运算符(*.)来获取组件和fixVersions的名称,因为这些列表不是字符串列表,而是具有name属性的对象列表。

或者,如果你确定总有0或1(但不是几个)fixVersion,你可以这样做:

println "${issue.key} components: ${issue.fields.components*.name} fixVersion:${issue.fields.fixVersions[0]?.name}"

如果没有设置fixVersion,它将打印null。