[JIRA] (JENKINS-37932) Error if no "agent" specified

13 views
Skip to first unread message

pwolf@cloudbees.com (JIRA)

unread,
Sep 2, 2016, 11:10:03 AM9/2/16
to jenkinsc...@googlegroups.com
Patrick Wolf updated an issue
 
Jenkins / Improvement JENKINS-37932
Error if no "agent" specified
Change By: Patrick Wolf
Issue Type: Bug Improvement
Add Comment Add Comment
 
This message was sent by Atlassian JIRA (v7.1.7#71011-sha1:2526d7c)
Atlassian logo

pwolf@cloudbees.com (JIRA)

unread,
Sep 2, 2016, 11:10:05 AM9/2/16
to jenkinsc...@googlegroups.com
Patrick Wolf created an issue
 
Jenkins / Bug JENKINS-37932
Issue Type: Bug Bug
Assignee: Andrew Bayer
Components: pipeline-model-definition-plugin
Created: 2016/Sep/02 3:09 PM
Environment: Pipeline Model 0.1
Priority: Minor Minor
Reporter: Patrick Wolf

If you specify "agent" without an argument, you get an NPE:

BUG! exception in phase 'canonicalization' in source unit 'WorkflowScript' unexpected NullpointerException
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1058)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:410)
	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:373)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:212)
	at hudson.model.ResourceController.execute(ResourceController.java:98)
	at hudson.model.Executor.run(Executor.java:410)
Caused by: java.lang.NullPointerException: Cannot get property 'objectExpression' on null object
	at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:60)
	at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:172)
	at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.matchMethodName(ModelParser.groovy:505)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parseMethodName(ModelParser.groovy:515)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser$_parse_closure2.doCall(ModelParser.groovy:121)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
	at groovy.lang.Closure.call(Closure.java:414)
	at groovy.lang.Closure.call(Closure.java:430)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3170)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3140)
	at org.codehaus.groovy.runtime.dgm$66.invoke(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.eachStatement(ModelParser.groovy:601)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parse(ModelParser.groovy:119)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser$parse.callCurrent(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.ModelParser.parse(ModelParser.groovy:94)
	at org.jenkinsci.plugins.pipeline.modeldefinition.parser.GroovyShellDecoratorImpl$1.call(GroovyShellDecoratorImpl.java:38)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1053)
	... 13 more

pwolf@cloudbees.com (JIRA)

unread,
Sep 2, 2016, 11:12:07 AM9/2/16
to jenkinsc...@googlegroups.com
Patrick Wolf updated an issue
 
Jenkins / Improvement JENKINS-37932
Change By: Patrick Wolf
If you create a pipeline model with no {{agent}} specified you get an error message:

{code}org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 3: Missing required section 'agent' @ line 3, column 1.
   pipeline{
   ^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1073)

at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:410)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:373)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:213)

at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:410)
Finished: FAILURE
{code}

Rather than throwing an error should we default to no label node: {
{ agent label:""} }

pwolf@cloudbees.com (JIRA)

unread,
Sep 2, 2016, 11:12:07 AM9/2/16
to jenkinsc...@googlegroups.com
Patrick Wolf updated an issue
If you specify " create a pipeline model with no {{ agent " without an argument, }} specified you get an NPE error message :

{code}
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
BUG! exception in phase 'canonicalization' in source unit ' WorkflowScript : 3: Missing required section ' unexpected NullpointerException agent' @ line 3, column 1.
   pipeline{
   ^

1 error

at org.codehaus.groovy.control.
ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.
CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java: 1058 1073 )

at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:410)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:373)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java: 212 213 )

at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:410)
Caused by Finished : java.lang.NullPointerException: Cannot get property 'objectExpression' on null object FAILURE
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:60) {code}
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:172)
at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java Rather than throwing an error should we default to no label node : 47)
{ code agent label:"" }

pwolf@cloudbees.com (JIRA)

unread,
Sep 2, 2016, 11:16:01 AM9/2/16
to jenkinsc...@googlegroups.com

mneale@cloudbees.com (JIRA)

unread,
Sep 4, 2016, 8:07:04 PM9/4/16
to jenkinsc...@googlegroups.com

I am ok with the default to label:'' myself. I think its a reasonable suggestion.

AS LONG AS this is the equivalent of node

{... }

in pipeline script, right?

pwolf@cloudbees.com (JIRA)

unread,
Sep 6, 2016, 11:03:03 AM9/6/16
to jenkinsc...@googlegroups.com

Equivalent to

