2017-02-16 48 views
6

我试图将我的脚本管道转换为声明式管道。 想知道如何在steps {}块中做简单的if语句。如何在Jenkins的声明式管道中执行简单的if语句

stage ('Deploy to Docker') { 
     steps { 
      parallel (
       "instance1" : { 
        environment { 
         containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim() 
        } 
        steps { 
         if (containerId.isEmpty()) { 
          docker.image('some/image').run("--name ${fullDockerImageName}") 
         } 
        } 
       } 
      ) 
     } 
    } 

这将导致以下异常:

WorkflowScript: 201: Expected a step @ line 201, column 29. 
          if (containerId.isEmpty()) { 

因为我不能做一个简单的if(..)一个steps {}块内,对任何想法如何做到这一点?

由于在简单的阶段中发生了更多的步骤(如果它存在等起始已停止的容器等),因此将其设置为when {}的完整阶段似乎没有意义。

做一个简单的if的最佳方法是什么?

+0

@ JON-S这是非常像我的其他问题(https://stackoverflow.com/questions/42277936/assigning-variables-in-a-parallel-step-using-declarative-pipeline-steps-in-jenki),但我想要记录非常常见的情况(if-statemen t和var-assignment),所以无论如何发布它。 也许你对此有不同的见解? –

回答

5

不幸的是,您现在必须将其包装在script之内。因为它says here;

声明管道可以使用所有在Pipeline Steps reference,其中包含的步骤的完整列表记录了可用的步骤,增加的这些只有在声明管道支持下面列出的步骤。

如果你看一下步骤引用,它只是列出了所有贡献流水线步骤的插件。而且据我所知,如果其他方面没有支持的话。所以答案是,不,现在不可能,但是,将它作为一个步骤实施并添加到插件应该相当简单。

2

这应该工作

pipeline { 
    stages { 
     stage ('Main Stage') { 
      steps { 
       script { 
        if (true) { 
         stage ('Stage 1') { 
          sh 'echo Stage 1' 
         } 
        } 
        if (false) { 
         stage ('Stage 2') { 
          sh 'echo Stage 2' 
         } 
        } 
       } 
      } 
     } 
    } 
} 
0

使用Conditional BuildStep插件,你可以添加一个when {}步骤处理条件。

以下应该工作,禁止在此上下文中使用isEmpty()检查的语法问题。

stage ('Deploy to Docker') { 
    steps { 
     parallel (
      "instance1" : { 
       environment { 
        containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim() 
       } 
       when { 
        expression { 
         return containerId.isEmpty() 
        } 
       } 
       step { 
        docker.image('some/image').run("--name ${fullDockerImageName}") 
       } 
      } 
     ) 
    } 
} 

,相关博客文章is here.

编辑:对不起,实际snytax似乎更接近这一点,这没有访问您所需要的条件:

stage ('Deploy to Docker') { 
    when { 
     expression { 
      return containerId.isEmpty() 
     } 
    } 
    steps { 
     parallel (
      "instance1" : { 
       environment { 
        containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim() 
       } 
       step { 
        docker.image('some/image').run("--name ${fullDockerImageName}") 
       } 
      } 
     ) 
    } 
}