У меня проблема с некоторыми заданиями 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