当项目越来越庞大,部署环境越来越多以后,就会越来越依赖于自动化。比如本人公司的项目,目前有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测试环境。

以部署研发自测试环境为例,整个流程大致如下:

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

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

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

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

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

利用PowerShell+Jenkins,实现项目的自动化部署的更多相关文章

  1. 利用jenkins做项目的自动化部署

    最近领导要求上海本地的项目需要使用进jenkins实现自动化部署,以便可以直接将项目移交给运维的同学,减轻开发的工作量.记录下这次爬坑的过程. 一.前言 Jenkins是基于Java开发的一种持续集成 ...

  2. 利用Jenkins实现JavaWeb项目的自动化部署

    修改代码,打包,上传,重启... 大把的时间花费在这些重复无味的工作上.笔者与当前主流的价值观保持一致:我们应该把时间花费在更有意义的事情上.我们可以尝试借助一些工具,让这些重复机械的工作交给计算机去 ...

  3. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

  4. Jenkins+SVN+Maven+shell 自动化部署实践

      JAVA环境中利用Jenkins+svn+maven进行自动化部署实践   一. 前言2 1.介绍jenkins2 1.本地项目打包2 2.通过secureCRT工具,手动传输到服务器2 3.然后 ...

  5. 基于Jenkins,docker实现自动化部署(持续交互)

      前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...

  6. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

  7. 基于Jenkins,docker实现自动化部署(持续交互)【转】

      前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...

  8. 5分钟快速掌握Jenkins,项目一键自动部署

    5分钟快速掌握Jenkins,项目一键自动部署 目录 前言 Jenkins是什么? Jenkins环境安装搭建 Jenkins基本使用介绍 Jenkins快速构建项目,项目自动化部署 学习总结 前言 ...

  9. 使用Git实现Laravel项目的自动化部署

    简介 不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登录到服务器,然后进行克隆或者版本更新.听起来就很麻烦,当然实际操作中也很麻烦,那 ...

随机推荐

  1. SQLServer中的死锁的介绍

    简介      什么是死锁? 我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 什么又是阻塞? 阻塞是 ...

  2. SQL Server 用链接服务器 同步MySQL

    --测试环境SQL 2014 在MySql环境: use test ; Create Table Demo(ID int,Name varchar(50)) 在控制面板—管理工具—数据源(ODBC)— ...

  3. Android 实现ListView不可滚动效果

    希望得到的效果是ListView不能滚动,但是最大的问题在与ListView Item还必有点击事件,如果不需要点击事件那就简单了,直接设置ListView.setEnable(false); 如果还 ...

  4. android 解决.XML提示ava.lang.NullPointerException at错误后XML没显示

    提示错误: java.lang.NullPointerException Exception details are logged in Window > Show View > Erro ...

  5. java报表工具FineReport常用函数的用法总结(数学和三角函数)

    ABS ABS(number):返回指定数字的绝对值.绝对值是指没有正负符号的数值. Number:需要求出绝对值的任意实数. 示例: ABS(-1.5)等于1.5. ABS(0)等于0. ABS(2 ...

  6. finereport与OA系统集成的完全方案

    随着社会信息化高速发展,企业信息化也得到了一定提高,而如何提高办公效率已经成为企业一项重要而紧迫的任务,传统的纸质报表等档案不仅浪费纸张.不易存档.不易调阅.不易统计,如何更有效.更快速提升办公效率和 ...

  7. wireshark过滤语法总结

    抓包采用wireshark,提取特征时,要对session进行过滤,找到关键的stream,这里总结了wireshark过滤的基本语法,供自己以后参考.(脑子记不住东西) wireshark进行过滤时 ...

  8. Web API 接口

    Web API 接口 在给网站编写 JavaScript 代码时,也有很多可用的 API.您可以使用下面的接口(也称为对象的类型)列表,开发 Web 应用程序或网站. 关于包含这些接口的 API 列表 ...

  9. 获取assemblies信息in .net core

    using System; using System.Linq; using System.Reflection; using System.Runtime.Loader; using Microso ...

  10. Python的高级特性4:函数式编程

    函数式编程的核心就是把函数当成对象来进行编程. 有两个常用到的方法:map/reduce,filter,其中map和filter是内建方法,而reduce不是,所以需要import相关模块. map接 ...