根据文档,我已将包含文件概念添加到我的 CI 管道中
https://docs.gitlab.com/ee/ci/yaml/includes.html
include:
- local: builds.yml
rules:
- if: $CI_COMMIT_BRANCH == "dev"
- local: deploys.yml
rules:
- if: $CI_COMMIT_BRANCH == "main"
但它总是取最后一个 if 条件。在我的例子中,它总是包含 deploys.yml 文件。感谢任何帮助
这是我的实际代码
#.gitlab-ci.yml
include:
- local: .gitlab-ci-dev.yml
rules:
- if: $CI_COMMIT_BRANCH == "dev"
- local: .gitlab-ci-master.yml
rules:
- if: $CI_COMMIT_BRANCH == "main"
stages:
- build
- tests
- deploy
before_script:
- echo $iis_application_path
- echo $application_pool_name
- echo $CI_COMMIT_BRANCH
- echo $CI_COMMIT_BRANCH == "AjmanTaxi"
build:
stage: build
script:
- dotnet restore
- dotnet build --no-restore
- dotnet publish .\apicicdtest\apicicdtest.csproj -c Release -o $publish_path
artifacts:
paths:
- $publish_path
expire_in: '1 hrs'
tags:
- windows
only:
- branches
deploy:
stage: deploy
script:
- |
if((Get-WebAppPoolState -Name $application_pool_name).Value -ne 'Stopped'){
Write-Output ('Stopping Application Pool: {0}' -f $application_pool_name)
Stop-WebAppPool -Name $application_pool_name
New-Item -Path $iis_application_path -Name "app_offline.htm" -ItemType "file"
}
- Start-Sleep -s 5
- Copy-Item ($publish_path + "*") -Destination $iis_application_path -recurse
- |
if((Get-WebAppPoolState -Name $application_pool_name).Value -ne 'Started'){
Write-Output ('Starting Application Pool: {0}' -f $application_pool_name)
if(Test-Path $iis_application_path\app_offline.htm){
Remove-Item -Path $iis_application_path\app_offline.htm
}
Start-WebAppPool -Name $application_pool_name
}
only:
- branches
tags:
- windows
dependencies:
- build
#.gitlab-ci-dev.yml
variables:
publish_path: 'bin\Release\net7.0\publish\'
application_pool_name: 'testcicddev'
application_name: 'testcicddev'
iis_application_path: 'E:\temp_files\cicdtestpublishdev'
#.gitlab-ci-master.yml
variables:
publish_path: 'bin\Release\net7.0\publish\'
application_pool_name: 'testcicdmaster'
application_name: 'testcicdmaster'
iis_application_path: 'E:\temp_files\cicdtestpublishmaster'
这里总是取 gitlab-ci-master.yml 变量
我在您的 YAML 提取物中没有看到
include:
。include:
- local: builds.yml
rules:
- if: $CI_COMMIT_BRANCH == "dev"
- local: deploys.yml
rules:
- if: $CI_COMMIT_BRANCH == "main"
rules
关键字应该只适用于正确的'local
'包含。
但即使您有这样的关键字,您也可能想尝试扩展那些包含的规则:
类似的东西:
include:
- local: builds.yml
- local: deploys.yml
build:
extends: .build
rules:
- if: $CI_COMMIT_BRANCH == "dev"
deploy:
extends: .deploy
rules:
- if: $CI_COMMIT_BRANCH == "main"
想法是在您的
.build
文件中定义一个builds.yml
工作,在您的.deploy
文件中定义一个deploys.yml
工作。extends
关键字用于从包含的文件中的相应作业继承配置。
这意味着你会:
builds.yml
和deploys.yml
文件。build
作业,它从包含的 .build
文件扩展 builds.yml
作业。仅当当前分支为dev
.deploy
作业,它从包含的 .deploy
文件扩展 deploys.yml
作业。仅当当前分支为main
.是否有动态定义扩展作业名称的选项?
我认为您不能直接使用环境变量或 CI/CD 变量作为
extends
键的值。
这意味着您可能必须为每个分支创建一个单独的作业,并使用规则来控制它们何时运行。
include:
- local: config/dev.yml
- local: config/main.yml
- local: config/feature.yml
deploy_dev:
extends: .deploy_dev
rules:
- if: $CI_COMMIT_BRANCH == "dev"
deploy_main:
extends: .deploy_main
rules:
- if: $CI_COMMIT_BRANCH == "main"
deploy_feature:
extends: .deploy_feature
rules:
- if: $CI_COMMIT_BRANCH =~ /^feature\//
例如,使用此配置,将根据分支名称触发适当的作业:
deploy_dev
将竞选dev
分会deploy_main
将竞选main
分会deploy_feature
将竞选名称以 feature/
这假设您的存储库包含配置文件,例如
dev
:
.deploy_dev:
script:
- echo "Deploying for dev branch"