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 keyProject 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 TypeBranch
    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-4:Jenkins配置.Net项目模板Job

DevOps-5:Jenkins配置Java-Maven项目模板Job

DevOps-5:Jenkins配置Java-Maven项目模板Job

DevOps-5:Jenkins配置Java-Maven项目模板Job

可以将 log4net 配置为以自己的身份运行吗?

POJ.2065.SETI(高斯消元 模线性方程组)