今天跟大家分享一个Bug的发现之路,由于这个应用场景比较特殊,其中的分析过程我觉值得记录下来。
背景
我们知道,SonarQube 是常用的静态代码扫描工具,可以帮助我们发现各种编程语言编写的项目中的代码问题。针对MSBUILD的项目,SonarQube还提供了专门的扫描工具sonarscanner-msbuild。
想要在Jenkins Pipeline中使用这个工具,我们当然可以直接在命令行中调用,并传入需要的参数。但由于参数中有一些常用变量比如server的地址、项目名称等,写死在命令行中不是好办法,可以通过配置的方式提高灵活性。而且,类似sonar.login的参数包含敏感信息,不宜写在命令行中。因此,使用Sonar Scanner的Jenkins 插件是常见的做法(参考资料3)。
很多时候,为了重用Build资源,我们会在Docker container中完成大部分CI任务,Pipeline结束后就可以释放Build的资源留作他用。比如使用Azure VM作为Jenkins的Build Agent时,每个虚拟机的资源在空闲时会释放掉,也无需安装任何Build工具,只需要装好Docker,然后启动container完成Build。(有关Azure VM的用法可以参考另一篇博文。)
重现
我遇到的问题基于这样的场景:需要Build的项目基于.NET Framework 4.8,使用MSBuild进行build。在Pipeline中我会启动并连接一台VM,然后在VM中启动事先指定的Docker container。通过-v
指令将VM上的代码根目录装载到container中,然后在container内部执行Build、Test、Sonar Scan、Publish等操作。
在执行Sonar Scan时,我使用的SonarScanner.MSBuild.exe
会报错:
Failed to parse properties from the environment variable 'SONARQUBE_SCANNER_PARAMS'
这是在msbuild sonar scan的begin
阶段就出错了,因此Build还没开始,Pipeline