Jenkins 发布.NET项目到Windows服务器

网上关于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项目

  1. 在Jenkins首页点击 New Item ,输入名称,选择第一个 Freestyle project , 点击 OK, 创建新的项目

  2. 创建后,在 Source Code Management 中选择 git, Repository URL 中填入 git 地址,Credentials 中选择之前录入的认证信息,如果认证失败,会有红色提醒显示,Branches to build 中填写对应分支。

  3. Build Enviroment 中选择之前创建的.NET版本

  4. Build Step 中添加 Execute shell 步骤,执行命令在Jenkins中编译、发布。

    将 DockerTest 替换成你的.Net项目名称,此处发布文件夹是 publish

    css 复制代码
    cd /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

  5. 在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 发布,可以看到,网站已经成功访问了

相关推荐
ldj20204 小时前
Jenkins 部署脚本
jenkins
你想考研啊4 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
你想考研啊7 小时前
四、jenkins自动构建和设置邮箱
运维·jenkins
Code blocks7 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
会又不会11 小时前
Jenkins-Email Extension 插件插件
运维·jenkins
东林牧之20 小时前
CICD[导航]、docker+gitlab+harbor+jenkins从安装到部署
docker·gitlab·jenkins
biass1 天前
jenkins角色权限
运维·jenkins
tomorrow.hello1 天前
Jenkins Pipeline(二)
运维·jenkins
会又不会2 天前
Jenkins-Publish HTML reports插件
运维·jenkins
庸子2 天前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins