使用GitLab CI的多个命名环境的相同步骤

时间:2017-05-31 14:49:44

标签: gitlab gitlab-ci

有没有办法配置多个具体命名的环境(具体来说,teststageprod)?

在他们的文档(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}

3 个答案:

答案 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