Flo*_*ane 14 groovy jenkins jenkins-pipeline
在Jenkins的这个集成管道中,我使用构建步骤并行触发不同的构建,如下所示:
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
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想访问该build步骤的返回值,以便我可以在我的Groovy脚本中知道哪个作业名称,数字被触发.
我在示例中发现返回的对象具有类似于getProjectName()或者getNumber()我可以用于此的getter .
但是,我如何知道返回对象的确切类以及我可以调用它的方法列表?管道文档中似乎缺少这一点.我特别要求这个案例,但一般来说,我怎么知道返回对象的类及其文档?
mko*_*bit 26
步骤文档是基于与插件捆绑在一起的一些文件生成的,有时这还不够.一种简单的方法是class通过调用打印出结果对象getClass:
def myjob=build job: 'componentB', propagate: true, wait: true
echo "${myjob.getClass()}"
Run Code Online (Sandbox Code Playgroud)
此输出将告诉您结果(在本例中)是org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper已发布Javadoc的结果.
对于其他情况,我通常不得不深入研究Jenkins源代码.这是我的总体策略:
搜索步骤名称的字符串文字,并找到返回它的步骤类型.在这种情况下,它看起来像是来自这个BuildTriggerStep类extends AbstractStepImpl
@Override
public String getFunctionName() {
return "build";
}
Run Code Online (Sandbox Code Playgroud)public DescriptorImpl() {
super(BuildTriggerStepExecution.class);
}
Run Code Online (Sandbox Code Playgroud)阅读工作流程步骤README显示应该调用某些内容context.onSuccess(value)来返回结果.该文件中有一个位置,但这只是在"无等待"的情况下,它总是立即返回并且是null(源).
if (step.getWait()) {
return false;
} else {
getContext().onSuccess(null);
return true;
}
Run Code Online (Sandbox Code Playgroud)好的,所以它没有在步骤执行中完成,所以它必须是其他地方.我们还可以在存储库中搜索onSuccess并查看此插件可能触发的其他内容.我们发现,RunListener如果已经按照以下方式配置,则实现会处理为步执行异步设置结果:
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));
Run Code Online (Sandbox Code Playgroud)这trigger.context.onSuccess(new RunWrapper(run, false));是RunWrapper结果的来源
下游作业的结果在result返回对象的属性中给出。
我建议使用它propagate: false来控制下游作业的结果如何影响当前构建。
例子:
pipeline{
[...]
stages {
stage('Dummy') {
steps {
echo "Hello world #1"
}
}
stage('Fails') {
steps {
script {
downstream = build job: 'Pipeline Test 2', propagate: false
if (downstream.result != 'SUCCESS') {
unstable(message: "Downstream job result is ${downstream.result}")
}
}
}
}
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,只要下游构建未成功,当前构建就会设置为 UNSTABLE。
结果可能是:成功、失败、不稳定或中止。
对于您的其他问题,请参阅是否有内置函数可以打印对象的所有当前属性和值?而Groovy/grails如何判断一个数据类型?