Невозможно выполнить несколько команд в фоновом режиме на удаленном хосте с помощью Jenkins - PullRequest
1 голос
/ 26 февраля 2020

У меня есть DSL задания jenkins, который запускается на удаленном узле (Linux ОС) с использованием «Ограничить, где можно запустить этот проект». Метка.

Имеет шаг «Сборка» -> «Выполнить оболочку» "

В оболочке выполнения, о которой я упомянул,

sh /app/runalljobs.sh &

На удаленном узле runalljobs. sh выглядит следующим образом:

cat runalljobs.sh

ansible-playbook /app/test.yml -e argu=arg1
ansible-playbook /app/test.yml -e argu=arg2
.....
.....
ansible-playbook /app/test.yml -e argu=arg16

Runalljobs. * Предполагается, что 1032 * запускает 16 ansible процессов в фоновом режиме при выполнении runalljob. sh.

Это прекрасно работает, когда сценарий выполняется вручную из оболочки замазки удаленного узла.

Однако я хочу, чтобы скрипт запускал процессы ansible в фоновом режиме на удаленном узле при вызове с использованием задания jenkins, которое не выполняется.

Я также пытался комментировать sh /app/runalljobs.sh &

и добавление отдельной команды ansible в «Выполнить оболочку», как показано ниже:

ansible-playbook /app/test.yml -e argu=arg1 &
ansible-playbook /app/test.yml -e argu=arg2 &
.....
.....
ansible-playbook /app/test.yml -e argu=arg16 &

Но это тоже не вызвало процессы ansible на целевом узле.

Это работает, если я удаляю «&», а затем все команды ansible запускаются последовательно одна за другой на удаленном компьютере.

Тем не менее, я sh все команды ansible должны запускаться параллельно в фоновом режиме, и исполнитель Jenkins должен приступить к выполнению других задач оболочки выполнения.

Подскажите, пожалуйста, как Могу ли я получить требование?

1 Ответ

1 голос
/ 26 февраля 2020

Дженкинс позволяет выполнять задачи параллельно, но есть одна загвоздка. Для этого необходимо переключиться на Jenkins Pipeline , а затем использовать parallel. Тогда ваш скрипт сборки будет выглядеть так:

pipeline {
    agent 'my-remote-machine'
    stages {
        ...
        stage('Ansible stuff') {
            parallel {
                stage('arg1') {
                    steps {
                        sh 'ansible-playbook /app/test.yml -e argu=arg1'
                    }
                }
                stage('arg2') {
                    steps {
                        sh 'ansible-playbook /app/test.yml -e argu=arg2'
                    }
                }
                ...
            }
        }
    }
}

Если ваши командные строки очень похожи (как в вашем примере), вы можете использовать секцию matrix, чтобы упростить код :

matrix {
    axes {
        axis {
            name 'ARG'
            values 'arg1', 'arg2', 'arg3'
        }
    }
    stages {
        stage('test') {
            sh 'ansible-playbook /app/test.yml -e argu=${ARG}'
        }
    }
}

Я знаю, что это решение радикально изменилось - Jenkins Pipelines - это совершенно новый мир CI. Но это может стоить усилий, потому что конвейеры очень популяризируются авторами Jenkins, и многие плагины переписаны для работы с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...