Предоставить список Groovy для цикла для запуска задачи несколько раз - PullRequest
0 голосов
/ 24 апреля 2019

у меня есть список, определенный в Groovy как:

all_services:[processor-create, processor-update, read-service]

как я могу предоставить этот список для цикла for для каждой переменной переменной playbook $ {service}

script {

    sh("""

    ansible-playbook -i localhost, cleanup.yml --extra-vars=@${service}.yml
    """)
    ...

Так что playbook должен запускаться, если в списке есть 2 элемента, тогда он должен запускаться 2 раза для каждого элемента.

Позвольте мне выразить это ясно.

У меня есть отличный сценарий, он состоит из нескольких этапов:

stages {
    stage('Prepare') {
        agent any
        steps {
            script {
                if (params.DEPLOY_ALL_SERVICES == true){
                   all_services = new ArrayList(Arrays.asList("${params.ALL_SERVICES}".split("\\+")))
                   println "all_services:" + all_services
                } else{
                   if (params.DEPLOY_ALL_EX_SERVICES == true){
                       all_ex_services = new ArrayList(Arrays.asList("${params.ALL_EX_SERVICES}".split("\\+")))
                       println "deploy all ex services:" + all_account_services
                       all_services += all_ex_services
                   }
                   println "All Services:" + all_services
                }
            }
        }
    }
    stage('Create conf'){
        agent any
        steps {
            script {
                def services = "$all_services"
                println services    // it works till here, it's printing the list, if add single quotes to list then hopefully it should loop through it
                services.each {service ->
                    sh("""
                      ansible-playbook -i localhost, cleanup.yml --extra-vars=@${service}.yml
                     """)
                 }
            }
        }
    }
}

Когда я выполняю конвейер, он может напечатать список на консоли, но не может предоставить этот список в def services = "$ all_services", он не получает весь список для выполнения цикла.

Услуги вывода на консоль println:

       [processor-create, processor-update, ex-service]


an exception which occurred:
in field com.cloudbees.groovy.cps.impl.FunctionCallEnv.locals
in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@1a3dd25b
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@7f249352
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.LoopBlockScopeEnv@59936027
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@6a3531fb
in field com.cloudbees.groovy.cps.impl.CallEnv.caller

1 Ответ

0 голосов
/ 24 апреля 2019

Ваш вопрос не достаточно хорошо определен, чтобы точно знать, что вы ищете, но следующий отличный код:


def services = ['processor-create', 'processor-update', 'read-service']

services.each { service -> 
  sh("ansible-playbook -i localhost, cleanup.yml --extra-vars=@${service}.yml")
}

def sh(str) {
  println "fake execution>> \n${str}\n"
}

демонстрирует итерацию коллекции и интерполяция строк .Сохранение вышеупомянутого в solution.groovy и выполнение его приводит к:

~> groovy solution.groovy
fake execution>>
ansible-playbook -i localhost, cleanup.yml --extra-vars=@processor-create.yml

fake execution>>
ansible-playbook -i localhost, cleanup.yml --extra-vars=@processor-update.yml

fake execution>>
ansible-playbook -i localhost, cleanup.yml --extra-vars=@read-service.yml

, следует отметить, что, поскольку приведенный выше код использует чистый groovy, и нет ничего нестандартного script или sh вgroovy, я высмеял метод sh, чтобы просто напечатать результат на стандартный вывод.

...