Выполнение сценария оболочки и использование его вывода в качестве входных данных для следующей задачи gradle

Я использую gradle для сборки и выпуска, поэтому мой скрипт gradle выполняет скрипт оболочки. Сценарий оболочки выводит IP-адрес, который должен быть предоставлен в качестве входных данных для моей следующей задачи ssh. Я могу получить вывод и распечатать на консоли, но не могу использовать этот вывод в качестве входных данных для следующей задачи.

remotes {
  web01 {
    def ip = exec {
    commandLine './returnid.sh'
    }
    println ip  --> i am able to see the ip address on console
    role 'webServers'
    host = ip  --> i tried referring as $ip '$ip' , both results into syntax error
    user = 'ubuntu'
    password = 'ubuntu'
  }
}

task checkWebServers1 << {

  ssh.run {
    session(remotes.web01) {
    execute 'mkdir -p /home/ubuntu/abc3'
}
}
}

но это приводит к ошибке

What went wrong:
Execution failed for task ':checkWebServers1'.
 java.net.UnknownHostException: {exitValue=0, failure=null}"

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

заранее спасибо

1 ответ

Решение

Причина, по которой это не работает, заключается в том, что exec обратный звонок ExecResult (вот описание JavaDoc), а не текстовый вывод выполнения.

Если вам нужно получить текстовый вывод, то вам нужно указать standardOutput собственность exec задача. Это можно сделать так:

remotes {
    web01 {
        def ip = new ByteArrayOutputStream()
        exec {
            commandLine './returnid.sh'
            standardOutput = ip
        }
        println ip
        role 'webServers'
        host = ip.toString().split("\n")[2].trim()
        user = 'ubuntu'
        password = 'ubuntu'
    }
}

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

ip.toString().split("\n")[2].trim()

Здесь требуется только первая строка вывода.

Другие вопросы по тегам