背景
阿里云测试环境一台,带宽1M跟不上,Jenkins安装一个插件耗时很长,于是想在本地搭建Jenkins服务,将生成的安装文件同步到目标服务器上。
技术点有:
-
win10
:本地环境是win10,测试环境是windown server 2012 R2
-
NET Core
:部署版本是2.1.1
,部署在IIS
上 -
Jenkins
: 安装jenkins就不介绍了 -
bat
:需要懂一点批处理命令 -
·
Jenkins插件: -
Gogs plugin
-
Publish Over SSH
所需插件自行安装
Jeknin配置流程
创建Item
选择Gogs源码地址
这里三个是必填项:仓库地址,登陆凭据,代码分支;
Gogs
是基于Git
的这里和Github
的仓库地址是一样的。
这里需要一个登陆凭证用于拉取代码,提供的凭证类型有很多,有用户名账户、SSH、以及秘钥等,这里选的是用户名和密码凭证:
分支格式就是*/xxxx
,这里用的是develop
构建触发器
这里选择的时候当Gogs
仓库收到push推送的时候触发构建。
如果没有这个选项,需要安装
Gogs plugin
插件
由于Jenkins
是本地搭建的,Gogs
无法将消息推送到,所以使用了内网穿透。
uTools 提供免费的内网穿透,很好用!
效果类似这样:
构建
jenkin
提供的脚本很多,其它的没用过,这里用到是Excute Windows batch command
这个选项
脚本命令如下:
// 清空xxxx文件夹所有文件
rd "%WORKSPACE%publishxxxx"
//如果不存在创建文件夹
if not exist "%WORKSPACE%publishxxxx" md "%WORKSPACE%publishxxxx"
//生成项目打包文件到指定文件夹下
dotnet publish "%WORKSPACE%xxxxxxxxxxxx.csproj" -o "%WORKSPACE%publishxxxx"
//当前目录是在%WORKSPACE%下的,需要cd指定具体操作目录
cd publish/xxxx
//这里是将生成的项目文件使用7-zip打包了,所以需要删除上次遗留的压缩文件,不然会将上次打包文件也打包进去
del /a/f/q xxxx.api.zip
//删除webconfig,不想copy到目标服务器上
del /a/f/q web.config
//压缩项目文件
"C:Program Files7-Zip7z.exe" a "xxxx.api.zip" "**"
之所以删除
web.config
,dotnet publish
命令不知道怎么在web.config
下生成相应的环境变量,比如目标环境是Staging
.
构建后操作
构建好发布包后,一般是部署了,拷贝到web服务下。
这里目标服务器是远程不在局域网内,之前使用过很多种方式都没成功,比如:psexec
,net use
命令。最终只有SSH完成部署。
这里的目标服务器是预先配置好的,在jenkins
的系统配置里的SSH 项下:
选择好目标服务后,设置必要的参数:
Transfer Set
需要填写选项:
Source files
:需要拷贝的目标文件Remove prefix
:移除前缀,如果不移除,会在目标服务器将前缀作为目录生成Remote directory
:目标及其需要安装SSH,这里是选择SSH可以操作的远程目录。Exec command
:将文件拷贝到目标机器后,可以执行命令,这里的命令测试时候好像只能执行一条,如果需要批量执行还是填写bat
地址吧。
本文拷贝完成后需要执行停止应用程序池和重启功能,如下:
C:WindowsSystem32inetsrvappcmd.exe stop apppool /apppool.name:"xxx"
"C:Program Files7-Zip7z.exe" x "C:UsersAdministratorjenkinsxxx.zip" -aoa -o"C:iis-publishjenkinsxxx"
C:WindowsSystem32inetsrvappcmd.exe start apppool /apppool.name:"xxx"
ECHO 服务器脚本执行完毕
第二行是7-zip的压缩命令:
x
:后面的参数源压缩文件;-o
:是解压到目标文件夹;-aoa
:是强制覆盖重复的文件;
Tip
"C:Program Files7-Zip7z.exe"
这个命令要加引号,不然出错!为什么这样没搞清楚!stop apppool /apppool.name:"xxx"
命令name后面不能有空格,不然也会出错的!踩过的坑!