Gitlab существует не принимает во внимание артефакты - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблема с некоторыми заданиями Gitlab CI, где я задаю правило для запуска, только если файл существует .

Это мой .gitlab-ci.yml:

stages:
  - build
  - test

#Jobs
build:
  stage: build
  script:
    - dotnet restore --no-cache --force
    - dotnet build --configuration Release --no-restore
  artifacts:
    paths:
    - test/
    expire_in: 1 week

unit_tests:
  stage: test
  script: dotnet vstest test/*UnitTests/bin/Release/**/*UnitTests.dll --Blame
  rules:
    - exists:
      - test/*UnitTests/bin/Release/**/*UnitTests.dll

integration_tests:
  stage: test
  script: dotnet vstest test/*IntegrationTests/bin/Release/**/*IntegrationTests.dll --Blame
  rules:
    - exists:
      - test/*IntegrationTests/bin/Release/**/*IntegrationTests.dll

Я хочу запустить unit_tests только в том случае, если в папке test/ находится *UnitTests.dll, а в папке test/ только integration_tests.

Проблема в том, что обе работы полностью игнорируются. Другими словами, Gitlab, по-видимому, оценивает exists в false , как будто он был оценен только в начале конвейера, а не в начале задания , но эти пути существуют, потому что они сгенерированный на предыдущем этапе, и артефакты автоматически становятся доступными.

Если я удалю rules, unit_tests будет успешно запущен, но integration_tests не удастся, потому что в моем указанном проекте c нет интеграции тесты.

Я пытался заменить exists на changes, та же проблема.

Как мне выполнить это условное выполнение задания?


ОБНОВЛЕНИЕ 1 : У меня есть уродливый обходной путь, но вопрос остается, потому что exists, кажется, оценивается в начале конвейера, а не в начале задания, и, следовательно, все, что касается артефактов, игнорируется.

Этот прием работает, потому что я всегда предполагаю, что если есть csproj, то будет dll позже в результате этапа сборки.

stages:
  - build
  - test

build:
  stage: build
  script:
    - dotnet restore --no-cache --force
    - dotnet build --configuration Release --no-restore
  artifacts:
    paths:
    - test/
    expire_in: 1 week

unit_tests:
  stage: test
  script: dotnet vstest test/*UnitTests/bin/Release/**/*UnitTests.dll --Blame
  rules:
    - exists:
      - test/*UnitTests/*UnitTests.csproj

integration_tests:
  stage: test
  script: dotnet vstest test/*IntegrationTests/bin/Release/**/*IntegrationTests.dll --Blame
  rules:
    - exists:
      - test/*IntegrationTests/*IntegrationTests.csproj
...