2017-02-16 42 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}") 
       } 
      } 
     ) 
    } 
}