Скрипт Powershell не выходит из строя в Jenkins

Я скачал SSH-Sessions Йоакима Свендсена, который использует SSH.NET и установил модуль PowerShell на сервер Jenkins Windows.

В Jenkins у меня есть следующий скрипт PowerShell:

Import-Module SSH-Sessions

$lastExitCode = 0
$devApp1 = "10.0.0.1"
$devApp2 = "10.0.0.2"

Write-Output "Deployment started in $devApp1......"

New-SshSession -ComputerName $devApp1 -Username test -Password test@123
$return = Invoke-SshCommand -ComputerName $devApp1  -Command "cd /NFS_DATA/autodeploy_scripts && echo test@123 | ./autodeploy.sh"

$return | Get-Member

if ($lastExitCode -ne 0)
{
    Write-Output $lastExitCode
    exit 1;
}
else
{
    Write-Output $lastExitCode
    exit 0;
}

Сценарий оболочки содержит:

#!/bin/bash
file="/NFS_DATA/autodeploy_scripts/test.log"
if [ -f "$file" ]
then
        echo "$file found."
        exit 0;
else
        echo "$file not found."
        exit 1;
fi

Проблема в том, что задание Jenkins не завершается ошибкой, если файл не найден. Выход Дженкинса:

> Deployment started in 10.0.0.1...... Successfully connected to
> 10.0.0.01
> 10.0.0.01 had an error:

Finished: SUCCESS

После некоторых предложений я написал следующий скрипт PowerShell, используя Posh-SSH. Я также получаю ошибку для этого, хотя это другое.

#Import-Module SSH-Sessions
Import-Module Posh-SSH

# Setup static variables
$devApp1="10.0.0.1"
$devApp2="10.0.0.2"
$username = "test"
$password = "test@123"
$command = "cd /NFS_DATA/autodeploy_scripts && echo Hybris@123 | ./autodeploy.sh"

Write-Output "Deployment started in $devApp1..."

# Setup PSCredentials
$secPasswd   = ConvertTo-SecureString $password -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential ($username, $secPasswd) 
echo $credentials

# Estalbish new SSH session automatically accepting new SSH keys
$session = New-SSHSession -Computername $devApp1 -Credential $credentials -Acceptkey:$true

# Invoke command to be run on/in the SSH session
$output = Invoke-SSHCommand -SSHSession $session -Command $command

Write-Output "Returned Output from the Command: "
Write-Output $output.Output
Write-Output "Last Exit Status: "
Write-Output $output.ExitStatus

Получение сообщения об ошибке как:

Результат скрипта Posh-SSH

Тот же код работает на моем локальном ноутбуке, но не работает на сервере Jenkins.

Я думаю, что на сервере Jenkins из-за ограничений безопасности Windows не будет храниться $secpasswd, полученный из PSCredential. Это приводит к тому, что в POSH предоставляется только имя пользователя.

Как я могу исправить эти проблемы? Как мне жестко закодировать пароль?


person user2439278    schedule 27.04.2017    source источник
comment
Я бы предположил, что ничего не происходит, потому что вы не передаете этот код ошибки из среды PowerShell в Jenkins. Как бы то ни было, сценарий PowerShell существует с 0, если только не возникает ошибка при импорте/установлении сеанса или вызове команды. Вам нужно будет оценить и вернуть код из Invoke-SSHCommand.   -  person Seth    schedule 28.04.2017
comment
Я новичок в powershell. Как оценить вывод Invoke-SSHCommand   -  person user2439278    schedule 28.04.2017
comment
Это будет зависеть от того, как это реализовано. Посмотрите документацию по этим командлетам или поэкспериментируйте с ней. Хорошим началом было бы сохранить то, что возвращается в переменную. Таким образом, 1_. После этого вы можете использовать Get-Member, чтобы получить дополнительную информацию или просто позволить ей распечатай на экран и посмотри. Имейте в виду, что что-то вроде $? может быть недостаточным, поскольку сам командлет может работать нормально, хотя команды внутри ошибки.   -  person Seth    schedule 28.04.2017
comment
Я понятия не имею, как использовать Get-Member для оценки InvokeSSHCommand.   -  person user2439278    schedule 28.04.2017
comment
Ссылка на самом деле содержит пример для этого. Это не должно быть так сложно, и вы также можете использовать его для переменной. Это следует делать в интерактивной оболочке PowerShell, а не в сценарии. Выясните, что возвращает вызов, и впоследствии настройте свой сценарий. Например, командлет Invoke-Command по умолчанию. Вы также можете попробовать запустить Invoke-SSHCommand -? или Get-Help -Full Invoke-SSHCommand или использовать -Examples, чтобы получить больше информации о том, как должен работать командлет.   -  person Seth    schedule 28.04.2017
comment
Я пытался использовать Get-Member, но не смог решить проблему. Есть ли другой способ исправить это.   -  person user2439278    schedule 04.05.2017
comment
Что вы пробовали? Какую дополнительную информацию вы узнали? Каковы были свойства и была ли информация о возвращаемом значении командлета?   -  person Seth    schedule 04.05.2017
comment
Я обновил вопрос, предоставив вывод Get-Member, а powershell не отобразил сообщение об ошибке, полученное из сценария оболочки внутри окна Linux. Он отображает сообщение об успехе, но не сообщение об ошибке   -  person user2439278    schedule 05.05.2017
comment
Вы хоть пытались понять, что Get-Member делают? При вызове echo $return | Get-Member вы указываете PowerShell преобразовать $return в строку, а затем проверяете атрибуты... которые, конечно же, являются атрибутами каждого строкового атрибута.   -  person Seth    schedule 05.05.2017
comment
Нет, это не так. Оригинальная ссылка на документацию содержит довольно много информации. Если вы также новичок в программировании в целом, все может быть по-другому. Извините, хотя, если мои слова были немного резкими. Если вы на самом деле не используете Posh-SSH, вы можете использовать это (вы так и не сказали, какой скрипт используете). В этом случае команда, похоже, возвращает только строку. Ссылка содержит пример того, как получить статус вывода и выхода.   -  person Seth    schedule 05.05.2017
comment
Я скачал powershelladmin.com/w/images/6/60 /SSH-Sessions.zip и установленный модуль powershell на сервере Windows Jenkins   -  person user2439278    schedule 05.05.2017
comment
Сейчас я использовал модуль Posh-SSH и обновил вопрос с сообщением об ошибке.   -  person user2439278    schedule 05.05.2017
comment
Полномочия не должны быть проблемой. Скорее всего, Posh-SSH не импортирует успешно. Вы использовали встроенную в Windows программу просмотра zip для извлечения файлов? Убедитесь, что они не заблокированы. Вы можете сделать это, проверив свойства файла и разблокировав файлы. Поскольку есть командлет Unblock-File, вы можете использовать его для разблокировки всех файлов в каталоге. См. также Простая разблокировка всех файлов в каталоге с помощью PowerShell от Hey, Scripting Guy!   -  person Seth    schedule 05.05.2017
comment
Unblock-File работает в PowerShell 3.0... Я использую версию powershell 2.0. Я также проверил свойства файла, он не заблокирован   -  person user2439278    schedule 05.05.2017


