GitLab CI 和 MsBuild(带测试)

GitLab CI and MsBuild (with tests)

我正在使用 GitLab 将我的 svn 存储库迁移到 git。

现在看到有 GitLab 的持续集成实现 CI 就想试一试。

我已经安装并配置了一个 Runner,但是 Gitlab 抱怨我没有 .gitlab-ci.yml 文件。

我已经使用 TeamCity 进行持续集成,所以我不想花太多精力编写构建脚本。

谁能告诉我在哪里可以找到 gitlab-ci.yml 文件的基本示例,该文件基本上只是构建我的解决方案并运行所有测试 (MSTests)?

显然没有简单的 msbuild 示例,但这应该可以帮助您入门:

variables:
  Solution: MySolution.sln

before_script:
  - "echo off"
  - 'call "%VS120COMNTOOLS%\vsvars32.bat"'
  # output environment variables (usefull for debugging, propably not what you want to do if your ci server is public)
  - echo.
  - set
  - echo.

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
  - echo building...
  - 'msbuild.exe "%Solution%"'
  except:
  - tags

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

deploy:
  stage: deploy
  script:
  - echo deploying...
  - 'msbuild.exe "%Solution%" /t:publish'
  only:
  - production

弄清楚哪些测试要 运行 有点棘手。我的约定是每个项目都有一个文件夹测试,其中测试项目以架构 MyProject.Core.Tests 命名(对于名为 MyProject.Core 的项目)

作为对gitlab的第一次反馈-ci

我喜欢简单city 和源代码管理集成。但我希望能够在执行前修改脚本(尤其是在更改脚本时 ci 盟友),但我可以成像 re运行 a specific 提交并注入变量或更改脚本(我可以通过 teamcity 做到这一点)。或者甚至忽略失败的测试并重新运行 脚本(我在 teamcity 中经常这样做)。我知道 gitlab-ci 对我的测试一无所知我只有一个命令行 returns 一个错误代码。

作为 的附录,我想为测试阶段脚本建议一个更简单的替代方案:

variables:
  SOLUTION_DIR: "MySolution"
  BUILD_DIR: "Release"
  TESTER: "vstest.console.exe" # or "mstest.exe /testcontainer:"

before_script:
  - call "%VS120COMNTOOLS%\vsvars32" # import in path tools like msbuild, mstest, etc using VS script

test:
  stage: test
  script:
  - for /f %%F in ('dir /s /b %SOLUTION_DIR%\%BUILD_DIR%\*Tests.dll') do set dllPath=%%F
  - "%TESTER% %dllPath%"

这将对找到的所有测试项目二进制文件启动测试,这些二进制文件按照惯例在构建目录中以 *Tests.dll 结尾。这样做的好处是不使用中间文件。

这是我最终使用的。它 运行 是单个 运行 中的所有 *Tests.Dll。

  dir /s /b *.Tests.dll | findstr /r bin\Debug > testcontainers.txt
  for /f %%x in (testcontainers.txt) do set list=!list! %%x
  set list=%list:~1%
  vstest.console.exe %list%

自从打开这个问题后情况发生了一些变化(现在 MS 支持 core/linux docker 在 VS 中部署),我想我会分享我的解决方案。

# Default image is docker:stable
image: docker:stable

# Define deployment stages
stages:
  - Test
  - Build

# We use docker-in-docker (dind) for building docker images (build stage)
services:
  - docker:dind

# Run unit test on dotnet core sdk image
test:
  stage: Test
  image: mcr.microsoft.com/dotnet/core/sdk:3.1
  script:
    - dotnet restore "${CI_PROJECT_DIR}/Project.Tests/Project.Tests.csproj"
    - dotnet test "${CI_PROJECT_DIR}/Project.Tests/Project.Tests.csproj"
  tags: 
    - docker
  only:
    - master

# Only build when testing passes, build using Dockerfile/dind
build:
  stage: Build
  # Print docker instance details for logging/diagnosing
  before_script:
    - docker info
    - docker login registry.gitlab.com -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
  script:
    - docker build -t ${CI_REGISTRY}/${CI_PROJECT_PATH}:latest .
    - docker push ${CI_REGISTRY}/${CI_PROJECT_PATH}:latest
  after_script:
    - docker logout ${CI_REGISTRY}
  tags: 
    - docker
  only:
    - master
  when: on_success

这应该 运行 对您的解决方案进行 MS 单元测试,如果测试通过,则从中创建一个图像(前提是您在 gitlab-ci.yml 文件旁边有一个 Dockerfile)。如果您希望在提交时自动执行单元测试,请忽略构建阶段。