2016-11-18 69 views
2

我有一个亚军(配置为略有修改this script),它应该构建和单元测试一个解决方案,该解决方案包含一个ASP.NET CORE项目,一个JS较少的Web前端,一个单元测试项目。gitlab CI亚军C#依赖关系在MSbuild中都失败

但是,当MSbuild尝试构建项目时,每个项目中的每个依赖项都会失败(超过150条错误消息),并出现错误NU1001。

这是除了一些非常奇怪的行为 - 它试图使用Visual Studio 2012,即使VS 2012从未安装在本机上建立。它也拒绝接受来自原始脚本的%project_name参数。我必须对一个位置和版本进行硬编码,才能进入构建阶段。

原始脚本中的nuget被破坏后被删除。后来我发现文档说明nuget现在自动刷新构建包,所以它不需要重新添加。

回答

0

我不认为这是一个gitlab-ci问题。将您的调试工作集中在与您正在使用的跑步者相关的服务器(或容器内)上执行该MSBuild命令。

我建议使用before_script来调用验证您的管道所需的依赖关系的脚本。例如,您的预生成脚本可以验证MSBuild,NuGet和Git位于您的亚军/虚拟机/容器的路径上(这可让您使用Puppet或Powershell DSC控制这些先决条件,而不是在管道中管理它们)。

nuget restore应作为restore阶段的一部分而不是before_script进行调用。恢复的软件包可以作为工件在各阶段之间传递。

您是双引号你的MSBuild调用你的build工作。下面是我如何在管道中,我目前正与调用的MSBuild:

build_dev: stage: build script: - MSBuild $env:TARGETS /t:Build /p:Configuration=Debug artifacts: paths: - ./*/bin <<: *default_expiration <<: *default_tags

在这种情况下,我before_script已证实,MSBuild的路径上,所以我可以自由地使用它。它可能会引用MSBuild 12.0或14.0,具体取决于跑步者。 $env:TARGETS来自gitlab-ci变量;它指向一个MSBuild文件,build.targets

我相信你正在使用一个基本的shell执行器;当您在runner配置中指定shell = powershell时,有些事情会变得更加简单,Powershell语法在将流水线拼接在一起时更加平坦。

最后的MSBuild是否自动恢复的NuGet依赖是真的给你.csproj文件的编写方式。我认为最好是将nuget restore作为一个单独的步骤。例如,当你需要恢复由MSBuild自己使用的Nuget包时,单独的步骤就派上用场了。

确认只需在解决方案文件中运行MSBuild,即可通过在命令行中自行运行MSBuild自动恢复NuGet包。我不认为gitlab-ci会影响该命令的成功。

+0

自发布此问题后,我在新笔记本电脑上,因此我不得不再次执行大多数CI/runner步骤。 我不知道这些脚本是如何工作的,我尝试在cmd中运行MSbuild,它不在解决方案的文件夹中运行,也不在MSbuild文件夹中运行。我已经证实,MSbuild确实存在于脚本的顶部位置。 我已经花了好几天的时间来处理yml和你的建议,并在CI上加载了大量的yml错误。 我甚至不知道从哪里开始/修复。 – Kir