目录html
Jenkins持续集成学习-Windows环境进行.Net开发1
Jenkins持续集成学习-Windows环境进行.Net开发2
Jenkins持续集成学习-Windows环境进行.Net开发3
Jenkins持续集成学习-Windows环境进行.Net开发4
Jenkins持续集成学习-搭建jenkins问题汇总
Jenkins持续部署-Windows环境持续部署探究1shell
在以前的文章中,对Windows环境下的持续集成方案进行探究,接下来对Windows环境下持续部署的方案进行学习与研究。windows
当jenkins集成编译成功后,将文件上传到指定的服务器FTP目录。本文将介绍关于持续部署须要的一些技术方案的实现,在后续文章中继续对持续集成具体的逻辑进行细化梳理。安全
当jenkins编译完成以后,咱们须要处理如下事项完成持续部署。服务器
这里暂时不探讨服务可用性的具体细节,也不讨论服务升级失败的回退工做等具体细节。网络
能够分析出上述流程中涉及到的技术要点。ide
Windows PowerShell 是专门为系统管理员设计的 Windows 命令行 Shell。 Windows PowerShell 包括能够单独或组合使用的交互提示和脚本编写环境。这里不探讨PowerShell的使用细节,由于这不是本篇文章的关注重点,具体的关于PowerShell的介绍能够看微软的官方文档Windows PowerShell 入门
学习
jenkins上有支持的FTP插件,好比Publish Over FTP Plugin,下载以后安装重启jenkins。测试
在系统管理-系统设置下找到Publish over FTP
项的设置,添加FTP服务的地址,端口,用户名和密码等相关配置,而后点击TestConfiguration
按钮,若显示Success表示配置成功。能够手工添加多个FTP配置。
点击Advanced
按钮修改端口或超时时间等配置
配置完成后到Job中添加FTP上传功能,在Build
中点击Add Build step
选择Send file over FTP
在Name
经过下拉选择前面配置的FTP站点,在Transfers
配置须要上传的文件和上传到远程的目录。
Source files
:支持通配符,如上传全部文件*.*
,或bin/Release/
下的全部文件
Remove prefix
:表示上传文件去除前缀,FTP默认会将文件的相对路径一块儿上传,若不须要bin/Release
则能够配置去除该相对路径,如bin/Release/Test.exe
上传到FTP上若没有指定FTP远程相对路径,则为FTP根目录下的Test.exe
文件。
Remote directory
:表示上传到FTP目录下的哪一个相对目录中,通常来讲咱们能够按Job名称分文件夹,能够通配置Jenkins内置的环境变量,如$JOB_NAME
/ui
上传FTP前须要保证FTP上目录结构存在,不然会上传失败。所以上传FTP前须要经过脚本到服务器的FTP目录上创对应的文件夹路径。
通常来讲咱们编译完成后须要将程序按版本号分目录存在,好比1.0.X的存放到1.0的目录中。2.0.X的存放到2.0的目录中。所以咱们能够在Remote directory
填写${JOB_NAME}/$PROCESS_VERSION
,以下图所示
而$PROCESS_VERSION
变量的值咱们须要在前面的脚本中获取,因为在jenkinsBuild
步骤中建立的每一个powershell脚本块,jenkins都会将其保存到临时的XXXX.ps1
脚本文件中,所以不一样的步骤产生的变量是在不一样的脚本文件中,也就是在不一样的做用域中。所以在前面建立的脚本获取到的版本号,没法直接在下一个脚本中获取。
关于powershell的变量做用域能够查看Powershell变量的做用域。
以下图所示,第一个脚本中赋值的$PROCESS_VERSION
在后面的脚本以及FTP目录中都是获取不到该变量的。
所以咱们能够经过将变量保存到文件,而后从新载入到Jenkins的环境变量中,Jenkins的环境变量在Jenkins当前Job中均可以获取到。
使用Jenkins的环境变量插件EnvInject Plugin实现上述功能。安装完插件以后重启Jenkins。
若是咱们多个Job须要用到一样的参数常量,那咱们能够将参数直接在Jenkins配置中注入到环境变量中,而后能够经过环境变量$Env:XXXX
获取到咱们配置的变量值。
在系统管理-系统设置下找到Global properties
项,勾选环境变量,后便可设置全局的环境变量。这样当这些变量修改后,只须要在设置中修改一次,而无需修改每一个Job中的脚本变量值。
咱们如今能够直接在Job中使用配置好的全局环境变量。在构建以后,能够在当前构建项的Environment Variables
查看到已加载的环境变量
、
如今咱们就能够将将版本号信息存入到文件中,而后从新加载到全局环境变量中了。
首先在经过脚本获取到程序的版本号,将它保存到文件中,保存格式为变量名=变量值
,如将PROCESS_VERSION="1.0.0.0"
保存到Version.txt
文件中。
而后经过环境变量注入插件从文本中读取环境变量,在Build
中添加Inject environment variables
步骤,在Properties File Path
中填写Version.txt
,则会从文本中读取环境变量,多个环境变量经过换行分割。
默认PowerShell保存的格式是含有BOM的Unicode编码,而Jenkins读取ASCII编码格式。所以须要指定文本输出编码为ASCII
经过Powershell脚本也能够调用.Net库将文件压缩或上传,这里暂时不讨论脚本编写细节问题。后续文章将给出完整的解决方案。
在Linux环境下能够经过SSH进行远程调用,而在Windows环境下则可使用Windows 远程管理 (Windows Remote Management,简称WinRM)。
WinRM是微软实现的WS-Management协议的, 这是一种基于标准的简单对象访问协议(SOAP), 因为它是基于防火墙友好的协议, 所以容许来自不一样供应商的硬件和操做系统交互。关于WinRM具体的介绍能够查看Windows Remote Management
咱们能够理解为WinRM提供了一个服务端,同时向外暴露了相关的API,而同时Powershell能够与WinRM进行交互,即Powershell自己就是一个远程调用的客户端,经过Powershell执行相关的命令与WinRM交互,从而实现远程调用,执行自定义脚本,甚至是执行服务器上的指定路径下的脚本。
所以咱们若须要进行远程调用,首先在对应的服务器上须要开启WinRM的相关功能。
快速配置
微软为了简化WinRM的配置,提供了一个快捷命令进行默认的快速配置。经过调用winrm quickconfig
进行快速配置。
也能够跳过该步骤,直接运行第二步骤开启WinRM服务。
以下返回则为正常配置成功
PS C:\Users\Administrator> winrm quickconfig 在此计算机上,WinRM 已设置为接收请求。 WinRM 没有设置成为了管理此计算机而容许对其进行远程访问。 必须进行如下更改: 在 HTTP://* 上建立 WinRM 侦听程序接受 WS-Man 对此机器上任意 IP 的请求 启用 WinRM 防火墙异常。 配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。 进行这些更改吗[y/n]? y WinRM 已经进行了更新,以用于远程管理。 在 HTTP://* 上建立 WinRM 侦听程序接受 WS-Man 对此机器上任意 IP 的请求 WinRM 防火墙异常已启用。 已配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。
须要注意的是,在我本地win10环境,没法执行快速配置,提示说网络链接类型是公用。
PS C:\Users\Dm_ca> winrm quickconfig 已在此计算机上运行 WinRM 服务。 WSManFault Message ProviderFault WSManFault Message = 因为此计算机上的网络链接类型之一设置为公用,所以 WinRM 防火墙例外将不运行。 将网络链接类型更改成域或专用,而后再次尝试。 错误编号: -2144108183 0x80338169 因为此计算机上的网络链接类型之一设置为公用,所以 WinRM 防火墙例外将不运行。 将网络链接类型更改成域或专用,而后再次尝试。
经过Get-NetConnectionProfile
命令能够看到网络类型(和网络和Internet设置中看到的是同样的)其中NetworkCategory : Public
即显示该网络的种类。
PS C:\WINDOWS\system32> Get-NetConnectionProfile Name : Seven InterfaceAlias : WLAN InterfaceIndex : 17 NetworkCategory : Private IPv4Connectivity : Internet IPv6Connectivity : NoTraffic Name : 未识别的网络 InterfaceAlias : vEthernet (Default Switch) InterfaceIndex : 29 NetworkCategory : Public IPv4Connectivity : NoTraffic IPv6Connectivity : NoTraffic
经过管理员权限运行Set-NetConnectionProfile -NetworkCategory Private
将全部网络设置为专用网络类型后
再次尝试快速配置。
PS C:\WINDOWS\system32> Set-NetConnectionProfile -NetworkCategory Private PS C:\WINDOWS\system32> Get-NetConnectionProfile Name : Seven InterfaceAlias : WLAN InterfaceIndex : 17 NetworkCategory : Private IPv4Connectivity : Internet IPv6Connectivity : NoTraffic Name : 未识别的网络 InterfaceAlias : vEthernet (Default Switch) InterfaceIndex : 29 NetworkCategory : Private IPv4Connectivity : NoTraffic IPv6Connectivity : NoTraffic
winrm qc是winrm quickconfig缩写
启用远程服务
经过输入Enable-PSRemoting –Force
启用Powershell远程调用功能。若没有-Force
会有若干选项须要你进行确认。输入了-Force
则自动会确认,建议带上该参数。
PS C:\Users\Administrator> Enable-PSRemoting –Force 在此计算机上,WinRM 已设置为接收请求。 WinRM 已经进行了设置,以用于在此计算机上进行远程管理。
若第一步骤winrm qc
存在网络类型为公网没法进行配置时,当前命令添加SkipNetworkProfileCheck
跳过网络类型检查,完整命令为Enable-PSRemoting -SkipNetworkProfileCheck -Force
。
若输入
Enable-PSRemoting
,则能够再也不输入winrm qc
进行配置。前者作的工做已经包含了后者所作的全部工做。
查看WinRM服务监听
经过winrm enumerate winrm/config/listener
能够查看WinRM服务的当前监听信息
PS C:\Users\Administrator> winrm enumerate winrm/config/listener Listener Address = * Transport = HTTP Port = 5985 Hostname Enabled = true URLPrefix = wsman CertificateThumbprint ListeningOn = 10.60.45.239, 127.0.0.1, XXXXXXXXXXX
若上一步WINRM配置没有成功,则会返回如下信息
PS C:\Users\Dm_ca> winrm enumerate winrm/config/listener WSManFault Message ProviderFault WSManFault Message = 拒绝访问。
启用Powershell本地脚本执行
若须要在服务上执行本地脚本,则须要启用本地脚本执行权限。经过执行set-ExecutionPolicy RemoteSigned
容许本地脚本执行。
PS C:\Users\Administrator> set-ExecutionPolicy RemoteSigned 执行策略更改 执行策略能够防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies 帮助主题中所述的安全风险。是否要更改执行策略? [Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): y
获取winrm客户端配置信息
经过上述4个步骤,服务端的远程调用已经开启,因为winrm自己有白名单安全策略,所以须要配置如下客户端的配置,容许指定的ip执行远程调用。经过输入winrm get winrm/config/client
获取客户端配置。
PS C:\Users\Administrator> winrm get winrm/config/client Client NetworkDelayms = 5000 URLPrefix = wsman AllowUnencrypted = false Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false DefaultPorts HTTP = 5985 HTTPS = 5986 TrustedHosts
Get-Item WSMan:\localhost\Client\TrustedHosts
效果也同样。设置白名单地址
TrustedHosts
表示的是白名单地址。
经过Set-Item wsman:\localhost\client\trustedhosts *
设置容许全部IP调用。
经过Set-Item wsman:\localhost\client\trustedhosts "127.0.0.1,127.0.0.2"
设置容许指定IP调用
cmd
下能够输入winrm set winrm/config/client @{TrustedHosts="*"}
,测试了powershell下不支持该命令
Set-Item wsman:\localhost\client\trustedhosts "127.0.0.1,127.0.0.2" WinRM 安全配置。 此命令修改 WinRM 客户端的 TrustedHosts 列表。TrustedHosts 列表中的计算机可能不会通过身份验证。该客户端可能会向这些计算机发送凭据信息。是否确实要修改此列表? [Y] 是(Y) [N] 否(N) [S] 暂停(S) [?] 帮助 (默认值为“Y”): y PS C:\WINDOWS\system32> winrm get winrm/config/client Client NetworkDelayms = 5000 URLPrefix = wsman AllowUnencrypted = false Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false DefaultPorts HTTP = 5985 HTTPS = 5986 TrustedHosts = 127.0.0.1,127.0.0.2
客户端远程调用
当设置好上述配置咱们就能够测试如下远程调用是否完成,经过在d盘放一个hellworld.ps1
脚本,填写如下内容。
hello world!
而后就能够在本地powershell中输入如下指令测试远程调用是否正常返回hello world!
$account = "administrator" $password = "test1" $address="127.0.0.1" $secpwd = convertto-securestring $password -asplaintext -force $cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd invoke-command -computername $address -Credential $cred -command {d:helloworld.ps1}
convertto-securestring
将明文密码转换为安全字符串,这样避免了明文密码在网络上传输泄露。invoke-command
将服务器地址传入以及受权对象传入便可执行远程脚本调用。想更详细的了解启用远程服务的细节能够查看Enable Powershell Remoting
须要注意的是,若使用域帐户用户名进行远程调用时,用户名须要使用域名\用户名
,而使用非域帐户用户名进行远程调用时,用户名须要使用\用户名
。不然可能出现以下的错误信息
好比我要远程登陆的用户是非域用户,用户名为administrator
,则使用\administrator
。
域帐号是把账号存储于域中的某一台服务器,分享给同一个域中的全部计算机使用。
经过powershell与winrm实现远程调用,服务升级就是将上传到FTP的程序替换原有的程序便可。
这里须要说明的一点是,控制台程序和含有GUI界面的程序能够经过调用命令杀掉进行实现关闭程序,可是要经过powershell启用相关的控制他程序或含有用户界面的程序,则很难作到。主要缘由是在windows环境下远程命令执行和登陆windows用户同样,都是基于会话执行。在Windows安全模型设计上,是不支持启动其余会话的程序。相关问题能够查看Use Powershell to start a GUI program on a remote machine。
换句话说,在会话链接释放时,则会自动注销会话相关的资源。所以当WinRM远程调用结束后则会释放临时会话资源。
为了实现启用GUI程序,可使用PsExec。PsExec 是一款轻量级的远程替换设备, 可以让您在其余系统上执行进程, 并为控制台应用程序提供完整的交互功能, 而无需手动安装客户端软件。对于PsExec具体使用暂时没有验证过,有时间后面再作探讨,这里不进行深究。
另外一种方案是Powershell所能实现的是,基于Windows的定时任务,能够设定在1分钟后启动GUI的exe文件。(Windows任务最小时间单位是1分钟)实际上来讲服务中断1分钟可不是好事,虽然能实现启动服务,可是不建议使用,不作过多探讨。
最好的方式是将服务器上的程序注册为Windows服务,那么就很好的支持服务的关闭和启动。
本文对Windows下的持续部署方案所设计到相关的技术进行了简单介绍,后续的持续集成将彻底使用本篇文章设计到的Powershell脚本和远程调用相关技术实现,后续持续集成惟一的要点就是持续集成逻辑的脚本编写。在后续文章中,将会介绍powershell的压缩解压,ftp脚本上传,以及经过脚本生成差量更新包等具体工做。
本文地址:http://www.javashuo.com/article/p-dtqyisab-kz.html 做者博客:杰哥很忙 欢迎转载,请在明显位置给出出处及连接