2017-01-11 2 views
1

Исходя из моего вопроса How to trigger parameterized build on successful build in Jenkins?Как запустить работу вниз по течению на основе параметра в трубопроводе Дженкинса?

Я хотел бы ВЫЗОВ нисходящий проект, но только если логический параметр имеет значение истина. Это возможно? Мой трубопровод выглядит следующим образом:

node { 
    try { 
     echo "ConfigFilePath: ${ConfigFilePath}" 
     echo "Delete VM on Successful Build: ${DeleteOnSuccess}" 

     stage('checkout') { 
      deleteDir() 
      git 'http://my.git.lab/repo.git' 
     } 

     stage('deploy') { 
       bat 'powershell -nologo -file BuildMyVM.ps1 -ConfigFilePath "%ConfigFilePath%" -Verbose'     
      } 
     } 
     stage('test') { 
      // functional tests go here 
     }  
    } 
    catch (e) { 
    // exception code 

    } finally { 
    // finally code 

    } 
} //node 

stage('delete') { 
    if(DeleteOnSuccess) 
    { 
     bat 'SET /p VM_NAME=<DeleteVM.txt' 
     echo "Deleting VM_NAME: %VM_NAME%" 
     def job = build job: 'remove-vm', parameters: [[$class: 'StringParameterValue', name: 'VM_NAME', value: '${VM_NAME}']] 
    } 
} 

Я получаю эту ошибку на этапе удаления

Required context class hudson.FilePath is missing. Perhaps you forgot to surround the code with a step that provides this, such as: node

Если я обернуть выше в узле, то значения параметров будут потеряны. Если я поставлю этап удаления в основной узел, я возьму двух исполнителей, которых я пытаюсь избежать, потому что это приведет к некоторым условиям взаимоблокировки.

+1

Ошибки вы получите о 'bat' вы пытаетесь запустить. Для этого требуется узел (или фактически среда). Поэтому, в зависимости от того, как вы вызываете свою сборку в первую очередь, вам нужно окружить ее с помощью 'node {...}', или просто поместить ее в блок 'node'. Если вы хотите только вызвать его и не дожидаться сборки, вы можете добавить 'wait: false' в команду' build'. – Rik

+0

ОК, если я удаляю строки 'bat' и' echo', задание на этапе 'delete' выполняет ли параметр проекта' DeleteOnSuccess' равным true или false. Любые идеи почему? –

+0

Возможно, это строка. Не логическое? – Rik

ответ

2

Проблема заключается в том, что запускать сценарий на самом деле нужен узел для запуска на, так что в вашем случае причина ошибки заключается в том, что вы пытаетесь выполнить команду bat за пределами node контекста

node { 
... 
} 
stage('delete') { 
    if(DeleteOnSuccess) 
    { 
     bat 'SET /p VM_NAME=<DeleteVM.txt' // <- this is actually causing the error 
     echo "Deleting VM_NAME: %VM_NAME%" 
     def job = build job: 'remove-vm', parameters: [[$class: 'StringParameterValue', name: 'VM_NAME', value: '${VM_NAME}']] 
    } 
} 

вы можете это исправить, обернув эту часть также внутри узла либо поместив его в первый node или добавить новый, в зависимости от того, что вы хотите

Кроме того, если переменная DeleteOnSuccess является параметром сборки, это будет быть строкой. Я не уверен, но я думаю, что это потому, что он вводится как переменная среды, которая также является строкой (даже если она имеет тип BooleanParameter. Я предполагаю, что это только пользовательский интерфейс, поэтому он будет отображаться как флажок). Вы можете проверить это, эхом DeleteOnSuccess.class. Это скажет вам свой класс

if(DeleteOnSuccess) { ... } 

всегда будет запускать условный блок. Вы можете исправить это путем преобразования его в bool с использованием метода расширения toBoolean() или проверки его на строку true: DeleteOnSuccess == "true", как и вы. Метод расширения имеет то преимущество, что также позволит значению от "1" и "True" в true