Горячо, чтобы подавить ошибку BadExitStatusException из конвейера jenkins после запуска ansible playbook

#jenkins #ansible

#дженкинс #ansible

Вопрос:

У меня есть конвейер Jenkins, который запускает ansible playbook на нескольких серверах

 node {
stage('Get Playbook') {
    dir('ansible-dir') {
       git branch: 'master',
       credentialsId: 'creds',
       url: 'ssh://git@gitserver.com'
    }
}

withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'ansible', usernameVariable: 'username', passwordVariable: 'password']]){

    def remote = [:]
    remote.name = 'Remote Ansible Server'
    remote.host = 'server.domain.com'
    remote.user = username
    remote.password = password
    remote.allowAnyHosts = true

    stage('Copy dir to remote server'){
        sshPut remote: remote, from: '/localdir', into: '/home/remote/jenkins'
    }

stage('Run ansible playbook'){
        sshCommand remote: remote, command: 'ANSIBLE_CONFIG=/home/remote/jenkins/ansible.cfg ansible-playbook /home/remote/jenkins/playbook.yml -vvv'
    }

    stage('Copy report to local machine') {
        sshGet remote: remote, from: '/home/remote/jenkins/reports', into: '/home/user/reports', override: true
    }
}
  

Проблема, с которой я сталкиваюсь, заключается в том, что этап «Копировать отчет на локальный компьютер» не всегда выполняется. Иногда сервер выходит из строя при повторном воспроизведении, что само по себе не является проблемой, поскольку отчет, сгенерированный в playbook, учитывает это и ведет журнал для его идентификации.

Проблема в том, что когда сервер выходит из строя при повторном воспроизведении, дженкинс выдает следующую ошибку.

 org.hidetake.groovy.ssh.session.BadExitStatusException: Command returned exit status 2: ANSIBLE_CONFIG=/home/remote/jenkins/ansible.cfg ansible-playbook /home/remote/jenkins/playbook.yml -vvv
  

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

Ответ №1:

Выяснил это, поместив этап запуска playbook в try catch

 try {
    stage('Copy dir to remote server'){
    sshPut remote: remote, from: '/localdir', into: '/home/remote/jenkins'
} catch(e) {
    build_ok = false
    echo e.toString()
}
  

Это позволяет продолжить и перейти к следующему этапу.