• 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/
    
    • 1
    • 2

    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返回
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    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 不能为空")
    
    • 1
    • 2
    • 3

    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%\
    
    • 1
    • 2
    • 3
    • 4

    这一步,先创建一个存放构建结果的目录,再把上一步的构建结果复制到结果目录里去
    注: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
    
    • 1
    • 2

    注: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)) + '毫秒';
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注:这些环境变量,就是给模板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就好了。

  • 相关阅读:
    关于原型交互设计文档的一些建议
    百度网盘限速解决办法
    电商项目前端ES6
    [ubuntu]给WSL子系统ubuntu安一个桌面环境
    【校招VIP】前端专业课网络之OSI七层模型
    Windows Putty软件的基本操作之登录与数据传输(Linux)
    python 服务器批处理得到PSSM矩阵
    华为OD机试真题- 非严格递增连续数字序列-2023年OD统一考试(B卷)
    将Sketch文件转化为PSD文件的简单在线工具!
    倾听:情绪
  • 原文地址:https://blog.csdn.net/youbl/article/details/127567263