英文:
Gitlab-ci variable interpolation
问题
在gitlab-ci中,我有两个文件存储在production/configurations.yml和staging/configurations.yml文件夹中。它们包含了每个环境的配置信息。
我想根据用户在手动运行流水线时提供的值来包含文件(可以是production或staging)。然而,我无法解决这个问题,因为变量只在作业运行时才可用,在此之前它是空的,因此验证会失败,显示以下错误:
"This GitLab CI configuration is invalid: Local file configurations.yml
does not exist!"
stages:
- build
- deploy
variables:
DEPLOY_ENVIRONMENT:
value: "production"
options:
- "production"
- "staging"
description: "The deployment target. Set to 'staging' by default."
DEPLOY_COLOUR:
value: "blue"
options:
- "blue"
- "green"
description: "The deployment target. Set to 'blue' by default."
DEPLOY_VERSION:
value: ""
description: "The deployment version. e.g. 1.0.0 for production && 1.0.0-rc for staging."
DEPLOY_APPLICATION:
value: "app1"
options:
- "app1"
- "app2"
description: "The application to deploy"
include:
- local: $DEPLOY_ENVIRONMENT/configurations.yml
Update_GIT:
stage: build
...
这种做法可行吗?有什么想法或解决方法吗?
英文:
In gitlab-ci I have two files stored in production/configurations.yml and staging/configurations.yml, folders. They hold the configurations for each environment.
I would like to include the file as per the value informed by the users when manually running the pipelines( either production or staging). However, I couldn't work out how to do that, as the variable will only be available when the job runs, until then it is null, therefore the validation fails with:
"This GitLab CI configuration is invalid: Local file configurations.yml
does not exist!"
stages:
- build
- deploy
variables:
DEPLOY_ENVIRONMENT:
value: "production"
options:
- "production"
- "staging"
description: "The deployment target. Set to 'staging' by default."
DEPLOY_COLOUR:
value: "blue"
options:
- "blue"
- "green"
description: "The deployment target. Set to 'blue' by default."
DEPLOY_VERSION:
value: ""
description: "The deployment version. e.g. 1.0.0 for production && 1.0.0-rc for staging."
DEPLOY_APPLICATION:
value: "app1"
options:
- "app1"
- "app2"
description: "The application to deploy"
include:
- local: $DEPLOY_ENVIRONMENT/configurations.yml
Update_GIT:
stage: build
...
is that even possible? Any ideas/workarounds, please?
答案1
得分: 1
Gitlab具有一个预定义的变量CI_COMMIT_BRANCH
,它是用户提交分支的名称。假设您的用户对于暂存和生产分支有一个常见的命名约定(例如"develop"、"main"、"prod"等),您可以使用workflow:rules:variables
来根据用户在流水线中运行的分支来设置该变量。
来自Gitlab文档的示例:
workflow:
rules:
- if: $CI_COMMIT_BRANCH == "develop" || $CI_COMMIT_BRANCH == "test"
variables:
DEPLOY_ENVIRONMENT: "staging"
- if: $CI_COMMIT_BRANCH == "prod" || $CI_COMMIT_BRANCH == "master"
variables:
DEPLOY_ENVIRONMENT: "production"
您可以在这里找到Gitlab的所有预定义变量,包括CI_COMMIT_BRANCH
及其用途。
编辑:
抱歉,我没有看到您问题的一部分,即用户手动设置变量的部分。现在我明白了。也许不是最优雅的解决方案,但您可以向您的包含引入规则,以依赖于DEPLOY_ENVIRONMENT
:
include:
- local: staging/configuration.yml
rules:
- if: $DEPLOY_ENVIRONMENT == "staging"
- local: production/configuration.yml
rules:
- if: $DEPLOY_ENVIRONMENT == "production"
英文:
Gitlab has a predefined variable CI_COMMIT_BRANCH
that is the name of the user's commit branch. Assuming your users have a common naming convention for staging and production branches (i.e. "develop", "main", "prod" etc.) you can use workflow:rules:variables
to set the variable according to which branch the user is running through the pipeline.
Example stolen from Gitlab documentation:
workflow:
rules:
- if: $CI_COMMIT_BRANCH == "develop" || $CI_COMMIT_BRANCH == "test"
variables:
DEPLOY_ENVIRONMENT: "staging"
- if: $CI_COMMIT_BRANCH == "prod" || $CI_COMMIT_BRANCH == "master"
variables:
DEPLOY_ENVIRONMENT: "production"
All of Gitlab's predefined variables, including CI_COMMIT_BRANCH
and their uses can be found here.
EDIT:
Sorry, I didn't see the part of your question where users manually set the variable. I understand now. Perhaps not the most elegant solution, but you can introduce rules to your include to be dependent on DEPLOY_ENVIRONMENT
include:
- local: staging/configuration.yml
rules:
- if: $DEPLOY_ENVIRONMENT == "staging"
- local: production/configuration.yml
rules:
- if: $DEPLOY_ENVIRONMENT == "production"
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论