node {
  doSomething()
}

Where node has no label

mneale@cloudbees.com (JIRA)

unread,
Sep 6, 2016, 6:25:01 PM9/6/16
to jenkinsc...@googlegroups.com

pwolf@cloudbees.com (JIRA)

unread,
Sep 6, 2016, 10:06:02 PM9/6/16
to jenkinsc...@googlegroups.com

I talked to Kohsuke Kawaguchi at lunch today and he agrees that the default should be a no-label node rather than to require an agent. James Dumay do you have any opinion here?

andrew.bayer@gmail.com (JIRA)

unread,
Sep 6, 2016, 10:18:02 PM9/6/16
to jenkinsc...@googlegroups.com

You mean agent shouldn't be required? That's a change from what we've discussed and agreed on previously, fwiw.

pwolf@cloudbees.com (JIRA)

unread,
Sep 6, 2016, 10:38:03 PM9/6/16
to jenkinsc...@googlegroups.com

I don't remember us specifically talking about making it required, maybe I was in Mongolia for that. Either way, there has to be an easier way than writing:

agent label:""

This looks ugly and awkward to me.

I think it is fine if the GUI creates an agent step even if it's empty but when creating a Jenkinsfile by hand it seems silly to force users to type in an empty string just to get a generic "node".

jdumay@cloudbees.com (JIRA)

unread,
Sep 6, 2016, 11:03:02 PM9/6/16
to jenkinsc...@googlegroups.com

pwolf@cloudbees.com (JIRA)

unread,
Sep 6, 2016, 11:10:01 PM9/6/16
to jenkinsc...@googlegroups.com

I assumed agent none was equivalent to not having a default node and making it required on the stage. I think there is a difference between not having a default node and having a default node with no label.

andrew.bayer@gmail.com (JIRA)

unread,
Sep 6, 2016, 11:15:01 PM9/6/16
to jenkinsc...@googlegroups.com

agent none is "I'll manage node blocks myself", not "I can run anywhere".

mneale@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 12:03:01 AM9/7/16
to jenkinsc...@googlegroups.com

no, agent none is "I'll manage my own" - as documented.

"I'll run anywhere" currently is:

agent label:''

this proposal is to make the default.

So if you have:

pipeline {
   stages {
      stage('build') {
          sh 'echo 42'
      }
   }
}

It will work as if it had "agent label:''" in there.

mneale@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 12:04:04 AM9/7/16
to jenkinsc...@googlegroups.com
Michael Neale edited a comment on Improvement JENKINS-37932
no, agent none is "I'll manage my own" - as documented.

"I'll run anywhere" currently is:

agent label:''

this proposal is to make the default.

So if you have:

{noformat}

pipeline {
   stages {
      stage('build') {
          sh 'echo 42'
      }
   }
}
{noformat}


It will work as if it had "agent label:''" in there.


mneale@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 12:04:05 AM9/7/16
to jenkinsc...@googlegroups.com
Michael Neale edited a comment on Improvement JENKINS-37932
agent none is "I'll manage my own" - as documented .
(perhaps that needs to be clearer or repeated)

"I'll run anywhere" currently is:

agent label:''

this proposal is to make the default.

So if you have:

{noformat}
pipeline {
   stages {
      stage('build') {
          sh 'echo 42'
      }
   }
}
{noformat}

It will work as if it had "agent label:''" in there.


jdumay@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 1:09:01 AM9/7/16
to jenkinsc...@googlegroups.com

Michael Neale what about if we aliased agent:any to agent:""?

What is the use case for agent none? Seems obtuse at first glance.

mneale@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 1:11:01 AM9/7/16
to jenkinsc...@googlegroups.com

James Dumay more magic is only a last resort. By far the most common case will be "node

{...}

" so it isnt' a terrible default.

"agent none" is when you want to control the nodes (maybe there is a better way to express that).

pwolf@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 1:36:02 AM9/7/16
to jenkinsc...@googlegroups.com

I like agent none because it is fairly literal.

The 'agent' step declares a default for all stages to run in unless otherwise specified. With this context, 'none' states that there is no default and it must be specified on the stage. I can't think of a better way to express that.

agent any seems more elegant than agent label:"" but having the "label" keyword there makes it very easy to understand the change needed to run on a specific node. What about agent label:any so it is specific that it will run on any label and the change to a specific label is straightforward.

mneale@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 1:41:02 AM9/7/16
to jenkinsc...@googlegroups.com

