在 Jenkins 的集成管道中,我使用以下命令并行触发不同的构建构建步骤 https://jenkins.io/doc/pipeline/steps/pipeline-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()
or getNumber()
我可以用它来做这个。
但是我如何知道返回对象的确切类以及我可以调用它的方法列表?这似乎在管道文档 https://jenkins.io/doc/pipeline/steps/pipeline-build-step/。我特别要求这种情况,但一般来说,我如何知道返回对象的类及其文档?
步骤文档是根据与插件捆绑在一起的一些文件生成的,有时这还不够。一种简单的方法是打印出来class
通过调用获得结果对象getClass https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--:
def myjob=build job: 'componentB', propagate: true, wait: true
echo "${myjob.getClass()}"
此输出会告诉您结果(在本例中)是org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
其中有已发布 Javadoc http://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html.
对于其他情况,我通常必须深入研究 Jenkins 源代码。这是我的总体策略:
- 通过步骤文档找出该步骤来自哪个插件,jenkins.io 步骤参考 https://jenkins.io/doc/pipeline/steps/pipeline-build-step/#build-%20build%20a%20job,或者只是在互联网上搜索
- 来自插件网站 https://plugins.jenkins.io/pipeline-build-step,转到源代码存储库 https://github.com/jenkinsci/pipeline-build-step-plugin
-
搜索步骤名称的字符串文字,并找到返回它的步骤类型。在这种情况下,它看起来来自the BuildTriggerStep类,其中extends AbstractStepImpl https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStep.java#L124
@Override
public String getFunctionName() {
return "build";
}
-
Look at 嵌套的DescriptorImpl查看返回的执行类 https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStep.java#L85-L87
public DescriptorImpl() {
super(BuildTriggerStepExecution.class);
}
Go to BuildTriggerStepExecution并查看执行体start() method https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L60-L148
-
阅读全文工作流程步骤自述文件 https://github.com/jenkinsci/workflow-step-api-plugin/blob/master/README.md#creating-an-asynchronous-step表明应该调用一些东西context.onSuccess(value)
返回结果。该文件中有一个地方,但那只是在“不等待”的情况下,它总是立即返回并且是null
(source https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L142-L147).
if (step.getWait()) {
return false;
} else {
getContext().onSuccess(null);
return true;
}
-
好的,所以它在步骤执行中没有竞争,所以它一定在其他地方。我们还可以在存储库中搜索onSuccess
看看还有什么可能会从这个插件触发它。我们发现一个RunListener如果已这样配置,则实现会异步设置步骤执行的结果: https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerListener.java#L44-L56
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));
The trigger.context.onSuccess(new RunWrapper(run, false));
是哪里RunWrapper
结果来自
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)