序言
因为需要在Windows上编译和部署程序,因此需要借助PowerShell的脚本力量完成这些事情。
目标服务器是windows server2022,因此不需要初始化WinRM服务,省却了不少的麻烦,让我们可以直接通过Powershell远程服务器,执行命令。
1. 开启远程会话
使用过SSH的都知道,在linux下这个命令极其强大,基本可以做任何事情,当然windows页支持ssh,只不过由于缺少相关命令,还不如直接使用powershell来得直接。
闲话少叙,让我们看看怎么使用PowerShell来远程主机。
Enter-Pssession 192.168.4.189 -Credential administrator
输入密码,就可以访问远程计算机了。
当然,由于Jenkins无法交互,因此,这里,需要转变下密码,作为密钥参数输入才行。
$pass=ConvertTo-SecureString -String'your password'-AsPlainText -Force
$cre=New-Object pscredential('your username', $pass)
$session=New-PSSession -ComputerName $server -Credential $cre
然后利用 Invoke-Command
就可以远程执行命令了。
2. 信任错误
如果执行 New-PSSession
出现错误:如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入到域中, 则必须使用 HTTPS 传输或者必须将目标计算机添加到 TrustedHosts 配置设置。使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts列表中的计算机可能未经过身份验证。通过运行以下命令可获得有关此内容的更多信息: winrm
help config。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。
那么,这说明你需要在执行计算机的信任列表内增加服务器Ip地址。
一般操作步骤如下:
#1. 切到管理的client目录下
cd WSMan::localhost\client
#2. 查看子项,其中TrustedHosts会列出本机已添加的可信主机IP
Get-ChildItem
#3. 将被控服务器IP添加为可信主机
Set-Item ./TrustedHosts 192.168.4.189
#4. 再次获取子项时
Get-ChildItem ./TrustedHosts
#5. 将所有主机添加为可信主机*
Set-Item ./TrustedHosts *
一番精打细算,你应该可以获取到session了,session在手,江山我有!
3. Jenkins 调用
# ===设定登录===
$pass=ConvertTo-SecureString -String $ENV:devpassword -AsPlainText -Force
$cre=New-Object pscredential($ENV:ServerUser, $pass)
$session=New-PSSession -ComputerName $ENV:TestServer -Credential $cre
# === 登录===
if($session){
Write-Output "连接到系统开发环境..."
try{
Copy-Item "$ENV:WORKSPACE/$package" -Destination $dest -ToSession $session -Recurse -Force
Invoke-Command -Session $session -ScriptBlock{ param($p1, $p2, $p3)
if(!(Test-Path $p3)){
mkdir $p3
}
ChDir $p1
Expand-Archive "$p2" -DestinationPath "$p3" -Force
Copy-Item -Path "$p3/dist/*" -Destination "$p3" -Recurse -Force
Remove-Item "$p3/dist" -Recurse -Force
} -ArgumentList $dest, $package,$deploy
Write-Output "发布程序到系统开发环境..."
}
finally{
Remove-PSSession -Id $session.Id
}
}
else{
# throw "This is an error."
Write-Error "不能连接系统开发环境..."
}