Patrick Wolf the "any" was suggested by me but Andrew didn't like another reserved word (they have a way of biting). Also, there is space for a "default" if people can agree what it is (and you suggestion that it is any node I still think is a good one). A default of "none" would be probably a bad experience.

mneale@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 1:41:03 AM9/7/16
to jenkinsc...@googlegroups.com
Michael Neale edited a comment on Improvement JENKINS-37932
[~hrmpw] the "any" was suggested by me but Andrew didn't like another reserved word (they have a way of biting). Also, there is space for a "default" if people can agree what it is (and you your suggestion that it is any node I still think is a good one). A default of "none" would be probably a bad experience.

pwolf@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 1:44:03 AM9/7/16
to jenkinsc...@googlegroups.com

Yes, just to be clear I meant I like agent none for what it currently does - forces manual configuration.

I agree that a default of any is the best user experience.

jdumay@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 8:38:02 PM9/7/16
to jenkinsc...@googlegroups.com

Michael Neale though the literals are very nice from a UX perspective - they read like english

+1 on any being the default.

jdumay@cloudbees.com (JIRA)

unread,
Sep 7, 2016, 8:39:03 PM9/7/16
to jenkinsc...@googlegroups.com

We should also improve the error message for agent none

Andrew Bayer tangentally, I think it would be pretty awesome if the error messages referred to our new docs on Jenkins.io WDYT?

andrew.bayer@gmail.com (JIRA)

unread,
Sep 7, 2016, 8:50:02 PM9/7/16
to jenkinsc...@googlegroups.com

James Dumay Open a JIRA and give me a sense of what you mean?

andrew.bayer@gmail.com (JIRA)

unread,
Sep 9, 2016, 12:47:04 PM9/9/16
to jenkinsc...@googlegroups.com
Andrew Bayer started work on Improvement JENKINS-37932
 
Change By: Andrew Bayer
Status: Open In Progress

andrew.bayer@gmail.com (JIRA)

unread,
Sep 9, 2016, 12:49:02 PM9/9/16
to jenkinsc...@googlegroups.com

So I'm about to push a PR adding agent any - with the current implementation of agent (i.e., before it's pluggable), that's as far as we can go in terms of constant options (i.e., just any and none). I'm leaving agent as required, though.

andrew.bayer@gmail.com (JIRA)

unread,
Sep 9, 2016, 12:51:01 PM9/9/16
to jenkinsc...@googlegroups.com

andrew.bayer@gmail.com (JIRA)

unread,
Sep 9, 2016, 12:52:06 PM9/9/16
to jenkinsc...@googlegroups.com

andrew.bayer@gmail.com (JIRA)

unread,
Sep 9, 2016, 5:32:02 PM9/9/16
to jenkinsc...@googlegroups.com
 

Merged - will be released in Pipeline Model 0.3

Change By: Andrew Bayer
Status: In Review Resolved
Resolution: Fixed

scm_issue_link@java.net (JIRA)

unread,
Sep 9, 2016, 5:32:03 PM9/9/16
to jenkinsc...@googlegroups.com
SCM/JIRA link daemon commented on Improvement JENKINS-37932
 
Re: Error if no "agent" specified

Code changed in jenkins
User: Andrew Bayer
Path:
src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/ast/ModelASTAgent.groovy
src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/model/Agent.groovy
src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/parser/ModelParser.groovy
src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/validator/ModelValidator.groovy
src/main/resources/org/jenkinsci/plugins/pipeline/modeldefinition/ClosureModelTranslator.groovy
src/test/java/org/jenkinsci/plugins/pipeline/modeldefinition/AbstractModelDefTest.java
src/test/java/org/jenkinsci/plugins/pipeline/modeldefinition/AgentTest.java
src/test/resources/agentAny.groovy
src/test/resources/json/agentAny.json
http://jenkins-ci.org/commit/pipeline-model-definition-plugin/0fe3ea8ae72ea0be692e0a093fb4473507c53532
Log:
[FIXED JENKINS-37932] Add "agent any"

Better approach for "run anywhere". I think this gets rid of any need
to make the agent section optional, at least for now.

bitwiseman@gmail.com (JIRA)

unread,
Oct 22, 2019, 11:24:52 PM10/22/19
to jenkinsc...@googlegroups.com
Liam Newman closed an issue as Fixed
 

Bulk closing resolved issues.

Change By: Liam Newman
Status: Resolved Closed
This message was sent by Atlassian Jira (v7.13.6#713006-sha1:cc4451f)
Atlassian logo
Reply all
Reply to author
Forward
0 new messages