DevOps-2:持续集成工具Jenkins构建.Net项目

本文介绍,如何使用Jenkins构建.Net项目。

环境配置

安装MsBuild编译工具

1、下载工具
下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/
进入页面,最下面“所有下载”,点开“适用于Visual Studio 2022的工具”,下载“Visual Studio 2022生成工具”
DevOps-2:持续集成工具Jenkins构建.Net项目_第1张图片

2、安装
启动下载的vs_BuildTools.exe,在启动界面,勾选“工作负荷”=》Web和云=》Web开发生成工具,点击右下角的安装,然后等待程序安装完成:
DevOps-2:持续集成工具Jenkins构建.Net项目_第2张图片

DevOps-2:持续集成工具Jenkins构建.Net项目_第3张图片
注意1:安装时,要选择需要构建的版本号。
目标包和SDK的区别:目标包表示使用高版本号构建这个低版本号的程序,一般都是向下兼容的。
注意2:默认的Visual Studio2022已经没有的.NetFramework4.0的支持了,如果需要支持编译4.0的应用,需要下载和安装VisualStudio2019,这里选择一下.NET Framework4.0的目标包支持,就OK了

3、修改系统环境变量的PATH
安装完成后,编译工具的默认路径在:
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe
在系统环境变量里添加这个路径:
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin

4、重启Jenkins,以使上一步的PATH配置生效
http://127.0.0.1:8080/restart

5、安装Jenkins的MSBuild插件
DevOps-2:持续集成工具Jenkins构建.Net项目_第4张图片

6、配置Jenkins的MSBuild
在Global Tool Configuration下方,点新增MSBuild,在Name里输入MSBuild2022,在Path to MSBuild里输入C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin
DevOps-2:持续集成工具Jenkins构建.Net项目_第5张图片


安装nuget

nuget用于拉取项目的依赖包,去这里下载最新版本:https://www.nuget.org/downloads
复制到D:\JenkinsWorkspace\nuget 目录下


安装Sonarqube Scanner for MSBuild

这是代码审查工具,用于扫描代码质量的,可以跳过。
注:你必须先安装Sonarqube服务,才能使用这个代码扫描。

1、下载
下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/
DevOps-2:持续集成工具Jenkins构建.Net项目_第6张图片
2、安装
把下载的sonar-scanner-msbuild-5.8.0.52797-net46.zip 解压到 D:\JenkinsWorkspace\sonar-scanner-msbuild-5.8.0.52797-net46
并修改对应的sonar服务地址,配置文件是:
D:\JenkinsWorkspace\sonar-scanner-msbuild-5.8.0.52797-net46\sonar-scanner-4.7.0.2747\conf\sonar-scanner.properties

3、安装Jenkins里的Sonar插件
DevOps-2:持续集成工具Jenkins构建.Net项目_第7张图片
注:在安装这个插件的过程中反因为这个插件依赖了10来个插件,经常报错:Caused: java.io.IOException: Failed to load https://updates.jenkins.io/download/plugins/bouncycastle-api/2.26/bouncycastle-api.hpi to C:\ProgramData\Jenkins\.jenkins\plugins\bouncycastle-api.jpi.tmp
反复重试了10多次,每次成功1,2个,好不容易才成功。
官方也很多人反馈这个错误,没有解决方案:https://issues.jenkins.io/browse/JENKINS-63506?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel&showAll=true

4、配置
进入“Jenkins”的Global Tool Configuration,点“新增SonarScanner for MSBuild”,Name随意,MSBUILD_SQ_SCANNER_HOME输入 D:\JenkinsWorkspace\sonar-scanner-msbuild-5.8.0.52797-net46
DevOps-2:持续集成工具Jenkins构建.Net项目_第8张图片

创建.Net构建Job

1、创建Job
点击左侧菜单的“New Item”,进入创建页,任意输入名称,选择“Freestyle project”:
DevOps-2:持续集成工具Jenkins构建.Net项目_第9张图片
2、上一步OK后,进入Job的配置页面,
2.1、通用配置General:

  • 勾选This project is parameterized
  • 点击Add Parameter,选择Git Parameter,name输入publish_branch,Parameter Type为branch,Default Value为origin/master

