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  备份恢复
———————
作者:zy0421911
来源:CSDN
原文:https://blog.csdn.net/zy0421911/article/details/72621012
版权声明:本文为博主原创文章,转载请附上博文链接!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.