2017-02-16 1 views
6

스크립팅 된 파이프 라인을 선언적 파이프 라인으로 변환하려고합니다. steps {} 블록 내에서 간단한 if 문을 수행하는 방법을 알고 싶습니다.젠킨스의 선언적 파이프 라인에서 간단한 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}") 
         } 
        } 
       } 
      ) 
     } 
    } 

이 다음과 같은 예외가 발생합니다

나는 steps {} 블록 내부에 간단한 if(..)을 할 수 있지 않다 때문에
WorkflowScript: 201: Expected a step @ line 201, column 29. 
          if (containerId.isEmpty()) { 

에 어떤 생각이 어떻게 이렇게 할 수 있습니까?

단순한 단계 (존재하는 경우 중지 된 컨테이너 시작 등)에서 더 많은 단계가 발생하므로이 단계를 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

이것은 당신이 조건을 처리하는 when {} 단계를 추가 할 수 Conditional BuildStep 플러그인을 사용

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

작동합니다.

이 컨텍스트 내에서 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}") 
       } 
      } 
     ) 
    } 
} 
관련 문제