如何根据管道启动时定义的其他变量为变量赋值?

问题描述 投票:0回答:1

我正在尝试根据管道启动时做出的适当选择为变量列表分配值。所以就我而言:

我有一个

gitlab-ci.yml
文件,其中包含以下内容:

variables:
  DOCKER_DRIVER: overlay
  REGISTRY: registry.restream.ru:5000
  CENTOS_TESTS_VERSION: 1.1.3
  CENTOS_PYTHON_VERSION: 1.0.5
  CENTOS_CPP_VERSION: 1.0.4
  REDOS7_CPP_VERSION: 1.0.0
  REDOS8_TESTS_VERSION: 1.0.0
  REDOS8_CPP_VERSION: 1.0.0
  REDOS8_PYTHON_VERSION: 1.0.0
  OS_VERSION:
    value: "RedOS-8"
    options:
      - "RedOS-8"
      - "CentOS-7"
      - "RedOS-7"
    description: "The deployment target. Set to 'RedOS-8' by default."
  COMPONENT_TYPE:
      value: "Python"
      options:
        - "Python"
        - "C++"
        - "Tests"
      description: "The deployment component type. Set to 'Python' by default."

default:
  before_script:
    - >
      if [[ $OS_VERSION = "RedOS-8" ]] && [[ $COMPONENT_TYPE = "C++" ]]; then
          variables:
            DOCKERFILE = ./redos8/cpp.Dockerfile
            IMAGE_NAME = redos8-cpp
            IMAGE_VERSION = $REDOS8_CPP_VERSION
      elif [[ $OS_VERSION = "RedOS-8" ]] && [[ $COMPONENT_TYPE = "Python" ]]; then
          variables:
            DOCKERFILE = ./redos8/python.Dockerfile
            IMAGE_NAME: redos8-python
            IMAGE_VERSION = REDOS8_PYTHON_VERSION
      elif [[ $OS_VERSION = "RedOS-8" ]] && [[ $COMPONENT_TYPE = "Tests" ]]; then
          variables:
            DOCKERFILE: ./redos8/tests.Dockerfile
            IMAGE_NAME: redos8-tests
            IMAGE_VERSION = $REDOS8_TESTS_VERSION
      elif [[ $OS_VERSION = "RedOS-7" ]]; then
          variables:
            DOCKERFILE = ./redos7/cpp.Dockerfile
            IMAGE_NAME = redos7-cpp
            IMAGE_VERSION = $REDOS7_CPP_VERSION
      elif [[ $OS_VERSION = "CentOS-7" ]] && [[ $COMPONENT_TYPE = "Python" ]]; then
          variables:
            DOCKERFILE = ./redos7/python.Dockerfile
            IMAGE_NAME = centos7-python
            IMAGE_VERSION = $CENTOS_PYTHON_VERSION   
      else
          variables:
            DOCKERFILE = ./centos7/cpp.Dockerfile
      fi

stages:
  - lint
  - build

.lint:
  stage: lint
  image: $REGISTRY/hadolint/hadolint:v2.12.0-alpine
  rules:
    - changes:
        - $DOCKERFILE
        - repo/*
        - scripts/*
  tags:
    - dind
  script:
    - hadolint $DOCKERFILE

.build:
  image: $REGISTRY/docker:latest
  services:
    - $REGISTRY/docker:dind
  stage: build
  variables:
    FULL_IMAGE_NAME: $REGISTRY/rtpp-team/ci-cd/$IMAGE_NAME:$IMAGE_VERSION
  rules:
    - changes:
        - $DOCKERFILE
        - repo/*
        - scripts/*
  tags:
    - dind
  script:
      
    - docker build --pull --tag $FULL_IMAGE_NAME --file $DOCKERFILE .
    - docker push $FULL_IMAGE_NAME

lint_dockerfile:tests:
  extends: .lint
  variables:
    DOCKERFILE: $DOCKERFILE

build_image:tests:
  extends: .build
  variables:
    DOCKERFILE: $DOCKERFILE
    IMAGE_NAME: $IMAGE_NAME
    IMAGE_VERSION: $CENTOS_TESTS_VERSION
  needs:
    - job: lint_dockerfile:tests

lint_dockerfile:python:
  extends: .lint
  variables:
    DOCKERFILE: $DOCKERFILE

build_image:python:
  extends: .build
  variables:
    DOCKERFILE: $DOCKERFILE
    IMAGE_NAME: $IMAGE_NAME
    IMAGE_VERSION: $CENTOS_PYTHON_VERSION
  needs:
    - job: lint_dockerfile:python

lint_dockerfile:cpp:
  extends: .lint
  variables:
    DOCKERFILE: $DOCKERFILE

build_image:cpp:
  extends: .build
  variables:
    DOCKERFILE: $DOCKERFILE
    IMAGE_NAME: $IMAGE_VERSION
    IMAGE_VERSION: $CENTOS_CPP_VERSION
  needs:
    - job: lint_dockerfile:cpp

例如,我选择了“RedOS-8”+“C++”这样的条件。

在日志输出中我得到:

Getting source from Git repository
00:01
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /builds/dev_team/devops/ci-cd-docker-images/.git/
Checking out 61cad3e4 as detached HEAD (ref is devops/WINK-5057)
Skipping Git submodules setup
Executing "step_script" stage of the job script
00:01
Using docker image sha256:19b38dcec411d7f333601a68f55cb3e710fca099615a7eee0fa2e020adfc7292 for registry.team.ru:5000/hadolint/hadolint:v2.12.0-alpine with digest hadolint/hadolint@sha256:3c206a451cec6d486367e758645269fd7d696c5ccb6ff59d8b03b0e45268a199
$ if [[ $OS_VERSION = "RedOS-8" ]] && [[ $COMPONENT_TYPE = "C++" ]]; then # collapsed multi-line command
/bin/sh: eval: line 179: variables:: not found

我尝试将多行字符从

>
更改为
|
。另外,我尝试使用一种条件进行测试,例如:

default:
  before_script:
    - >
      if [[ $OS_VERSION = "RedOS-8" ]] && [[ $COMPONENT_TYPE = "C++" ]]; then
          variables:
            DOCKERFILE = ./redos8/cpp.Dockerfile
            IMAGE_NAME = redos8-cpp
            IMAGE_VERSION = $REDOS8_CPP_VERSION

没有结果。日志输出给了我同样的错误“# Collapsed multi-line command”,并且在第一个管道步骤“hadolint”中找不到 $DOCKERFILE。

gitlab-ci
1个回答
0
投票

您可以第一个作业运行条件逻辑,但将环境变量写入文件中,然后使用该文件的内容作为下一个作业的环境变量,这要归功于

artifacts:reports:dotenv

通用示例:

build-job:
  stage: build
  script:
    - echo "BUILD_VARIABLE=value_from_build_job" >> build.env
  artifacts:
    reports:
      dotenv: build.env

test-job:
  stage: test
  script:
    - echo "$BUILD_VARIABLE"  # Output is: 'value_from_build_job'

参见:

© www.soinside.com 2019 - 2024. All rights reserved.