Powershell 脚本在 Jenkins 中不会失败
Powershell Script not getting failed in Jenkins
我已经下载 SSH-Sessions by Joakim Svendsen which uses SSH.NET 并在 Jenkins Windows 服务器中安装了 PowerShell 模块
在 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;
}
shell 脚本包含:
#!/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
根据一些建议,我使用 Posh-SSH 编写了以下 PowerShell 脚本。我也遇到了这个错误,虽然它是不同的。
#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
获取错误消息为:
相同的代码在我的本地笔记本电脑上运行,但在 Jenkins 服务器上运行失败。
我认为在 Jenkins 服务器中,由于 Windows 安全限制,不会存储从 PSCredential 检索到的 $secpasswd
。这导致仅将用户名提供给 POSH。
我该如何解决这些问题?我应该如何硬编码密码?
由于您从未说明这些命令的来源,我假设您正在使用 Posh-SSH. By looking at this article,解决方案可能是:
$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
是什么对象的一般属性。
看起来你是 running this。您需要 运行 以下内容才能获取对象:
$result = $SshSessions."$dev_app1".RunCommand('cd /NFS_DATA/autodeploy_scripts && echo test@123 | ./autodeploy.sh')
您将使用它而不是 Invoke-SshCommand
,并且需要将 $result.Output
更改为 $result.Result
。
我已经下载 SSH-Sessions by Joakim Svendsen which uses SSH.NET 并在 Jenkins Windows 服务器中安装了 PowerShell 模块
在 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;
}
shell 脚本包含:
#!/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
根据一些建议,我使用 Posh-SSH 编写了以下 PowerShell 脚本。我也遇到了这个错误,虽然它是不同的。
#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
获取错误消息为:
相同的代码在我的本地笔记本电脑上运行,但在 Jenkins 服务器上运行失败。
我认为在 Jenkins 服务器中,由于 Windows 安全限制,不会存储从 PSCredential 检索到的 $secpasswd
。这导致仅将用户名提供给 POSH。
我该如何解决这些问题?我应该如何硬编码密码?
由于您从未说明这些命令的来源,我假设您正在使用 Posh-SSH. By looking at this article,解决方案可能是:
$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
是什么对象的一般属性。
看起来你是 running this。您需要 运行 以下内容才能获取对象:
$result = $SshSessions."$dev_app1".RunCommand('cd /NFS_DATA/autodeploy_scripts && echo test@123 | ./autodeploy.sh')
您将使用它而不是 Invoke-SshCommand
,并且需要将 $result.Output
更改为 $result.Result
。