有没有办法配置多个具体命名的环境(具体来说,test
,stage
和prod
)?
在他们的文档(https://docs.gitlab.com/ce/ci/environments.html)中,他们讨论了动态创建的环境,但它们都是基于提交的。
我的构建步骤对于所有这些步骤都是相同的,除了换掉slu ::
deploy_to_test:
environment:
name: test
url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
scripts:
- deploy ${CI_ENVIRONMENT_SLUG}
deploy_to_stage:
environment:
name: stage
url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
scripts:
- deploy ${CI_ENVIRONMENT_SLUG}
deploy_to_prod:
environment:
name: prod
url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
scripts:
- deploy ${CI_ENVIRONMENT_SLUG}
有没有办法将其压缩成一组指令?类似的东西:
deploy:
environment:
url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
scripts:
- deploy ${CI_ENVIRONMENT_SLUG}
答案 0 :(得分:11)
除了提供的答案之外,我还想添加另一种类似的方法来实现同样的东西,但它更灵活,而不是使用模板然后在舞台上合并它。 / p>
你可以做的是创建一个隐藏的密钥,但是采用这种格式,例如,
.login: &login |
cmd1
cmd2
cmd3
...
然后您可以使用' *',星号,将其应用到不同的阶段,如:
deploy:
stage: deploy
script:
- ...
- *login
- ...
bake:
stage: bake
script:
- ...
- *login
- ...
结果将等同于:
deploy:
stage: deploy
script:
- ...
- cmd1
- cmd2
- cmd3
- ...
bake:
stage: bake
script:
- ...
- cmd1
- cmd2
- cmd3
- ...
基于以下资源: https://gitlab.com/gitlab-org/gitlab-ce/issues/19677#note_13008199
至于模板实施,它已经"合并"。根据我自己的经验,如果在合并模板后附加更多脚本,模板脚本将被覆盖。而且您不能一次应用多个模板。仅执行最后一个模板脚本。例如:
.tmp1: &tmp1
script:
- a
- b
.tmp2: &tmp2
script:
- c
- d
job1:
<<: *tmp1
<<: *tmp2
stage: xxx
job2:
<<: *tmp2
stage: yyy
script:
- e
- f
等效的结果是:
job1:
stage: xxx
script:
- c
- d
job2:
stage: yyy
script:
- e
- f
如果不确定语法正确性,只需将.gitlab.yml
文件内容复制并粘贴到&#34; CI Lint&#34;验证。该按钮位于管道标签中。
答案 1 :(得分:8)
是的,您可以使用anchors。如果我正确地遵循文档,您可以使用隐藏密钥.XX
重写它,然后将其应用于<<: *X
。
例如,这可以定义密钥:
.job_template: &deploy_definition
environment:
url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
scripts:
- deploy ${CI_ENVIRONMENT_SLUG}
然后可以使用<<: *job_template
写入所有块。我假设environment
会将名称与预定义的URL合并。
deploy_to_test:
<<: *job_definition
environment:
name: test
deploy_to_stage:
<<: *job_definition
environment:
name: stage
deploy_to_prod:
<<: *job_definition
environment:
name: prod
上述链接中的完整文档部分:
YAML有一个名为&#39; anchors&#39;的便利功能,可让您轻松复制文档中的内容。 Anchor可用于复制/继承属性,是一个与隐藏键一起使用的完美示例,可为您的作业提供模板。
以下示例使用锚点和地图合并。它将创建两个作业test1和test2,它们将继承.job_template的参数,每个作业都定义了自己的自定义脚本:
.job_template: &job_definition # Hidden key that defines an anchor named 'job_definition' image: ruby:2.1 services: - postgres - redis test1: <<: *job_definition # Merge the contents of the 'job_definition' alias script: - test1 project test2: <<: *job_definition # Merge the contents of the 'job_definition' alias script: - test2 project
&安培;设置锚点的名称(job_definition),&lt;&lt;表示&#34;将给定的哈希值合并到当前的哈希值中,并且*包括命名的锚点(再次为job_definition)。扩展版本如下所示:
.job_template: image: ruby:2.1 services: - postgres - redis test1: image: ruby:2.1 services: - postgres - redis script: - test1 project test2: image: ruby:2.1 services: - postgres - redis script: - test2 project
答案 2 :(得分:3)
以防万一:Gitlab(自11.3起)提供了 extends 关键字,该关键字可用于“模板化” yaml条目(据我所知):
请参见official doc