在 C# 中使用 GitLabCI
Posted
技术标签:
【中文标题】在 C# 中使用 GitLabCI【英文标题】:Using GitLabCI with C# 【发布时间】:2016-02-05 02:51:54 【问题描述】:我一直在开发 C# 应用程序,并想试用 GitLab CI。我只能看到 Ruby,找不到任何关于如何使用它构建 C# 应用程序的信息。
当我运行测试设置时,我进行了提交,但我没有构建。
我应该如何进行简单的构建?我可以使用哪个命令?我不介意构建失败(但构建)。
【问题讨论】:
你有可以分享的 .gitlab-ci.yml 文件吗? 【参考方案1】:为了构建 C# 应用程序,您应该为 GitLab CI 中的项目配置一个 Windows 运行程序(带有 shell 执行程序)。
您的 .gitlab-ci.yml 文件应如下所示:
stages:
- build
job:
stage: build
script:
- echo "Restoring NuGet Packages..."
- '"c:\nuget\nuget.exe" restore "MySolution.sln"'
- ''
- echo "Release build..."
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /consoleloggerparameters:ErrorsOnly /maxcpucount /nologo /property:Configuration=Release /verbosity:quiet "MySolution.sln"
tags:
except:
- tags
在 Windows 机器上,您需要以下工具:
已安装跑步者 Git,添加到 PATH 最新的 nuget.exe 位于 C:\nuget(或其他位置。只需确保您在 .gitlab-ci.yml 文件中找到正确的路径)【讨论】:
对不起,'git, added to PATH' 是什么意思? 知道了,让 Windows 知道 git 的位置,以便 git 可以作为 shell 执行。 如果有空格,您的 msbuild 路径将不起作用。 @grisha 在 gitlab.com 上没有可用的共享 Windows 运行器。 gitlab.com 上的共享运行器有 Docker,但 Docker 还不支持 Windows 容器。* 你知道 Gitlab 计划支持 Windows 共享运行器吗? *) 是的,Docker 确实以一种奇怪的方式支持 windows 容器,但前提是 Docker 客户端运行在 windows 机器上,这在一定程度上违背了目的。 @gijswijs 有适用于 Windows 的安装说明here。有指向x86 和amd64 跑步者的链接。希望对您有所帮助。【参考方案2】:我只是想分享我的 .gitlab-ci.yml 完整的单元测试。您将不得不调整您的 nuget 和可能的其他路径。这适用于同名解决方案中的单个项目。
variables:
PROJECT_NAME: "ProjectNameGoesHere"
before_script:
- echo "starting build for %PROJECT_NAME%"
- echo "Restoring NuGet Packages..."
- d:\tools\nuget restore "%PROJECT_NAME%.sln"
stages:
- build
- test
build:
stage: build
script:
- echo "Release build..."
- '"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe" /consoleloggerparameters:ErrorsOnly /maxcpucount /nologo /property:Configuration=Release /verbosity:quiet "%PROJECT_NAME%.sln"'
artifacts:
untracked: true
test:
stage: test
script:
- echo "starting tests"
- cd %PROJECT_NAME%Tests/bin/Release
- '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\MSTest.exe" /testcontainer:%PROJECT_NAME%Tests.dll'
dependencies:
- build
【讨论】:
对于那些阅读此评论的人,您必须首先将您的机器配置为跑步者。请遵循以下 Prasanth Louis 的指南,尤其是链接 gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/…(因为有更新)。只有这样你才能使用这个.gitlab-ci.yml。 @corentin 感谢您提供此信息。是的,您需要在构建机器上安装 Visual Studio,因为我相信 MSTest 是其中的一部分。 请考虑将您的示例提交到GitLab CI Yml project。 我的项目构建成功,但删除了所有未跟踪的文件,包括测试所需的 bin/ 文件夹。工件有些奇怪:未跟踪:真的? @fiorebat 如果 git 没有跟踪它们,则应按照 docs.gitlab.com/ee/ci/yaml/#artifacts-untracked 添加它们他们来自掘金。【参考方案3】:其他答案都很好。但我想另外解释一下如何安装跑步者。我使用自己的本地系统(Windows),所以我选择运行 shell。但如果您愿意,可以使用 Docker 映像。
cd C:\Multi-Runner
gitlab-ci-multi-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com
Please enter the gitlab-ci token for this runner
xxx
Please enter the gitlab-ci description for this runner
my-runner
INFO[0034] fcf5c619 Registering runner... succeeded
Please enter the executor: shell, docker, docker-ssh, ssh?
shell
INFO[0037] Runner registered successfully. Feel free to start it, but if it's
running already the config should be automatically reloaded!
来源:https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/install/windows.md
之后,您可以像这样使用 YAML 文件:
stages:
- build
job:
stage: build
script: '"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe" "something.sln"'
【讨论】:
请考虑将您的示例提交到GitLab CI Yml project。【参考方案4】:在 Windows 机器上安装构建运行程序有很大帮助,@prasanth-louis 有一个很好的例子来说明如何做到这一点。
至于.gitlab-ci.yml
文件,您可以使用Cake Build 进一步简化它:
stages:
- build
build:
stage: build
script:
- .\build.ps1 -Target Build
tags:
- windows
您的build.cake
文件可能如下所示(基于example repository):
#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
var solution = "./example-project.sln";
var buildDir = Directory("./example-project/bin");
Task("Default")
.IsDependentOn("Unit-Tests")
.Does(() =>
Information("Running Default task!");
);
Task("Clean")
.Does(() =>
CleanDirectory(buildDir);
);
Task("PackageRestore")
.IsDependentOn("Clean")
.Does(() =>
Information("Restoring NuGet packages for 0", solution);
NuGetRestore(solution);
);
Task("Build")
.IsDependentOn("PackageRestore")
.Does(() =>
Information("Restoring NuGet packages for 0", solution);
MSBuild(solution, settings => settings.SetConfiguration(configuration));
);
Task("Unit-Tests")
.IsDependentOn("Build")
.Does(() =>
NUnit3("./example-project.Tests/**/bin/" + configuration + "/*.Tests.dll");
);
Task("Publish")
.Does(() =>
);
RunTarget(target);
【讨论】:
Cake 绝对是您的最佳选择,尤其是当您从 TeamCity、Jenkins 等为您处理大量此类内容的服务器过渡时。【参考方案5】:这是我用于 c# 应用程序的工作 .gitlab-ci.yml 文件,其中 NUnit 作为单元测试框架,单声道作为基本图像。
不是很花哨但工作:
image: mono:latest
stages:
- build
- test
variables:
solution: "Project.sln"
test: "Project.Test"
before_script:
- nuget restore
build:
stage: build
script:
- msbuild /p:Configuration=Release $solution
test:
stage: test
script:
- msbuild /p:Configuration=Release $solution
- mono ./packages/NUnit.ConsoleRunner.3.10.0/tools/nunit3-console.exe ./$test/bin/Release/$test.dll
【讨论】:
以上是关于在 C# 中使用 GitLabCI的主要内容,如果未能解决你的问题,请参考以下文章