Кросс-компиляция проекта .NET из Gitlab-runner в Windows

# #c# #.net #gitlab #devops #cross-compiling

Вопрос:

Я новичок в 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.CrossTargeting.targets(27,5): error NETSDK1129: The ‘Publish’ target is not supported without specifying a target framework. The current project targets multiple frameworks, you must specify the framework for the published application.

Поэтому я устал и определяю рамки так:
dotnet publish -o ../publish -f net5.0

Но потом я получаю:

/usr/поделиться/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.Sdk/цели/Microsoft.PackageDependencyResolution.targets(241,5): ошибка NETSDK1005: Файл ресурсов «/сборки/myuser/myrepo/myproject/Общий/obj/project.assets.json» не имеет цели для «net5.0». Убедитесь, что восстановление запущено и что вы включили «net5.0» в целевую структуру для своего проекта.

Поэтому я попытался также запустить dotnet restore --force заранее, но, к всеобщему удивлению, это ничего не изменило (все та же ошибка) — да, я знаю, что восстановление в любом случае должно быть вызвано неявно.

Он начал «успешно» компилироваться только после того, как я добавил явный путь к своему файлу решения.
dotnet publish MyProject.sln -o ../publish

Но он не генерирует никаких исполняемых файлов.


Что я упускаю? Я не знаю, что я делаю не так. Я вроде как новичок не только в DevOps, но и .СЕТЬ тоже. Как я могу скомпилировать этот проект на Gitlab-runner, чтобы он работал в Windows?

Ответ №1:

Вы должны указать команду .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  

Комментарии:

1. Это тоже не сработало. /usr/share/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(993,5): error NETSDK1150: The referenced project '../MyProject.SubProject/MyProject.SubProject.csproj' is a non self-contained executable. A non self-contained executable cannot be referenced by a self-contained executable.

2. @AnJ Ошибка говорит о том, что вы пытаетесь опубликовать проект, который не является консольным приложением или веб-приложением.