Ответы (1)


Поскольку вы никогда не указывали, откуда берутся эти команды, я предполагаю, что вы используете Posh -SSH. Просмотрев эту статью об этом, решение, вероятно, будет таким:

$dev_app1="10.00.00.01"
$dev_app2="10.00.00.02"

echo "Deployment started in $dev_app1......"
Import-Module SSH-Sessions
New-SshSession -ComputerName $dev_app1 -Username test -Password test@123
$result = Invoke-SshCommand -ComputerName $dev_app1  -Command "cd /NFS_DATA/autodeploy_scripts && echo test@123 | ./autodeploy.sh"

Write-Output "Returned Output from the Command: "
Write-Output $result.Output
Write-Output "Last Exit Status: "
Write-Output $result.ExitStatus

if($result.ExitStatus -ne 0){
    exit $result.ExitStatus;
}

if можно было бы опустить, он просто для демонстрационных целей. В конце концов, в противном случае статус выхода был бы 0.

Правильный способ использования Get-Member для получения информации о $result (в случае, если это не сработает): $result | Get-Member. Это выведет общие атрибуты любого типа объекта $result.

Судя по всему, вы запускаете это. Вам нужно будет запустить следующее, чтобы получить объекты:

$result = $SshSessions."$dev_app1".RunCommand('cd /NFS_DATA/autodeploy_scripts && echo test@123 | ./autodeploy.sh')

Вы бы использовали это вместо Invoke-SshCommand, и вам нужно было бы изменить $result.Output на $result.Result.

person Seth    schedule 05.05.2017
comment
Я использовал $result | Get-Member , он отображает общий атрибут. Как действовать дальше - person user2439278; 05.05.2017
comment
Либо прочитайте документацию о том, что означают эти атрибуты, либо подумайте об этом. Атрибут с именем Output, вероятно, будет содержать вывод команды, выполненной Invoke-SshCommand. Итак, в вашем примере сценария я ожидаю, что атрибут будет содержать текст, говорящий ... not found. Если у него есть атрибут ExitStatus, проверяйте каждый раз, когда он равен 0 или 1, и, возможно, заставляйте ошибку проверяться всякий раз, когда он изменяется на 1. После этого используйте эту информацию, чтобы позволить сценарию указать ошибку (возможно, путем выхода с ненулевым кодом выхода). - person Seth; 05.05.2017
comment
Я скачал powershelladmin.com/w/images/6/60/SSH-Sessions.zip и установил модуль powershell на сервер Windows Jenkins. - person user2439278; 05.05.2017
comment
Сейчас я использовал модуль Posh-SSH и обновил вопрос с сообщением об ошибке. - person user2439278; 05.05.2017
comment
$result = $SshSessions."$dev_app1".RunCommand('cd /NFS_DATA/autodeploy_scripts && echo test@123 | ./autodeploy.sh') и Write-Output $result.Result работают нормально. Как получить код выхода - person user2439278; 05.05.2017
comment
Имеет ли $result.ExitStatus допустимое значение? Если вы посмотрите на документацию, которая должна содержать ExitStatus скрипта . Если это так, вам, возможно, придется изменить свое увольнение. Но у вас будет ступенька. Вы также можете попробовать проверить значение, используя Write-Output "'$($result.Output)'". Если это окажется '', у вас может быть нулевое значение. Это может оказаться полезным? - person Seth; 05.05.2017
comment
Это работает сейчас. Write-Output $result.ExitStatus возвращает код выхода, указанный в сценарии оболочки - person user2439278; 05.05.2017