网上关于Jenkins发布.NET项目到Windows服务器的文章不多,而很多都已经过时了,而且大部分Jenkins还是安装在windows中的,所以觉得自己摸索一下
一. 环境、准备工作
- 新建一个.NET 6 website 项目,并且上传到git中。
- 完成Jenkins的安装 (本例是通过Docker安装的Jenkins)
- 发布服务器中安装Docker环境
二. Jenkins 添加git认证与安装插件
Jenkins安装好后,进行以下配置和插件安装
我的Jenkins是英文界面,麻烦自行匹配中文,抱歉抱歉。
1. 添加git认证
登录首页后,点击 Manage Jenkins
点击 Credentials
点击 System
点击 Global credentials
点击右上角 Add Credentials
选择对应的认证方式,例子中使用的是gitlab的username + access token,选择 username with password,填入信息后保存。
2. 安装 Publish Over SSH 插件
这个插件用于连接到远程服务器,Linux 和 windows server都可以用
在首页中,点击 Manage Jenkins -> Plugins 进入插件管理页面
点击 Available plugins , 搜索 Publish Over SSH, 勾选后点击 安装且不重启
安装完成后,点击 Manage Jenkins -> System 拖到下方 Publish over SSH 位置,在SSH Server 下点击 Add
在新出现的选项卡中,填入对应信息:
- name : 自定义服务器名称
- hostname: 链接地址
- username: 服务器的登录账号
- Remote Directory: 自定义远程连接后的默认地址,通常是传输文件的父级目录,我设定的是C:/www/ ,目录下再设置app1、app2等其他程序的目录
坑:注意此处填写的是 /C:/www/
,盘符必须带/
点击下方 Advance 后,再点击 Use password authentication, or use a different key 在下方 Password 中填写密码,完成后点击 Save, 这样远程服务器的连接配置就完成了
3. 安装 .NET SDK Support 插件
在Jinkins中编译.net项目,网上的文章不多,且大多数都是用的MSBuilder,这个插件很久没更新了,而且我并没有成功。无意中看到有 .NET SDK Support 插件,而且更新时间较近,只在外网找到一篇文章,所以决定自己照着试试并且研究下。
在 Manage Jenkins -> Plugins -> Avaliable plugins 中搜索 .NET SDK SupportVersion 并安装
在 Manage Jenkins -> Tools -> .NET SDK installations 中添加.net版本,依照.NET 6为例
点击 Add .Net SDK 后,输入名称.NET 6 (自定义)
.NET Vsersion \ Release \ SDK \ Platform 中选择对应的选项
点击保存后完成
三、配置发布流程方案2:在Jenkins中编译、发布
1. 在windows 服务器中创建站点
在IIS中添加站点,端口、托管方式等设置好,我的站点地址是C:\www\WebTest
, 并运行成功
2. 创建Jenkins项目
-
在Jenkins首页点击 New Item ,输入名称,选择第一个 Freestyle project , 点击 OK, 创建新的项目
-
创建后,在 Source Code Management 中选择 git, Repository URL 中填入 git 地址,Credentials 中选择之前录入的认证信息,如果认证失败,会有红色提醒显示,Branches to build 中填写对应分支。
-
Build Enviroment 中选择之前创建的.NET版本
-
Build Step 中添加 Execute shell 步骤,执行命令在Jenkins中编译、发布。
将 DockerTest 替换成你的.Net项目名称,此处发布文件夹是
publish
csscd /var/jenkins_home/workspace/${JOB_NAME}/DockerTest dotnet clean DockerTest.csproj --configuration Release dotnet restore DockerTest.csproj dotnet build DockerTest.csproj --configuration Release dotnet publish -c Release -o publish --verbosity detailed
到此处,建议先保存,然后点击一下 build 尝试运行
坑:如果你的Jenkins也是Docker版本的,很有可能遇到 Globalization的问题,原因是Jenkins容器内需要安装 libicu-dev
解决方案:
进入容器内容内部
docker exec -it -u root <container name> bash
安装libicu-dev
apt-get install libicu-dev
坑中坑:安装时遇到
Unable to locate package
问题,按照网上的办法更换国内镜像也没有用,最后耗费2个小时,最后在这个网站上找到最新的sources.list并且更换成功了解决方案
备份源列表文件
mv /etc/apt/sources.list /etc/apt/sources-backup.list
修改源文件,将下载的文件内容覆盖这个文件中的内容,当然也可以直接替换文件
vim /etc/apt/sources.list
执行更新命令
apt update
apt upgrade
-
在Jenkins中能编译通过后,添加 Send files or execute commands over SSH 步骤,传输文件到远程服务器
在 Name 中选择远程服务器
SourceFile 中添加需要传输的路径地址,由于此处发布的目录是publish,所以地址是
DockerTest/publish/**
** 代表文件夹下所有内容Remote Diectory 中输入服务器端的文件夹。路径是Publish Over SSH 插件中配置的默认路径+项目名,此处为
C:/www/dist/WebTest
, 这并非网站路径,只是临时存放发布文件用的Exec command 中输入远程服务器执行的命令,由于在windows 服务器中,此处多行命令只会执行第一行,所以我用
&&
符号合并多行命令成为一条命令,当然也可以创建多个step,每一个step 执行一行命令,算是一个小坑%SystemRoot%\System32\inetsrv\appcmd stop apppool /apppool.name:"WebTest" && xcopy /YE C:\www\dist\WebTest\DockerTest\bin\Release\net6.0\publish C:\www\WebTest && %SystemRoot%\System32\inetsrv\appcmd start apppool /apppool.name:"WebTest" && rmdir /s /q "C:\www\dist\WebTest"
这些命令分别为:
- 停止网站 (停止了才能修改文件)
- 复制 www/dist/xxxx 下文件到网站目录
- 启动网站
- 删除www/dist/xxxx 下文件
点击 Save 完成后,最后点击 Build Now 发布,可以看到,网站已经成功访问了