如何在 Gitlab CI yaml 文件中创建用作脚本参数的数组变量?



我正在尝试弄清楚如何声明一个数组变量并将其用作传递给 shell 脚本的参数。或者通过学习如何学习来了解如何变得更加干燥

这是我尝试过的导致/bin/sh: eval: line X: syntax error: bad substitution

variables:
EXTRA_ARGS: (. "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG)
build:
stage: build
script:
- path/to/script.sh uniqueParam1 uniqueParam2 ${EXTRA_ARGS[@]}
- path/to/script.sh uniqueParam3 uniqueParam4 ${EXTRA_ARGS[@]}
- path/to/script.sh uniqueParam5 uniqueParam6 ${EXTRA_ARGS[@]}

以下内容运行良好,但如您所知,我正在重复额外的参数:

build:
stage: build
script:
- path/to/script.sh uniqueParam1 uniqueParam2 . "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG
- path/to/script.sh uniqueParam3 uniqueParam4 . "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG
- path/to/script.sh uniqueParam5 uniqueParam6 . "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG

我也试图删除.点作为参数,但错误仍然存在。

出于我的考虑,我尝试在 bash 中运行这个概念,并成功运行如下:

#!/bin/bash
TEST1="Hello"
TEST2="human!"
ARGS=(. $TEST1 $TEST2 "${TEST2} ${TEST1}" "param1" "param2")
echo "${ARGS[*]}"

输出:

. Hello human! human! Hello param1 param2

还尝试将其放入脚本中:

script:
- EXTRA_ARGS=(. "${CI_COMMIT_SHORT_SHA} pipeline-${CI_PIPELINE_ID} latest" "pipeline-${CI_PIPELINE_ID}" $CI_COMMIT_REF_NAME $CI_COMMIT_REF_SLUG)

而且也不起作用:

/bin/sh: eval: line 92: syntax error: unexpected "("

也试图逃脱(但没有成功。

正如第一条评论所指出的,该问题与基于 Alpine 的 Docker 映像有关,该映像具有 bourne shell,默认情况下不 bash。

https://gitlab.com/gitlab-org/gitlab-runner/issues/1758

以下内容适用于我的情况,但有一个细微的区别,我将数组定义为变量而不是将其作为参数发送

.getlab-ci.yml中,我导出了一个"字符串"变量,该变量的元素由';'连接和分隔(用单引号,转义;(:

build:
stage: build 
variables:
ELMNT1: Value Has Spaces
ELMNT2: Another Value Has Spaces
script: 
- export MY_ARR_STR=${ELMNT1}';'${ELMNT2}
- shell my_script.sh

在脚本中,我将字符串转换为数组:

my_script.sh

ORIG_IFS="$IFS"
IFS=";" read -a MY_ARR <<< $MY_ARR_STR
IFS="$ORIG_IFS"
for index in "${!MY_ARR[@]}";
do
echo "Array Element at index '$index' is '${MY_ARR[$index]}'"
done

输出为

Array Element at index '0' is 'Value Has Spaces'
Array Element at index '1' is 'Another Value Has Spaces'

最新更新