Jenkins实现SVN .NET持续集成(二)
很早就完成了Jenkins的搭建和预研,但是久久没有应用到实际项目中,今年年初Jenkins陆续投入到实际项目中使用,也暴露出一些问题,如:
1.使用FTP传输文件时,总是遇到文件被占用,无法替换文件
2.如何做留痕发布
3.传输文件过多导致每次发布缓慢
Jenkins构建项目流程
拉取项目源码 ——> 调用命令还原 NuGet 包 ——> 调用配置文件生成对应的发布包 ——> 通过 SSH 发布到服务器
一、搭建SSH服务器
由于我们服务器用的windows,所以选择了freeSSHd来做我们ssh服务(带有可视化界面,方便操作)
下载freeSSHd并安装,安装过程中程序会询问是否创建密钥,是否创建Windows服务,直接点是即可,启动程序(最好用管理员启动),找到SSH选项卡将Listen address 选择为当前主机IP,为ssh添加一个专用账户(users选项卡)
Authentucation 选项卡配置一下公钥目录
ServerStatus 选项卡,将SSH服务启动
SFTP 选项卡,可以配置传输文件的根路径,注意该路径不能存在中文
注意:如果不能正常启动
检查端口是否占用
服务已经运行了,手动关掉即可
安装putty
使用puttygen生成密钥对
将Public key for pasting into OpenSSH authorized_keys file框中的公钥拷贝到文本文档中,注意这段文件只有一行,不要分成多行。然后将这个文本文档重命名成ftpuser,不要有扩展名。最后将这个文本文件拷贝到freeSSHD的公钥目录下
注意:公钥的文件名称和你要使用的user名相同
点击Save private key将私钥保存,然后拿到我们的Jenkins服务器中
添加用户也可以选择用户名密码验证的方式
配置Jenkins上的SSH
添加插件Publish Over SSH
在Configure System中添加SSH server
二、拉取SVN代码
建议创建Jenkins专用的svn用户,用于获取代码
svn仓储地址后使用 @版本号的形式可以获取指定版本的代码
三、拉取SVN代码
因为有的项目是不上传Packages目录,需要依赖package.config来还原依赖,所以需要调用一下NuGet的还原命令
在项目的构建节点,选择Execute Windows batch command
执行命令"C:\Program Files (x86)\NuGet\NuGet.exe" restore "%WORKSPACE%\test.sln"
四、调用配置文件生成发布包
在项目的构建节点,增加一个构建步骤,然后选择Build a Visual Studio project or solution using MSBuild
MSBuild Version选择msbuildv4.0(在Jenkins全局工具配置中进行配置)
填写要编译的工程文件【相对路径和绝对路径都可以】
输入命令生成发布包
/t:ReBuild /p:DeployOnBuild=true;Configuration=Release;PublishProfile=JenkinsProfile;VisualStudioVersion=15.0
JenkinsProfile是在项目中配置的用于指定到的目录,具体创建方法如下:
右键工程项目,点发布,就可以找进行新建发布配置文件了,这是我的配置:
<?xml version="1.0" encoding="utf-8"?> <!-- 此文件由 Web 项目的发布/打包过程使用。可以通过编辑此 MSBuild 文件 自定义此过程的行为。为了解与此相关的更多内容,请访问 https://go.microsoft.com/fwlink/?LinkID=208121。 --> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <WebPublishMethod>FileSystem</WebPublishMethod> <PublishProvider>FileSystem</PublishProvider> <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration> <LastUsedPlatform>Any CPU</LastUsedPlatform> <SiteUrlToLaunchAfterPublish /> <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish> <ExcludeApp_Data>False</ExcludeApp_Data> <publishUrl>..\Build\API</publishUrl> <DeleteExistingFiles>False</DeleteExistingFiles> <PrecompileBeforePublish>True</PrecompileBeforePublish> <EnableUpdateable>True</EnableUpdateable> <DebugSymbols>False</DebugSymbols> <WDPMergeOption>DonotMerge</WDPMergeOption> </PropertyGroup> </Project>
五、将发布文件进行压缩
增加一个构建步骤,并选择Execute Windows batch command
输入命令将发布文件压缩
echo 开始压缩 %WORKSPACE%\Build 下的发布文件 if not exist %WORKSPACE%\BuildZip ( md %WORKSPACE%\BuildZip echo %WORKSPACE%\BuildZip 文件不存在,已创建该文件! ) else ( echo %WORKSPACE%\BuildZip 文件已存在,删除上一版压缩文件! del %WORKSPACE%\BuildZip\*.* /s /q ) E: cd E:\7zSfx\ "E:\7zSfx\CreateSfx.bat" %WORKSPACE%\Build %WORKSPACE%\BuildZip BuildZip%SVN_REVISION%
在Jenkins服务器的E盘放了一个7zSfx,通过7z命令将发布文件压缩为一个exe文件,输出格式为BuildZip+svn版本号.exe,如 BuildZip12345.exe
7zSfx附件,由公司一个大神整理,下载
六、通过SSH将发布文件传输至服务器
增加构建后操作,选择Send build artifacts over SSH 并选择配置好的SSH
通过SSH停用对应的IIS站点
传输文件
启动对应的IIS站点