在Jenkins的此集成管道中,我使用the build step并行触发不同的构建,如下所示:
stage('trigger all builds')
{
parallel
{
stage('componentA')
{
steps
{
script
{
def myjob=build job: 'componentA', propagate: true, wait: true
}
}
}
stage('componentB')
{
steps
{
script
{
def myjob=build job: 'componentB', propagate: true, wait: true
}
}
}
}
}
我想访问build
步骤的返回值,以便可以在Groovy脚本中知道触发了什么作业名称,编号。
在示例中,我发现返回的对象具有getProjectName()
或getNumber()
之类的吸气剂,可用于此目的。
但是我怎么知道返回对象的确切类以及可以调用的方法列表? Pipeline documentation中似乎缺少此内容。我特别要求这种情况,但总的来说,我怎么知道返回对象的类及其文档?
答案 0 :(得分:18)
步骤文档是基于与插件捆绑在一起的一些文件生成的,有时这还不够。一种简单的方法是通过调用getClass
仅打印出结果对象的class
:
def myjob=build job: 'componentB', propagate: true, wait: true
echo "${myjob.getClass()}"
此输出将告诉您结果(在这种情况下)是一个org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
,其中包含published Javadoc。
对于其他情况,我通常必须深入研究Jenkins源代码。这是我的一般策略:
搜索步骤名称的String文字,并找到返回它的步骤类型。在这种情况下,它似乎来自the BuildTriggerStep
class, which extends AbstractStepImpl
@Override
public String getFunctionName() {
return "build";
}
查看the nested DescriptorImpl
to see what execution class is returned
public DescriptorImpl() {
super(BuildTriggerStepExecution.class);
}
转到BuildTriggerStepExecution
and look at the execution body in the start()
method
读取workflow step README表示应该调用context.onSuccess(value)
来返回结果。该文件中只有一个地方,但仅在“不等待”的情况下,该情况总是立即返回,并且为null
(source)。
if (step.getWait()) {
return false;
} else {
getContext().onSuccess(null);
return true;
}
好,所以它没有在步骤执行中完成,因此它必须在其他地方。我们还可以在存储库中搜索onSuccess
,并从此插件中查看还有什么可能触发它。 We find that a RunListener
implementation handles setting the result asynchronously for the step execution if it has been configured that way:
for (BuildTriggerAction.Trigger trigger : BuildTriggerAction.triggersFor(run)) {
LOGGER.log(Level.FINE, "completing {0} for {1}", new Object[] {run, trigger.context});
if (!trigger.propagate || run.getResult() == Result.SUCCESS) {
if (trigger.interruption == null) {
trigger.context.onSuccess(new RunWrapper(run, false));
} else {
trigger.context.onFailure(trigger.interruption);
}
} else {
trigger.context.onFailure(new AbortException(run.getFullDisplayName() + " completed with status " + run.getResult() + " (propagate: false to ignore)"));
}
}
run.getActions().removeAll(run.getActions(BuildTriggerAction.class));
trigger.context.onSuccess(new RunWrapper(run, false));
的结果来自RunWrapper