zoukankan      html  css  js  c++  java
  • 利用PowerShell+Jenkins,实现项目的自动化部署

    当项目越来越庞大,部署环境越来越多以后,就会越来越依赖于自动化。比如本人公司的项目,目前有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:Users53738> winrm set winrm/config/client '@{TrustedHosts="*"}'
    

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

    PS C:Users53738> winrm quickconfig
    

    4.如何编译发布项目

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

    PS C:Users53738> C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.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:Users53738> C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe 'xxx.csproj' /p:SolutionDir='$($project.SolutionDir)' /p:VisualStudioVersion=14.0 /p:Platform=x64 /p:Configuration=Release
    

    5.如何部署到远程服务器

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

    PS C:Users53738> New-PSSession -ComputerName RemoteComputerName -Credential Get-Credential
    

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

    PS C:Users53738> $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:Users53738> Invoke-Command -Session $session -ScriptBlock{
        Stop-Service -Name 'your service name'
    }
    

    远程停止Web:

    PS C:WINDOWSsystem32> Invoke-Command -Session $session -ScriptBlock{
        $site=Get-Item 'IIS:SitesYour site'
        $site.Stop()
    }
    

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

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

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

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

    将文件打包成zip

    PS C:WINDOWSsystem32> Compress-Archive "Folder" -DestinationPath "Zip File Name" -Force
    

    将zip文件解压

    PS C:WINDOWSsystem32> Expand-Archive "Zip File Name" -DestinationPath "Folder" -Force
    

    释放PSSession

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

    6.与Jenkins集成

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

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

    1. 操作人员在执行构建页面,填写要部署的源代码分支路径
    2. Jenkins将用户填写的代码路径作为启动参数传递给PowerShell脚本
    3. PowerShell脚本启动
      • 进入指定的代码目录,用SVN Update命令下载代码。
      • 执行MSBuild编译
      • 获取环境服务器session
      • 停止环境服务器上的站点和服务
      • 将环境服务器上的项目文件打包备份
      • 将本地发布的文件覆盖到环境服务器
      • 启动环境服务器上的站点和服务

    这样,就完成了整个项目的自动化部署,每次部署时操作人员只需要进入Jenkins站点,点击几下按钮就可以完成操作。

    希望这篇文章能帮助到大家。

  • 相关阅读:
    HDU2027 统计元音 一点点哈希思想
    湖南工业大学第一届ACM竞赛 数字游戏 字符串处理
    湖南工业大学第一届ACM竞赛 我素故我在 DFS
    HDU3293sort
    HDU2082 找单词 母函数
    HDU1018 Big Number 斯特林公式
    湖南工业大学第一届ACM竞赛 分糖果 位操作
    UVA 357 Let Me Count The Ways
    UVA 147 Dollars
    UVA 348 Optimal Array Multiplication Sequence
  • 原文地址:https://www.cnblogs.com/scheshan/p/5849704.html
Copyright © 2011-2022 走看看