Jenkins 实现.net项目一键部署

一、下载安装Jenkins  : 

官网地址 https://jenkins.io/index.html   安装没什么特殊的 常规安装即可。安装后默认占用8080端口。可通过浏览器访问。

二、配置:

首次访问,会提示安装插件,如果安装Jenkins的服务器可以联网,选择需要的安装即可。但如果不能联网,这里不能选择任何插件安装,否则会报错(后面会自己下载插件包通过上传的方式进行安装)。

然后就是注册一个管理员账号 即可登录进行配置了。

        离线安装插件:

插件下载地址:http://updates.jenkins-ci.org/download/plugins/




               下载好对应的插件(一般最新版就行,注意插件的依赖关系,要下载整个依赖树的所有下游插件并从下往上安装,否则会出错,也可以根据出错提示依次下载缺少的插件)。

系统管理-->管理插件-->高级-->上传插件-->选择文件-->选择刚才下载的安装包(一次只能选择一个,一般为hpi格式),然后会自动进行安装。如果安装失败,一般是由于缺少依赖插件引起的  这时候点击查看详情 ,先安装缺少的依赖插件即可。



对于我们的部署.net项目 ,用到的主要插件有 MSBuild (编译.net项目),GitLab(从源码管理器上获取代码并编译),Publish Over FTP或FTP publisher(通过FTP把生成的项目文件传送到目标服务器,但是需要目标服务器的FTP支持,后面实际没有采用这种方式),PowerShell(停止\开启远程服务器服务、网站、拷贝文件等用途),   Copy Artifact Plugin(把其他Job工作区的文件拷贝到当前Job)。 除此之外  还有许多下游依赖插件 如git 等  就不一一列出。

三、部分插件的全局设置:

        系统管理-->系统设置 中 


这个插件是用FTP向远程服务器拷贝文件/文件夹用的 (需要远程服务器开启FTP服务),由于我后来使用的PowerShell 方式,所以这个方式暂时没有用到,后期备用吧。


 四、项目配置:


其中 Credentials 是要用 SSH Username with private key 方式配置的,把本机的PRIVATE KEY填上即可 【其他方式暂时连不上,待研究】

配置GitLab Hook :

 通过GitLab Hook  钩子  可以实现  有代码push到指定分支自动执行JOB的目的。

 需要安装Jenkins的插件有 gitlab-hook  (依赖于ruby-runtime

安装好后   需要分别在gitlab 和jenkins 上做相应的配置   

jenkins 触发器中选择gitlab hook    能看到回调URL , 高级选项 生成 Token。     然后去gitlab 分别把 回调URL 和Token 填入 webhooks设置界面  。

新增 然后测试 ,如果显示蓝色200  则配置成功!  具体步骤见下图 











这里没什么可说的 具体编译的细节 参数都写在 solution.msbuild 文件里了 ,注意这个文件也要上传到git 。 这文件里主要做了三件事

   删除原生成目录

   建立新生成目录

   编译生成项目 

   当然这个过程中的涉及的这些目录 都是放在工作空间目录中的。工作空间可以在这里找到: Jenkins\workspace\JobName  Jenkins目录 在全局设置里面可以设置)

----------------------------------20170703补充  msbuild 不调用脚本,直接写参数----------------------------------

msbuild 可以直接调用sln以及csproj文件。所以如果是发布web项目的时候,可以msbuild 后面直接跟要发布web项目的csproj文件。

如msbuild  Web.csproj   

关于后面的参数  例如:

/t:ResolveReferences;Compile
 /t:_CopyWebApplication 
 /p:Configuration=Release 
/p:WebProjectOutputDir=C:/Software/Jenkins/workspace/MESWebService/Publish
 /p:OutputPath=C:/Software/Jenkins/workspace/MESWebService/Publish/bin

这是发布Web项目的 一般参数形式 把最后两行  发布地址换了即可

----------------------------------------------------------------------------------------------------------------------------------



    这步操作 是把生成的项目目录存档,以便下游Job调用。这里用到了 Copy Artifact  插件。

下面就是第二个Job了  :



  这两个地方 是和上一个Job衔接的 当上一个JOB执行成功自动触发,把生成成功的发布目录拷贝到当前工作空间


此处是另一个关键,利用PowerShell  先停止远程网站, 把文件覆盖过去,再启动网站,最后别忘了释放登录Session .

