使用 GitLab CI 管道构建 .NET 解决方案

Build .NET solution using GitLab CI Pipeline

我有一个包含多个 .NET 项目的解决方案。我使用 GitLab(非自托管)进行版本控制,并且也想开始使用他们的 CI 工具。我已将以下 .gitlab-ci.yml 文件添加到我的根目录:

stages:
  - build
  - test

build_job:
  stage: build
  script:
  - 'echo building...'
  - 'msbuild.exe Bizio.sln'
  except:
  - tags

test_job:
  stage: test
  script:
  - 'echo: testing...'
  - 'msbuild.exe Bizio.sln'
  - 'dir /s /b *.Tests.dll | findstr /r Tests\bin\ > tests_list.txt'
  - 'for /f %%f in (tests_list.txt) do mstest.exe /testcontainer: "%%f"'
  except:
  - tags

build阶段总是失败,因为它不知道msbuild是什么。确切的错误是:

/bin/bash: line 61: msbuild.exe: command not found

经过一些调查,我发现我使用的是共享 运行ner。这是作业 运行:

的全部输出
Running with gitlab-runner 10.6.0-rc1 (0a9d5de9)
  on docker-auto-scale 72989761
Using Docker executor with image ruby:2.5 ...
Pulling docker image ruby:2.5 ...
Using docker image sha256:bae0455cb2b9010f134a2da3a1fba9d217506beec2d41950d151e12a3112c418 for ruby:2.5 ...
Running on runner-72989761-project-1239128-concurrent-0 via runner-72989761-srm-1520985217-1a689f37...
Cloning repository...
Cloning into '/builds/hyjynx-studios/bizio'...
Checking out bc8085a4 as master...
Skipping Git submodules setup
$ echo building...
building...
$ C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe Bizio.sln
/bin/bash: line 61: msbuild.exe: command not found
ERROR: Job failed: exit code 1

看起来我的共享 运行ner 正在为 Ruby 使用 Docker 图像,这似乎是错误的。我不知道如何更改它或 select 可用于 .NET 的不同版本。经过进一步调查后,我开始担心我必须克服很多困难才能获得我想要的东西,例如使用 Azure VM 托管可以构建 .NET 应用程序的 GitLab Runner。

我需要做什么才能使用 GitLab 的 CI 管道使用非自托管 GitLab 实例构建我的 .NET 解决方案?

您应该能够在装有 Framework 4 构建工具的机器上设置您自己的共享 运行ner(使用 Docker 图像,例如 microsoft/dotnet-framework-build,或者只是你的本机)。

最简单的开始案例是使用您自己的桌面,您知道您的解决方案已经在其中构建。 (因为使用 Docker 图像进行构建是绝对可能的,但涉及所有额外步骤以确保您的机器上有 docker 工作)。

  • 在您的计算机上从 https://docs.gitlab.com/runner/install/windows.html 下载 gitlab-runner

    • 在电脑上创建目录(C:\gitlab-runner)
    • 将最新的二进制文件 x86 or x64 下载到该文件夹​​
    • 将二进制文件重命名为 "gitlab-runner.exe"
  • 为您的 运行 伙伴获得一个 gitlab-ci 代币
    • 可能最简单的方法是转到 gitlab.com 中的项目并转到设置 -> CI/CD 并展开常规管道设置。
    • 在 运行ner 令牌部分,单击“显示值”按钮以显示令牌值。您将在 运行 注册步骤中需要它。
  • 根据Registering Runners - Windows注册gitlab 运行ner
    • 打开提升的命令提示符(运行 以管理员身份)
    • cd 到 c:\gitlab-runner
    • 输入gitlab-runner register
    • 注册提示将引导您完成注册 运行ner 的步骤,但简而言之shell,您将输入
    • gitlab.com 作为您的协调员 URL,输入您项目中的令牌
    • 给你的 运行 小伙伴起个名字
    • 标记你的 运行ner(以便你可以将它与它能够构建、测试等的项目相关联 - 为简单起见,你现在可以跳过标记)
    • 允许它 运行 用于未标记的作业(同样,简单,说真的)
    • 将 运行 锁定到当前项目(简单,说真的)
    • 并选择执行器(输入 shell,基本上就是说使用 Windows Command-line)
  • 安装 gitlab-runner 作为一项服务,这样它几乎总是检查有待完成的工作
    • 在您的命令提示符中,键入 gitlab-runner install
    • 然后输入gitlab-runner start
    • (现在,如果你去服务,你会看到 gitlab-runner 列出,它应该是 运行ning - 就在 when/if 运行ner 崩溃的时候,你应该去服务重新启动它)

哇哦。现在 运行ner 已设置,当您推送提交或请求合并时,它应该被激活。

如果您在正确构建 .gitlab-ci.yml 文件时仍然遇到问题,您可以通过转到您的解决方案文件夹在本地调试它(无需通过 gitlab.com 继续触发它)在命令行中,然后执行 c:\gitlab-runner\gitlab-runner build(例如,为了测试构建步骤)。

如果构建步骤在查找您的解决方案文件时遇到问题,您可能想尝试将其从 'msbuild.exe Bizio.sln' 更改为 'msbuild.exe .\Bizio.sln'

为了补充 reallyrae 的答案,.Net Core 应用程序的另一个选项是将对容器的调用作为 .gitlab-ci.yml 文件中的第一行。这将允许在共享的 GitLab.com 运行器上进行构建。

image: microsoft/dotnet

如果您正在构建传统的 .Net 应用程序,您可以尝试单声道 docker 图像。如果这对您不起作用,据我所知,本地跑步者是您唯一的选择。

image: mono:latest

或多阶段构建:

stages:
  - build-dotnet
  - test-dotnet
  - build-mono
  - test-mono

build-dotnet:
  stage: build-dotnet
  image: microsoft/dotnet:latest
  before_script:
    - "cd source"
    - "dotnet restore"
    - "cd .."
    - "cd samples"
    - "dotnet restore"
    - "cd .."
  script:
      - "cd source"
      - "dotnet build"
      - "cd .."
      - "cd samples"
      - "dotnet build"
      - "cd .."

build-mono:
  stage: build-mono
  image: mono:latest
  before_script:
  script:
    - nuget restore ./source/Source.sln
    - msbuild 
        /p:Configuration="Release"
        /p:Platform="Any CPU" 
        "./source/Source.sln"