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

sam*_*ime 9 gitlab gitlab-ci

是否有配置多个具体名称的环境的方式(特别是test,stageprod)?

在他们的文档(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}
Run Code Online (Sandbox Code Playgroud)

有没有办法将其压缩成一组指令?就像是:

deploy:
    environment:
         url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
    scripts:
         - deploy ${CI_ENVIRONMENT_SLUG}
Run Code Online (Sandbox Code Playgroud)

Fli*_*Hou 13

除了提供的答案,我想添加另一种类似的方法来实现同样的东西,但它更灵活,而不是使用模板,然后在一个阶段合并它.

你可以做的是创建一个隐藏的密钥,但是这种格式,例如,

.login: &login |
  cmd1
  cmd2
  cmd3
  ...
Run Code Online (Sandbox Code Playgroud)

然后你可以使用'*',星号,将它应用到不同的阶段,如:

deploy:
  stage: deploy
  script:
    - ...
    - *login
    - ...

bake:
  stage: bake
  script:
    - ...
    - *login
    - ...
Run Code Online (Sandbox Code Playgroud)

结果相当于:

deploy:
  stage: deploy
  script:
    - ...
    - cmd1
    - cmd2
    - cmd3
    - ...

bake:
  stage: bake
  script:
    - ...
    - cmd1
    - cmd2
    - cmd3
    - ...
Run Code Online (Sandbox Code Playgroud)

基于以下资源: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
Run Code Online (Sandbox Code Playgroud)

相同的结果是:

job1:
  stage: xxx
  script:
    - c
    - d

job2:
  stage: yyy
  script:
    - e
    - f
Run Code Online (Sandbox Code Playgroud)

如果不确定语法正确性,只需将.gitlab.yml文件内容复制并粘贴到"CI Lint"进行验证.该按钮位于管道选项卡中.

  • @LeiYang在YAML中似乎`|`表示多行。但是,我实际上没有看到任何正式文档提到这种用法。有关更多信息,请参见[问题19677](https://gitlab.com/gitlab-org/gitlab-ce/issues/19677)。 (2认同)

fed*_*qui 11

是的,你可以使用锚点.如果我正确地遵循文档,您将使用隐藏密钥重写它.XX,然后应用它<<: *X.

例如,这可以定义密钥:

.job_template: &deploy_definition
    environment:
         url: ${CI_ENVIRONMENT_SLUG}.mydomain.com
    scripts:
         - deploy ${CI_ENVIRONMENT_SLUG}
Run Code Online (Sandbox Code Playgroud)

然后可以使用所有块进行写入<<: *job_template.我假设environment将名称与预定义的URL合并.

deploy_to_test:
   <<: *deploy_definition
    environment:
         name: test

deploy_to_stage:
   <<: *deploy_definition
    environment:
         name: stage

 deploy_to_prod:
   <<: *deploy_definition
    environment:
         name: prod
Run Code Online (Sandbox Code Playgroud)

上面链接中的完整文档部分:

YAML有一个名为"锚点"的便捷功能,可让您轻松复制文档中的内容.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
Run Code Online (Sandbox Code Playgroud)

&设置锚点的名称(job_definition),<<表示"将给定的哈希值合并到当前的哈希值",*包括命名的锚点(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
Run Code Online (Sandbox Code Playgroud)

  • 完善.谢谢. (2认同)

Pie*_*ier 7

以防万一:Gitlab 提供(自 11.3 起)一个extends关键字,可用于“模板化”yaml 条目(据我所知):

查看官方文档