设为首页 收藏本站
查看: 1122|回复: 0

[经验分享] 利用PowerShell+Jenkins,实现项目的自动化部署

[复制链接]

尚未签到

发表于 2018-1-6 18:48:39 | 显示全部楼层 |阅读模式
  当项目越来越庞大,部署环境越来越多以后,就会越来越依赖于自动化。比如本人公司的项目,目前有6个web和4个windows service,同时本地有两套环境:开发自测试环境和QA测试环境。每次版本发布,需要先部署开发自测试环境;开发人员自测试通过以后,将部署的版本部署到QA测试环境;QA测试通过以后,将本次版本打包作为发布版本,交给运维人员部署生产环境。
  在以往,每次本地部署的流程是:开发人员获取最新代码-编译发布-远程连接部署机-上传版本文件-备份项目-实施部署(文件覆盖)。每次操作千篇一律,重复性很高,又非常耗时,极大影响了开发人员的工作效率。上周,我开始调研项目的自动化部署,今天搭建完毕,说下这段时间的心得。

1.选择Jenkins
  调研开始,我就首先了采用Jenkins作为操作工具,它提供了SVN/Git,MSBuild等插件,可以满足自动获取代码和编译;同时提供了完善的UI,方便操作。

2.选择PowerShell
  最开始的设想,是在构建步骤中可以通过命令行函数与操作系统交互。但是由于我们环境的特殊性(需要部署不同的环境,同时同一环境包含不止一台服务器),单纯的命令行函数无法跨服务器执行。最后决定采用PowerShell,主要是看中它以下优点:


  • 可以远程调用
  • 可以编写自己的业务逻辑代码,语法简单
3.环境的准备
  我选择的PowerShell版本是V5.0。网上搜索一下安装包,下载后在服务器安装即可。作为安装PowerShell的先决条件,.Net Framework 4.5也是必须安装的。
  
首先是选择一台独立的自动化部署服务器,在此服务器安装Jenkins,PowerShell。最好也把VisualStudio装上,否则GAC会缺少一些关键的类库。此服务器需要远程调用其它服务器的PowerShell命令,因此是个客户端机,在安装完PowerShell后,需要设置服务器白名单。
  

PS C:\Users\53738> winrm set winrm/config/client '@{TrustedHosts="*"}'  

  所有的环境服务器需要安装PowerShell,同时开启远程访问
  

PS C:\Users\53738> winrm quickconfig  

4.如何编译发布项目
  通过MSBuild,可以实现.Net项目的编译与打包。
  
以下是我发布web的命令:
  

PS C:\Users\53738> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe 'xxx.csproj' /p:DeployOnBuild=true /p:PublishProfile='$($project.PublishFile)' /p:SolutionDir='$($project.SolutionDir)' /p:VisualStudioVersion=14.0  

  几个参数的含义:
  xxx.csproj:项目文件路径
  PublishProfile:在用VS执行发布操作时,会生成这个文件。里面指定了发布操作的各种配置参数,比如发布路径,基于X86/X64平台等
  SolutionDir:解决方案文件夹
  VisualStudioVersion:安装VisualStudio时会安装一些SDK,这个参数告诉MSBuild该去哪里找这些SDK。由于我安装的是VisualStudio 2013,因此此处填写了14.0。如果不想每次都填写这个参数,也可以在csproj里面搜索这个参数名称,填写一个默认值。
  以下是我发布WindowsService的命令
  

PS C:\Users\53738> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe 'xxx.csproj' /p:SolutionDir='$($project.SolutionDir)' /p:VisualStudioVersion=14.0 /p:Platform=x64 /p:Configuration=Release  

5.如何部署到远程服务器
  要远程访问服务器,首先是利用PowerShell的New-PSSession命令,填写远程服务器的管理员账号密码登陆,获取Session
  

PS C:\Users\53738> New-PSSession -ComputerName RemoteComputerName -Credential Get-Credential  

  Get-Credential是个交互函数,执行时会弹出一个用户名密码对话框,因此我们要人为构造一个PSCredential。改写一下方法
  

PS C:\Users\53738> $pass=ConvertTo-SecureString -String 'your password' -AsPlainText -Force  
$cre=New-Object pscredential('your username', $pass)
  
$session=New-PSSession -ComputerName $server -Credential $cre
  

  获取Session以后,远程服务器已经完全落入我们的掌心。现在可以通过Invoke-Command远程执行命令,可以用Enter-PSSession直接进入远程会话,可以通过Copy-Item实现文件传输。以下是我在部署过程中遇到的常用的命令。
  
远程停止Windows Service:
  

PS C:\Users\53738> Invoke-Command -Session $session -ScriptBlock{  Stop-Service -Name 'your service name'
  
}
  

  远程停止Web:
  

PS C:\WINDOWS\system32> Invoke-Command -Session $session -ScriptBlock{  $site=Get-Item 'IIS:\Sites\Your site'
  $site.Stop()
  
}
  

  拷贝本地文件到远程服务器
  

PS C:\WINDOWS\system32> ls "local folder" | cp -Destination "remote folder" -ToSession $session -Recurse -Force  

  拷贝远程服务器文件到本地
  

PS C:\WINDOWS\system32> cp -FromSession $session -Path "Remote File" -Destination "Local Folder" -Recurse -Force  

  将文件打包成zip
  

PS C:\WINDOWS\system32> Compress-Archive "Folder" -DestinationPath "Zip File Name" -Force  

  将zip文件解压
  

PS C:\WINDOWS\system32> Expand-Archive "Zip File Name" -DestinationPath "Folder" -Force  

  释放PSSession
  

PS C:\WINDOWS\system32> Remove-PSSession -Id $session.Id #使用完毕后一定记得释放PSSesion  

6.与Jenkins集成
  Jenkins提供了PowerShell Plugin,实现了与PowerShell的集成。但是最好修改Jenkins的服务为以管理员用户登录,否则Jenkins默认以本地用户方式调用PowerShell,在执行远程脚本时会出现权限问题。修改方式很简单,进入服务-右键Jenkins-属性-登录,按下图方式配置
  

  
我在Jenkins创建了2个项目,一个用于部署研发自测试环境,一个用于部署QA测试环境。
  
以部署研发自测试环境为例,整个流程大致如下:


  • 操作人员在执行构建页面,填写要部署的源代码分支路径  


  • Jenkins将用户填写的代码路径作为启动参数传递给PowerShell脚本  


  • PowerShell脚本启动

    • 进入指定的代码目录,用SVN Update命令下载代码。
    • 执行MSBuild编译
    • 获取环境服务器session
    • 停止环境服务器上的站点和服务
    • 将环境服务器上的项目文件打包备份
    • 将本地发布的文件覆盖到环境服务器
    • 启动环境服务器上的站点和服务

  这样,就完成了整个项目的自动化部署,每次部署时操作人员只需要进入Jenkins站点,点击几下按钮就可以完成操作。
  希望这篇文章能帮助到大家。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432326-1-1.html 上篇帖子: selenium+testng+ant+jenkins 手记 下篇帖子: Jenkins的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表