将.NET项目从Gitlab runner交叉编译到Windows



我是DevOps的新手。我正在尝试为.NET项目建立一个自动部署管道。我想构建这个项目,并将其复制到远程Windows机器上进行手动测试。

我已经完成了大部分工作。但我最大的问题(我想)与交叉编译有关。这一切只是在我的Windows计算机上运行(我可以用IDE构建和运行项目),但我无法在GitLab runner上正确编译它。


我有以下.gitlab-ci.yml配置:

image: mcr.microsoft.com/dotnet/sdk:5.0
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- dotnet build -o ../build
artifacts:
paths:
- build
test_job:
stage: test
script:
- dotnet test --no-build -o ../build
deploy_job:
stage: deploy
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
script:
- dotnet publish MyProject.sln -o ../publish
# copy ../publish to a remote server

我注释掉了最后一部分,因为它不相关(它只是用sftp复制文件)。

我有build这样的作品,但有点没有。它构建东西,但不生成EXE文件。我正在尝试在测试阶段重用这个构建。

deploy阶段,我决定使用dotnet publish而不是dotnet build,希望它能给我正确的结果。我尝试了许多不同的方法和许多不同的标志,但最终我无法在GitLab runner上编译这个项目,这样我就可以将输出文件夹复制到Windows机器上并运行EXE文件。


如果我运行
dotnet publish -o ../publish

我得到:

/usr/share/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.sdk/targets/Microsoft.NET.sdk.CrossTargets.targets(27.5):错误NETSDK1129:如果未指定目标框架,则不支持"发布"目标。当前项目针对多个框架,您必须为发布的应用

所以我厌倦了并指定这样的框架:
dotnet publish -o ../publish -f net5.0

但后来我得到了:

/usr/share/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.sdk/targets/Microsoft.PackageDependencyResolution.target(241,5。

所以我之前也尝试过运行dotnet restore --force,但令所有人惊讶的是,这并没有改变任何事情(仍然是相同的错误)-是的,我知道无论如何都应该隐式调用restore。

只有在我向解决方案文件添加了显式路径后,它才开始"成功"编译
dotnet publish MyProject.sln -o ../publish

但它不会生成任何EXE文件。


我缺少什么?我不知道我做错了什么。我对DevOps和.NET都有点陌生。我如何在Gitlab runner上编译这个项目,使其在Windows上运行?

您应该为发布命令指定.csproj文件,并考虑输出格式的Runtime Identifier (RID)(对于windows 8,RID是win8-x64,它生成.exe文件),如下所示:

script: 
- dotnet restore path/to/yourProject.csproj
- dotnet publish path/to/yourProject.csproj -c Release -r win8-x64 -o ../build