*****************20170628补充 发布项目前自动备份************************************************************************

思路是使用PowerShell脚本  把当前的项目文件夹 整个拷贝到备份文件夹中 ,并以当前日期时间命名。

上图中的Powershell命令做如下修改:

 Invoke-Command -Session $session -ScriptBlock{
 c:\windows\System32\inetsrv\appcmd stop site "WebService"
 E:\WebServiceBackUp\BackUpDir.ps1     #停掉网站后  执行备份脚本(备份脚本已写好  放置在网站部署服务器上)
}

备份脚本内容如下:

#源目录
$pathFrom = "E:\WebService";  
#目标目录
$pathTo = "E:\WebServiceBackUp\bak"+(Get-Date -Format 'yyyyMMddHHmmss');   
write-host("SourcePath is: " + $pathFrom);  
write-host("TargetPath is: " + $pathTo);  
#创建目标目录 
mkdir -Pa $pathTo;   
if (!(Test-path -path $pathFrom)){  
  write-host("SourcePath is not exist!");  
  exit -1;  
}  
  
$pathCopyTo = "";  
$pathFromLen = $pathFrom.Length;  
$LenGap = 0;  
$LenGap2 = 0;  
  
ls -r $pathFrom  | Foreach-Object{  
    $lenGap = $_.FullName.Length - $pathFromLen - $_.Name.Length - 1;  
    $pathCopyTo =  $PathTo + $_.FullName.Substring($pathFromLen, $lenGap);  
  
    write-host("Copy " + $_.FullName + " to " + $pathCopyTo);  
    if(!(Test-path -path $pathCopyTo)){ 
        mkdir -Pa $pathCopyTo;  
    }  
    copy-item $_.FullName $pathCopyTo -Force;  
}  
exit 0;  

使用的时候 只需要根据实际情况把源目录和目标目录修改了就好(也可以写成参数的形式在调用脚本的时候传进目录)

注:部署项目的服务器 初次运行ps1脚本的时候 出现“无法加载文件 ******.ps1,因为在此系统中禁止执行脚本” 的错误 ,原因是默认设置是禁止运行

脚本的,需要手动打开 ,方法是在PowerShell  中 输入命令  set-executionpolicy remotesigned  然后再按提示输入Y 即可

********************************************20170629补充   一键还原到最近备份版本*************************************************************************

根据上一步操作 ,在发布新版本前,已经把项目都备份好了 。下面的思路依然是利用Jenkins新建一个Job去直接调用服务器上写好的powershell脚本。

 Jenkins配置:

$pass=ConvertTo-SecureString -String '密码' -AsPlainText -Force
$cre=New-Object System.Management.Automation.PSCredential('用户名', $pass)
$session=New-PSSession -ComputerName 服务器IP -Credential $cre

 Invoke-Command -Session $session -ScriptBlock{
 c:\windows\System32\inetsrv\appcmd stop site "网站名"
 E:\WebServiceBackUp\RevertVersion.ps1  #要执行的关键脚本
 c:\windows\System32\inetsrv\appcmd start site "网站名"
}
Remove-PSSession -Id $session.Id
PowerShell脚本:

$pathFrom = "E:\WebServiceBackUp";  
$pathTo = "E:\WebService";  
#获取最新的备份文件目录
$pathFrom= $pathFrom+"\"+(ls  "e:\WebServiceBackUp\" |?{$_.Mode -eq "d----"}|sort -Descending LastWriteTime)[0].Name; #通用
#$pathFrom= $pathFrom+"\"+(ls -dir -r $pathFrom | sort -Descending LastWriteTime)[0].Name;  #仅ps5支持 服务器上版本太低。。
write-host("Source:"+$pathFrom);
write-host("To"+$pathTo);
#清空项目文件夹
Remove-Item ($pathTo+"\*") -recurse
write-host("Clear Finish!");
#拷贝文件
$pathCopyTo = "";  
$pathFromLen = $pathFrom.Length;  
$LenGap = 0;  
 ls -r $pathfrom  | foreach-object{  
 $lengap = $_.fullname.length - $pathfromlen - $_.name.length - 1;  
 $pathcopyto =  $pathto + $_.fullname.substring($pathfromlen, $lengap); 
 if(!(test-path -path $pathcopyto)){ 
     mkdir -pa $pathcopyto;  
 }  
 copy-item $_.fullname $pathcopyto -force;  
 }  
 write-host("Revert Finish!");
 exit 0; 