2.2、源码管理配置
2.2.1、先选择源码管理的Git,输入对应的Git项目地址:
DevOps-2:持续集成工具Jenkins构建.Net项目_第10张图片
2.2.2、创建Gitlab的访问凭证
在上一步,输入gitlab地址,会提示无权限访问,点击“Credentials”下面的Add,添加凭证;
在弹出页面的Kind里选择 SSH Username with private key, 下面“Private Key”那里点击“Enter directly", 把id_rsa私匙内容复制进来:
注:如何获取gitlab的ssh key,并添加到gitlab里,参考官网:https://docs.gitlab.com/ee/user/ssh.html 或直接百度一下即可
DevOps-2:持续集成工具Jenkins构建.Net项目_第11张图片
2.2.3、Gitlab的分支配置正确:
Branched to build下面的分支,配置为用于构建的分支,这里输入${publish_branch},就是上面配置的git参数

2.2.4、初始化SSH的首次连接
按2.2.2配置了密钥后,依然会连接不上gitlab,会报错:
No ED25519 host key is known for git.xxx.com and you have requested strict checking
这是因为当前用户在首次连接时,会弹出未知主机的警告,需要添加信任。
所以需要使用 Jenkins服务的启动用户,去执行命令:
git.exe ls-remote -h -- [email protected]:xxx/xxx.git
按前一篇文章,配置的是使用System用户启动Jenkins服务,因此,需要使用微软的精品工具SysinternalsSuite里的psexec,来模拟System用户登录,参考启动方法:https://youbl.blog.csdn.net/article/details/83898399
模拟System用户登录后,执行上面的命令,如图,在弹出的提示里输入yes即可:
DevOps-2:持续集成工具Jenkins构建.Net项目_第12张图片


2.3、构建环境选项Build Environment

  • 勾选Set jenkins user build variables
  • 勾选Add timestamps to the Console Output
  • 勾选”Inject environment variables to the build process",或”将环境变量注入构建过程“,此时可以在下面的Properties Content里填写kv对,作为环境变量,例如(下面的sln是相对路径的解决方案文件名,后面构建时使用):
# 解决方案文件的相对路径
build_target_file=src\xxx.sln
# 编译结束后的结果文件存储路径
archive_paths=src\Setup\targets

或在Groovy Script脚本里,去定义环境变量,例如:

def executeCmd(String cmd){
  def sout = new StringBuilder(), serr = new StringBuilder();
  def proc = cmd.execute();
  proc.consumeProcessOutput(sout, serr);
  proc.waitForOrKill(1000);
  println "out> $sout err> $serr";
  //def props = new Properties();//def solutionFile = new File(WORKSPACE + '\\solution.properties');
  //props.load(solutionFile.newDataInputStream());//return props;
}
println this.binding.getVariables().toString();//if(this.binding.hasVariable(key))return this.binding.getVariable(key);
// 三引号,表示长字符串,如 """abc换行"""
def cmd = "cmd.exe /c dir /w";
executeCmd(cmd);
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以来的毫秒数
println "ready for inject env:";
props.each{ k, v -> println "${k}:${v}" }
return props;

2.4、构建步骤Build Steps
2.4.1、这是构建的第一步,通常用于校验一些输入参数是否合法之类,
点击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 不能为空")

2.4.2、为当前构建,设置一个名称,并会在列表里显示这个名称,方便后续进行分辨;
点击Add build step,选择Update build name,勾选Use macro,下面填写:
${JOB_NAME}_${BUILD_NUMBER}@${publish_branch}

2.4.3、更新项目依赖包
点击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;http://yourNuget-url/nuget”
注:build_target_file 是上面配置的变量;yourNuget-url是如果有你自己的nuget,要添加,没有就删除

2.4.4、配置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

2.4.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%\

注:也可以创建Groovy脚本,把生成的文件,通过rsync或ftp或其它方法,推送到远端的服务器,来完成发布工作。


2.5、构建后步骤Post-build Actions
这是构建结束的一些操作,可以做一些日志、通知之类
2.5.1、点击Add post-build action,选择Groovy Postbuild,输入脚本参考:

def beginTime = manager.envVars["deploy_timestamp"];
// 注意不能直接用 println,参考 https://plugins.jenkins.io/groovy-postbuild/
manager.listener.logger.println '--==--耗时:' + (new Date().getTime() - Long.valueOf(beginTime)) + '毫秒';

3、OK,到这里,.Net的项目创建完成了,保存它。
回到myFirstJob的主界面,点击左侧菜单的Build with Parameters,在右边选择一个分支,构建一下试试吧。
DevOps-2:持续集成工具Jenkins构建.Net项目_第13张图片


后语

上面只是演示了我自己的.Net项目的构建步骤,你可以在配置里,整个构建的任意一个环节,添加你自己的环境变量注入,自己的构建步骤,自己的通知内容等等。

你可能感兴趣的:(DevOps,1024程序员节,jenkins,devops,.net)