jenkinsfile 执行的 bash 脚本变量值中的星号导致 glob 模式

问题描述

我创建了一个 jenkins 作业,它从用户那里读取 Cron 计划(字符串)参数并将其传递给一些 bash 脚本,该脚本会将值插入到一些 yaml 文件中:

stringParam(name: "CRON_SCHEDULE",description: "What is the Cron job schedule? (e.g. * * * * *) ")

这些时间表通常包含星号 - 这会导致 bash 脚本列出当前目录中的文件,而不仅仅是作为字符串(如定义的 groovy 文件)。

当我从 groovy 文件调用 bash 脚本并发送(命名)参数时:

sh "./scripts/create_yaml.sh CRON_SCHEDULE=\"'$params.CRON_SCHEDULE'\" "

日程安排似乎很好(在作业日志中):

+create_yaml.sh CRON_SCHEDULE='0 0 * * *'

但是当 bash 脚本正在读取这个参数并将它插入到 yaml 文件中时,它会列出这些文件并且参数是这样的:

'0 0 file1 file2 file3 file1 file2 file3 file1 file2 file3'

我已经尝试了我所知道的所有引号操作,在 bash 脚本之外和内部,我不知道接下来要尝试什么。

如何将这个参数作为普通字符串传递和处理?

这是接收调度参数并创建 yaml 的 bash 脚本:

#!/bin/bash

for ARGUMENT in "$@"
do

KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)   

case "$KEY" in
        APPLICATION_NAME) 
            APPLICATION_NAME=${VALUE} ;;
        IMAGE_NAME)
            IMAGE_NAME=${VALUE} ;;
        APPLICATION_TYPE)
            APPLICATION_TYPE=${VALUE} ;;
        CRON_SCHEDULE)
                CRON_SCHEDULE="${VALUE}" ;;
        CHART_FOLDER)  
            CHART_FOLDER=${VALUE} ;;    
esac    
done

echo "cron schedule is ${CRON_SCHEDULE}";

touch ./$CHART_FOLDER/values.yaml

if [ $APPLICATION_TYPE == "cronjob" ]; then
cat > "./$CHART_FOLDER/values.yaml" << EOF
  image:  
   image: $IMAGE_NAME
    tag: base

cron:
  production:
    schedule: "$CRON_SCHEDULE"
EOF
fi

任何帮助将不胜感激。 谢谢!!

解决方法

以下脚本:

#!/bin/bash

args=([0]="APPLICATION_NAME=Testing1" [1]="APPLICATION_DESCRIPTION=testRun" [2]="IMAGE_NAME=imageName" [3]="SENTRY_DSN=DSN" [4]="COMMAND=command" [5]="COMMAND_ARGS=args" [6]="APPLICATION_TYPE=cronjob" [7]="EXPOSE_JIRA=false" [8]="EXPOSE_WORKATO=false" [9]="CRON_SCHEDULE='0 0 0 * *'" [10]="CHART_FOLDER=chart_output")
set -- "${args[@]}"

for i in "$@"; do
    IFS== read -r key value <<<"$i"
    # remove single quotes
    if [[ "$value" =~ ^\'(.*)\'$ ]]; then
        value=${BASH_REMATCH[1]}
    fi
    # use declare to declare the variable with that value
    declare "$key=$value"
done

echo "cron schedule is ${CRON_SCHEDULE}";

cat << EOF
  image:  
   image: $IMAGE_NAME
    tag: base

cron:
  production:
    schedule: "$CRON_SCHEDULE"
EOF

输出:

cron schedule is 0 0 0 * *
  image:  
   image: imageName
    tag: base

cron:
  production:
    schedule: "0 0 0 * *"