Gitlab CI/CD:锚点/全局变量中的变量对 Runner 不可用

Chu*_*ket 6 yaml gitlab gitlab-ci

我想让变量可用于我的所有节点部署作业,以干燥我的 Gitlab 管道,但我也想提供依赖于每个单独作业的其他变量。当我处理需要唯一环境变量的多个节点服务时,这将有所帮助。

阅读文档,似乎有两种方法可以在.gitlab-ci.yml文件中执行此操作:

方法#1

在 YAML 锚定定义中包含全局变量,希望它将与特定于作业的变量合并:

# anchor: global Node image deployment job
.deploy_node_image: &deploy_node_image
  image: docker:latest
  stage: deploy
  services:
    - docker:dind
  variables:  # global variables
    REGION: "region"
    ACCOUNT_ID: "id"
    CLUSTER_NAME: "cluster"
  script:
    - apk add py-pip
    - pip install awscli
    - echo $CLUSTER_NAME $REGION $IMAGE_NAME $ACCOUNT_ID $SERVICE_NAME $SERVICE_DIR
    - aws ecr get-login-password --region $REGION | docker login --username AWS
      --password-stdin https://$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
    - cd $CI_PROJECT_DIR/ingenio/new-backend/$SERVICE_DIR
    - docker build
      -t $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_NAME:latest .
    - docker push
      $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_NAME:latest
    - aws ecs update-service
      --region $REGION
      --cluster $CLUSTER_NAME
      --service $SERVICE_NAME

# specific job
deploy:users-service:
  <<: *deploy_node_image
  variables:
    IMAGE_NAME: "users-api"
    SERVICE_NAME: "serviceName"
    SERVICE_DIR: "/endpoint"
Run Code Online (Sandbox Code Playgroud)

方法#2

定义一组全局变量并将其与特定于作业的变量合并:

node_variables: &node_globals
  variables:
    REGION: "region"
    ACCOUNT_ID: "id"
    CLUSTER_NAME: "cluster"

# anchor: global Node image deployment job
.deploy_node_image: &deploy_node_image
  image: docker:latest
  stage: deploy
  services:
    - docker:dind
  script:
    - apk add py-pip
    - pip install awscli
    - echo $CLUSTER_NAME $REGION $IMAGE_NAME $ACCOUNT_ID $SERVICE_NAME $SERVICE_DIR
    - aws ecr get-login-password --region $REGION | docker login --username AWS
      --password-stdin https://$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
    - cd $CI_PROJECT_DIR/ingenio/new-backend/$SERVICE_DIR
    - docker build
      -t $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_NAME:latest .
    - docker push
      $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_NAME:latest
    - aws ecs update-service
      --region $REGION
      --cluster $CLUSTER_NAME
      --service $SERVICE_NAME

# specific job
deploy:users-service:
  <<: *deploy_node_image
  variables:
    <<: *node_globals
    IMAGE_NAME: "users-api"
    SERVICE_NAME: "serviceName"
    SERVICE_DIR: "/endpoint"
Run Code Online (Sandbox Code Playgroud)

两者都不起作用,并且第一个 AWS ECR 命令失败,因为$REGION为 null,以及方法 1 中的节点锚点中包含的所有变量以及节点锚点中的日志语句中的方法 2 中的全局变量。在日志中只能看到实际作业中包含的变量,这让我认为它只是覆盖了。

那么我怎样才能合并它们呢?

DV8*_*2XL 8

问题

当您合并两个作业时,无论是使用锚点还是继承(使用extends),“子”作业将覆盖父作业的任何部分。这些部分本身不会被合并。因此父variables部分基本上被子部分覆盖和忽略variables。扩展机制是 YAML 标准的一部分,与 GitLab 无关。

解决方法

variables部分仅创建环境变量,因此您可以在部分中执行相同的操作before_script,如下所示:

# Note: these are global variables. You don't need to add them to an anchor.
variables:
  REGION: "region"
  ACCOUNT_ID: "id"
  CLUSTER_NAME: "cluster"

.deploy_node_image:
  image: docker:latest
  stage: deploy
  # You can define the "global" variables section here INSTEAD if you want.
  script:
    - echo $REGION
    - echo $IMAGE_NAME

deploy:users-service:
  <<: *deploy_node_image
  before_script:
    - export IMAGE_NAME="users-api"
    - export SERVICE_NAME="serviceName"
    - export SERVICE_DIR="/endpoint"
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅GitLab 环境变量。