Jenkins自动化部署.NetCore项目到Windows的IIS上

作者

Author:西柚eric.ding

Blog: https://www.dcmickey.cn/

环境

Windows Server服务器

IIS托管的(其他版本敬请期待)

软件集

自行下载

  • Jenkins(jenkins.msi)
  • JDK(jdk-8u191-windows-x64-8.0.1910.12.exe: Java8的)不要太新会有问题
  • Git (Git-2.33.0.2-64-bit.exe)
  • asp.net core runtime
  • iis确保安装

必备条件

唯一且强制

确保服务器需要能访问git仓库地址

食用方式

本教程不含自动监听push,权限不够,需要gitlab上配置。

本教程采用的是定时轮询SCM,会增大系统的开销,依据对环境稳定性的要求自行决定要不要接,这里是UAT无所谓

也支持手动点jenkins的一键构建

往下翻至==一键部署==查看如何部署

安装教程

安装jdk

  1. 安装jdk
  2. 配置环境变量->系统变量

  1. 编辑->变量名"Path",点击"新建",然后输入上"%JAVA_HOME%bin",点击"确定",再次点击"新建",然后输入上"%JAVA_HOME%jrebin",点击确定
  2. 新建->变量名"CLASSPATH",变量值".;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar"
  3. 验证是否安装成功

    java -version

安装Git

安装Jenkins

​ 修改端口号为5335,随意~

安装完成会自动打开jenkins网页,或者手动访问 http://localhost:5335。输入jenkins生成的密码进入

C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\secrets
c19b0c5c61304b15aa9ff9f865fd9523

选择插件来安装之后,进入到下面的页面,尽量选择无。不然安装其他插件,好多会失败,要等好长时间。

安装Jenkins汉化包

找到插件管理的地方 搜索Localization: Chinese进行安装

安装Jenkins的git插件

同上,略

修改Jenkins工作空间路径

  • 添加系统环境变量,要求不带中文的路径

    JENKINS_HOME

修改安装目录下的jenkins.xml文件,搜索并改为下面的

<env name="JENKINS_HOME" value="%JENKINS_HOME%"/>

重启Jenkins

命令重启

进入到jenkins安装目录

关闭Jenkins服务:jenkins.exe stop;
启动Jenkins服务:jenkins.exe start;
重启服务:jenkins.exe restart

浏览器url方式重启

1.关闭jenkins服务
http://localhost:5335/exit 网址就能关闭jenkins服务。
2.重新启动jenkins服务器
http://localhost:5335/restart 网址就能重启jenkins服务。
3. 重新加载配置信息
http://localhost:5335/reload 网址就能重新加载配置信息。

进入正题

开始新建项目

源码配置

构建触发器

本文采用使用定时轮询SCM机制,定时轮询如果检测到变化则自动部署

可以到 https://crontab.guru 网站来测试

没有做webhook自动监听push动作,因为git无权限配置

定时轮询SCM语法:

* * * * *
第一颗*表示分钟,取值0~59
第二颗*表示小时,取值0~23
第三颗*表示一个月的第几天,取值1~31
第四颗*表示第几月,取值1~12
第五颗*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
#每半小时构建一次OR每半小时检查一次远程代码分支,有更新则构建
H/30 * * * *

#每10分钟
H/10 * * * *

#每两小时构建一次OR每两小时检查一次远程代码分支,有更新则构建
H H/2 * * *

#每天凌晨两点定时构建
H 2 * * *

#每月15号执行构建
H H 15 * *

#工作日,上午9点整执行
H 9 * * 1-5

#每周1,3,5,从8:30开始,截止19:30,每4小时30分构建一次
H/30 8-20/4 * * 1,3,5

构建配置

分段添加脚本(也可以合在一起)

停止iis应用程序

C:\Windows\System32\inetsrv\appcmd.exe stop apppool /apppool.name:platform

platform为应用程序名称

构建部署

废弃

d:
cd D:\soft\JenkinsWorkspace\workspace\ccm.api
dotnet clean --configuration Release
dotnet restore -s https://nuget.cdn.azure.cn/v3/index.json
dotnet restore -s https://api.nuget.org/v3/index.json
dotnet restore -s D:\nuget\packages
dotnet build
dotnet publish "%JENKINS_HOME%\workspace\ccm.api\CCM.Console.Api" -o D:\publish\jenkins
xcopy "D:\publish\jenkins" "D:\var\www\boost\rsun.api\src" /s/e/y/exclude:D:\soft\jenkins.ignore.txt

改进

使用$JOB_NAME 自动抓取任务名称

