一、下载安装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文件后面加参数也可以,只是这个文件中增加了删除\新建目录等其他功能】
Release
Any CPU
参考文档: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 备份恢复