我正在尝试根据管道启动时做出的适当选择为变量列表分配值。所以就我而言:
我有一个
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。
您可以第一个作业运行条件逻辑,但将环境变量写入文件中,然后使用该文件的内容作为下一个作业的环境变量,这要归功于
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'
参见: