DevOps-4:Jenkins配置.Net项目模板Job
Posted 北亮bl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DevOps-4:Jenkins配置.Net项目模板Job相关的知识,希望对你有一定的参考价值。
什么是模板Job?
前文 DevOps-2:持续集成工具Jenkins构建.Net项目 里描述创建.Net构建Job
步骤其实挺多的,大小步骤有10来步。
一两个项目还好,如果十多个甚至几十个项目,都这么配置下来,工作量还是很大的。
虽然可以创建项目时,复制其它项目,但是如果某个通用步骤要修改,还是需要几十个项目一一改过去,这么苦逼的事情,咱们做CI的同学,怎么能忍?
在Jenkins里,可以创建一个模块Job,然后其它正式项目的Job引用它,这样就可以把那些共同的步骤,写在模板Job里,有变动也只需要修改那一个模板Job,不需要编辑正式项目的Job。
这么一说,这个模板Job,相当于就是Java里的abstract的基类了。
注:下面的步骤里,如果在你的配置过程没有找到对应的配置,请参考:DevOps-1:持续集成工具Jenkins的安装,安装上那些插件。
创建模板Job
1、新建Job
点击左侧菜单的“New Item”,进入创建页,输入名称:baseNetJob
,选择Freestyle project
:
注:如果前面已经创建了Job,也可以在下面的Copy from
输入之前的Job名,点OK,这样就把以前的配置自动复制过来了,再进行编辑和修改即可。
本文还是按全新的Freestyle project
来讲解。
点上一步的OK,会进入新Job的配置界面。
2、General
配置
这是Job的通用配置。
2.1、编辑 Description
这里输入该Job的说明信息,比如写:这是模板Job
2.2、这里不能勾选This project is parameterized
,因为参数无法继承到正式项目Job
3、Source Code Management
配置
这里是配置Job的源码管理,点击Git
,开启源码管理,会自动去Git更新代码:
3.1、在Repository URL
里输入 $git_src
注:git_src
是预定义的变量名,从正式项目那边配置并传递进来
3.2、点击Credentials
下面的Add
,添加Git的登录凭证;
- 在弹出页面的
Kind
里选择SSH Username with private key
, 下面Private Key
那里点击Enter directly
, 把你在Git上的id_rsa私匙内容复制进来:
注:如何获取gitlab的ssh key,并添加到gitlab里,参考官网:https://docs.gitlab.com/ee/user/ssh.html 或直接百度一下即可 - 添加完,在下拉列表里选择你刚刚添加的认证
3.3、下面Branches to build
里,输入$publish_branch
注:这是外部正式项目传入的git参数
4、Build Triggers
配置
这一步是配置一些触发器,比如定时触发、被其它Job触发、被Gitlab的webhook触发等等。
一般模板里可以不配置,在正式项目的Job里配置
5、Build Environment
配置
这是Job的一些环境变量配置,可以注入一些变量参数,方便后面的构建操作。
5.1、勾选Add timestamps to the Console Output
这是在构建的每一行,都添加时间输出,方便观看
5.2、勾选Set jenkins user build variables
这是把当前登录用户信息注入环境变量,在构建步骤里,可以通过环境变量获取当前登录人信息:
- BUILD_USER – full name of user started build,
- BUILD_USER_FIRST_NAME – first name of user started build,
- BUILD_USER_LAST_NAME – last name of user started build,
- BUILD_USER_ID – id of user started build.
- BUILD_USER_EMAIL – email of user started build.
5.3、勾选将环境变量注入构建过程
,这里可以配置一些自定义的环境变量
属性内容
就是直接配置kv对,如:
# git的url地址,外面可以直接拼接
git_url_prefix=https://git.beinet.cn/
Groovy Script
里,可以直接写代码来注入,参考代码:
def props = new Properties();
Date now = new Date();
props.deploy_time = new Date().format("yyyy-MM-dd HH:mm:ss.SSS");
props.deploy_timestamp = now.getTime(); // 1970年1月1日,00:00:00 GMT以来的毫秒数, 用于在Post-build里计算耗时
props.xxx = this.binding.getVariable('BUILD_NUMBER'); // 读取其它环境变量
println "ready for inject env:";
props.each k, v -> println "$k:$v" ; // 打印一下注入的环境变量
return props; // 必须return返回
6、Build Steps
配置
这里是构建步骤,比如一些编译、部署之类,一般放这里。
6.1、这是构建的第一步,通常用于校验一些输入参数是否合法之类,不合法就直接抛异常中断Job构建。
点击Add build step
,选择Execute system Groovy script
,添加脚本,Demo参考:
def desc = build.getEnvironment(listener).get('publish_branch')
if(desc == null || desc == "") // 如果缺少必要的参数,阻断构建
throw new Exception("publish_branch 不能为空")
6.2、为当前构建,设置一个名称,并会在列表里显示这个名称,方便后续进行分辨;
点击Add build step
,选择Update build name
,勾选Use macro
,下面填写:
$JOB_NAME_$BUILD_NUMBER@$publish_branch
这是Job名+构建序列号+选择的Git分支作为构建名
6.3、配置sonar代码扫描开始(非必须步骤)
点击Add build step
,选择SonarScanner for MSBuild - Begin Analysis
,
Project key
和Project name
都输入 $JOB_NAME
,即当前Job名
注1:后面还要配置扫描结束步骤
注2:参数 /d:sonar.branch.name=$publish_branch
按分支扫描只能用于收费版本。
如果还是想按分支扫描,那就每个分支作为一个sonar的项目来扫描就好了。
6.4、调用nuget.exe进行.Net项目的依赖包还原(nuget下载)
假设nuget.exe保存在Jenkins服务器的D:\\JenkinsWorkspace\\nuget\\nuget.exe
:
点击Add build step
,选择Execute Windows batch command
,命令里填写:
"D:\\JenkinsWorkspace\\nuget\\nuget.exe" restore “%WORKSPACE%\\%build_target_file%” -Source "https://api.nuget.org/v3/index.json"
注:build_target_file
是由外部的正式项目Job传递进来的变量,指向.sln 解决方案文件的相对路径
6.5、MsBuild编译项目(MsBuild安装参考)
点击Add build step
,选择Build a Visual Studio projecct or solution using MSBuild
,
版本选择安装时配置的MSBuild2022
,
MSBuild Build File
输入$build_target_file
Command Line Arguments
输入/t:Rebuild /property:Configuration=Release;DebugType=pdbonly;DeployOnBuild=false;OutputPath=targets
注1:build_target_file
是由外部的正式项目Job传递进来的变量,指向.sln 解决方案文件的相对路径
注2:这个配置,是整个解决方案构建;解决方案的每个子项目都会编译,结果在每个子项目的targets
目录下
6.6、添加单元测试(非必须步骤)
点击Add build step
,选择Run unit tests with VSTest.console
,
Test Files
输入$test_target_file
- 再点开
Advanced...
,Specify a logger for test results.
修改为trx;LogFileName=result.xml
- 取消勾选:
Enable Code Coverage
注:test_target_file
是构建结束后的测试项目dll全路径名,由外部正式项目配置传入,如src\\AaaTestProject\\targets\\AaaTestProject.dll
6.7、配置sonar代码扫描结束(非必须步骤)
对应步骤6.3,要添加扫描结束步骤.
点击Add build step
,选择SonarScanner for MSBuild - End Analysis
6.8、复制构建结束的结果文件
步骤6.5构建的结果是放在工作空间目录下,那个目录随时可能清理,因此要把构建结果先复制出来。
点击Add build step
,选择Windows batch command
,在命令窗口输入:
if not exist D:\\JenkinsWorkspace\\AllArchives\\%JOB_NAME%\\%BUILD_NUMBER% (
mkdir D:\\JenkinsWorkspace\\AllArchives\\%JOB_NAME%\\%BUILD_NUMBER%
)
echo f |XCOPY /Y /E %WORKSPACE%\\%archive_paths%\\*.* D:\\JenkinsWorkspace\\AllArchives\\%JOB_NAME%\\%BUILD_NUMBER%\\
这一步,先创建一个存放构建结果的目录,再把上一步的构建结果复制到结果目录里去
注:archive_paths
是正式项目里配置的,解决方案具体的那个子项目的构建结果目录,如src\\AaaWebProject\\targets
6.9、nuget库上传(非必须步骤)
如果该项目是nuget的类库项目,构建结束后,需要上传到nuget库,需要添加这个步骤:
点击Add build step
,选择Windows batch command
,在命令窗口输入:
"D:\\JenkinsWorkspace\\nuget\\nuget.exe" pack -Prop Configuration=Release;OutputPath=targets %repo_project_path% -OutputDirectory targets -OutputFileNamesWithoutVersion
"D:\\JenkinsWorkspace\\nuget\\nuget.exe" push .\\targets\\%build_target_name%.nupkg -Source http://yourNuget-url/nuget -ApiKey xxxxxx
注:repo_project_path
是csproj项目文件的相对路径,如: src\\AaaLibProject\\AaaLibProject.csproj
build_target_name
是生成的目标文件,比如 AaaLibProject.dll
7、Post-build Actions
配置
这是构建结束后的操作,一些收尾,比如通知之类的事情。
点击Add post-build action
,选择Groovy Postbuild
,输入脚本参考:
def beginTime = manager.envVars["deploy_timestamp"];
if(beginTime == null)
return;
// 注意不能直接用 println,参考 https://plugins.jenkins.io/groovy-postbuild/
manager.listener.logger.println '--==--耗时:' + (new Date().getTime() - Long.valueOf(beginTime)) + '毫秒';
8、禁用模板项目的构建
OK,到这里,模板Job项目创建完成了,先保存配置。
然后,这是个模板Job,当然要关掉它的构建能力啊,在项目首页,点击右边的Disable Project
,左边的Build Now
按钮就消失了:
创建基于模板的正式项目Job
1、General
配置
1,1、构建参数设置
- Git分支参数
勾选This project is parameterized
,再点击Add Parameter
,选择Git Parameter
:
在Name
里输入publish_branch
(注:这是变量名,后面会用到),
Description
里写请选择要构建哪个Git分支
Parameter Type
为Branch
Default Value
填写默认分支origin/master
1.2、环境变量设置
勾选准备运行环境
,在属性内容
里输入:
# 解决方案的git地址
git_src=ssh://git@git.beinet.cn:1122/AaaSolution/AaaProject/AaaProject.git
# 解决方案路径
build_target_file=src\\AaaProject.sln
archive_paths=src\\AaaProject\\targets\\_PublishedWebsites\\AaaProject
test_target_file=src\\AaaProject.Tests\\targets\\AaaProject.Tests.dll
# 是否允许sonar,可以用于条件编译
sonar_enabled=true
注:这些环境变量,就是给模板Job使用的
2、Source Code Management
配置
选择Use SCM from another project
,下面的Template Project
输入上面的模板Job名:baseNetJob
3、Build Triggers
配置
如果需要从Gitlab那边的Push事件,触发Job构建,可以勾选Build when a change is pushed to GitLab. GitLab webhook URL
然后去Gitlab那边配置Webhook事件到这里提示的URL
注:这个URL如果是127.0.0.1,可以去Jenkins系统配置那边修改成正确的
4、Build Environment
配置
勾选Use build environment from another project
,下面的Template Project
输入上面的模板Job名:baseNetJob
5、Build Steps
配置
点击Add build step
,选择Use builders from another project
,下面的Template Project
输入上面的模板Job名:baseNetJob
6、Post-build Actions
配置
点击Add post-build action
,选择Use publishers from another project
,下面的Template Project
输入上面的模板Job名:baseNetJob
OK, 正式的项目Job就创建完成了,可以构建试试。
如果还有其它的.Net项目,都只需要配置一下构建参数、和环境变量就好了,其它的使用继承baseNetJob就好了。
以上是关于DevOps-4:Jenkins配置.Net项目模板Job的主要内容,如果未能解决你的问题,请参考以下文章
DevOps-5:Jenkins配置Java-Maven项目模板Job
DevOps-5:Jenkins配置Java-Maven项目模板Job