以上脚本  在备份文件夹中筛选备份的时候  是按修改时间筛选最近的文件夹 ,还有一个思路 ,可以按备份文件夹命名格式 用正则过滤出所有备份文件夹,再按文件夹

名字降序排列也能取出最近的文件夹名字。

*******************************************************************************************************************************************************************

至此 ,任务的配置基本完成。执行的时候 只需打开第一个Job  点击立即构建,即可自动完成项目从GitLab上拉取指定分支的最新代码,编译发布,停网站,

拷贝覆盖文件,启动网站等一系列动作,当然 ,后期如有需要 ,可以设置轮询方式,在指定时间自动发布项目,或者使用Hook 钩子方式,当有代码提交自动

发布项目。

 

  下面说一下.net项目的编译环境、MSBuild环境配置、PowerShell的设置等文件:

    MSBuild  命令的使用,要配置环境变量,把.net framework 的目录(如C:\Windows\Microsoft.NET\Framework\v4.0.30319)写进Path环境变量中。

    编译要有环境,而一般服务器是没有开发环境的,这时候一般有两个选择,安装Visual Studio (2012以上,建议这种后期麻烦可能会少一点),要不就

安装 Windows SDK ,这里面有编译所依赖的东西。这时候 可以尝试编译了 ,一般测试编译环境的时候在本地直接用msbuild 命令即可,不用上Jenkins.

这时候,可能会提示缺少各种文件,根据错误提示,从开发机上拷贝过去即可,注意,上传gitlab时  packages包,各种引用dll也要上传,不然后面拉取代码到工作区编译的时候

会少这些文件.。

注意,编译时候,报错可能会跟C:\Program Files (x86)\MSBuild 目录中的文件有关,这时候根据提示,把相应的目录从开发机拷贝过去,实在不行 把出错目录

删除会有奇效,它会寻求其他目录,其他目录环境也许是完好的。


      我操作的环境是Windows Server 2008 R2   ,但是PowerShell的向远程服务器拷贝文件的命令只能PowerShell5才支持,PowerShell5是

windows management framework5的一部分,WMF5又依赖于 Windows Server 2008 R2 SP1 和.net framework4.5,所以  都要安装上。

都装好后  打开PowerShell   $PSVersionTable.PSVersion命令查看版本  确认是不是5.

  使用PowerShell连接远程机器 需要先添加信任列表 命令 

winrm set winrm/config/client  '@{TrustedHosts="xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx"}'

(注意是设置TrustedHosts不是添加,可以设置多个TrustedHosts,用逗号分开)好像是客户端(源服务器)用设置 服务端(目标服务器)不用

  然后初始化配置 winrm quickconfig 根据提示 输入一到两次'yes' 即可。

[查看已配置的TrustedHosts:Get-Item WSMan:\localhost\Client\TrustedHosts | Select-Object Value]

 最后 贴下 solution.msbuild文件 【其实不用这个文件 ,直接 编译csproj 或sln文件后面加参数也可以,只是这个文件中增加了删除\新建目录等其他功能】

  

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"   DefaultTargets="Compile">
<ItemGroup>
 <BuildArtifactsDir Include="BuildArtifacts\" />
  <SolutionFile Include="trunk\MKCurtain.sln" /> 
</ItemGroup>

<PropertyGroup>
 <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
 <BuildPlatform Condition=" '$(BuildPlatform)' == '' ">Any CPU</BuildPlatform>
</PropertyGroup>

<Target Name="Compile" DependsOnTargets="Init">
 <MSBuild Projects="@(SolutionFile)" Targets="Rebuild"
          Properties="OutDir=%(BuildArtifactsDir.FullPath);Configuration=$(Configuration);Platform=$(BuildPlatform)" />
</Target>

<Target Name="Init"  DependsOnTargets="Clean">
 <MakeDir Directories="@(BuildArtifactsDir)" />
</Target>

<Target Name="Clean">
 <RemoveDir Directories="@(BuildArtifactsDir)" />
</Target>

</Project>

 参考文档:http://blog.csdn.net/dj0379/article/details/52389454

                     http://blog.csdn.net/wangmuming/article/details/22925671

                     http://www.cnblogs.com/scheshan/p/5849704.html

https://www.cnblogs.com/v5captain/articles/6480708.html  备份恢复

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值