d:
cd D:\soft\JenkinsWorkspace\workspace\ccm.api
dotnet clean --configuration Release
dotnet restore -s https://nuget.cdn.azure.cn/v3/index.json
dotnet restore -s https://api.nuget.org/v3/index.json
dotnet restore -s D:\nuget\packages
dotnet build
dotnet publish "%JENKINS_HOME%\workspace\$JOB_NAME\CCM.Console.Api" -o D:\publish\jenkins
xcopy "D:\publish\jenkins" "D:\var\www\boost\rsun.api\src" /s/e/y/exclude:D:\soft\jenkins.ignore.txt

==部署时的排除文件==

D:softjenkins.ignore.txt

appsettings.Development.json
appsettings.json
appsettings.Local.json
web.config
log4net.config
Setting.json

  1. 启动iis应用程序
C:\Windows\System32\inetsrv\appcmd.exe start apppool /apppool.name:platform

效果图

一键部署

如果想要手动立刻执行自动化部署,则看这里

本文已经加入轮询会定时检测变化已部署

点击Build Now

over!!!

FAQ:构建失败

Jenkins安装失败

实测踩坑,Jenkins和JDK版本有关联要求,推荐使用jdk-8uxxx的,其他的不做保证

使用了私服的nuget源,服务器访问不到,部署报错

需要解决nuget私服访问问题,方式是改为本地仓库

一、修改本地储存nuget包路径,也可以不改,则跳过,直接==第二步==

  • 修改配置文件
C:\Users\{user}\AppData\Roaming\NuGet\NuGet.Config

添加或修改配置,自建仓库

d:nugetpackages

<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
...
  <config>
    <add key="globalPackagesFolder" value="d:\nuget\packages" />
  </config>
</configuration>
  • nuget命令配置变量
nuget config -Set globalPackagesFolder=d:\nuget\packages

二、将本地下载的包适当复制到服务器上

如果没有执行第一步,则默认的包源存放地址为

C:\Users\{user}\.nuget\packages

将这个里面需要的包复制到服务器上,地址如下

d:\nuget\packages

dotnet restore -s 包的路径

需要指定多个 因为会覆盖原配置的源

dotnet restore -s https://nuget.cdn.azure.cn/v3/index.json
dotnet restore -s https://api.nuget.org/v3/index.json
dotnet restore -s D:\nuget\packages

Jenkins部署的包不是最新的?

任务配置如下:

因为本人想要实现qa分支自动部署,develop需要的时候手动部署,因此新增了一个,并改了这个名称

排查思路:

首先查看控制台输出看拉取的分支对不对,然后分支提交合并是否成功。确保都没有问题的话,那么检查工作空间中下载的git代码是否正确

到这里我就找到问题了,原来是改了任务名称,所以jenkins工作路径也自动改了,而我配置的脚本还是用的原来的,所以一直打得是原来的路径下的包!

痛并快乐着~

也就是上面这行代码

dotnet publish "%JENKINS_HOME%\workspace\ccm.api\CCM.Console.Api" -o D:\publish\jenkins

需要改为

dotnet publish "%JENKINS_HOME%\workspace\{自己的任务名}\CCM.Console.Api" -o D:\publish\jenkins

dotnet publish "%JENKINS_HOME%\workspace\ccm.api-qa-auto\CCM.Console.Api" -o D:\publish\jenkins

那么有没有一劳永逸的方法呢?

答案是有!

$JOB_NAME

在Jenkins创建的每个项目的名称都可以通过环境变量$JOB_NAME获得

比如在shell中编写脚本,可以用到

cd /var/lib/jenkins/jobs/$JOB_NAME/workspace/code
./pid_daily.lsp /var/lib/jenkins/jobs/$JOB_NAME/workspace/code /user/jenkins/bigdata/daily

参考网址:

jenkins安装插件的两种方式:https://www.jianshu.com/p/3b5ebe85c034

jenkins构建触发器定时任务Build periodically和Poll SCM【转载】:https://www.cnblogs.com/caoj/p/7815820.html

Windows+.NetCore+git+IIS在Jenkins上的自动化部署入门:https://zhuanlan.zhihu.com/p/346717062

Jenkins发布.Net Core项目到IIS:https://www.cnblogs.com/langhaoabcd/p/10267869.html

IIS 站点和应用池命令启动和停止:https://www.cnblogs.com/jmaly/p/9860606.html

获取不到公司/第三方的NuGet包 :https://www.cnblogs.com/YahuiWang/p/jenkins-docker-dotnet-core-publish.html

忽略钩子 post-commit: 关于钩子(webhook): https://www.cnblogs.com/yoyoketang/p/12535907.html

jenkins变量获取-项目名称:https://blog.csdn.net/hjrnet/article/details/86148008