簡體   English   中英

Bash - Gitlab CI 未將變量轉換為字符串

[英]Bash - Gitlab CI not converting variable to a string

我正在使用 GitLab 部署項目,並在 GitLab 控制台中設置了一些環境變量,我在下面的 GitLab 部署腳本中使用了該控制台:

- export S3_BUCKET="$(eval \$S3_BUCKET_${CI_COMMIT_REF_NAME^^})"
- aws s3 rm s3://$S3_BUCKET --recursive

我的環境變量聲明如下:

Key: s3_bucket_development
Value: https://dev.my-bucket.com

Key: s3_bucket_production
Value: https://prod.my-bucket.com

計划是它根據嘗試部署的分支 ( CI_COMMIT_REF_NAME ) 從環境變量中獲取存儲桶 URL。

問題是S3_BUCKET變量似乎沒有正確設置,我收到以下錯誤:

> export S3_BUCKET=$(eval \$S3_BUCKET_${CI_COMMIT_REF_NAME^^})
> /scripts-30283952-2040310190/step_script: line 150: https://dev.my-bucket.com: No such file or directory

看起來它可以很好地獲取環境變量值但沒有正確設置它 - 任何想法為什么?

您基本上是在告訴 bash 執行名為https://dev.my-bucket.com的命令,這顯然不存在。

由於您想在使用VAR=$(command)時分配命令的output ,因此您可能應該使用echo

export S3_BUCKET=$(eval echo \$S3_BUCKET_${CI_COMMIT_REF_NAME^^})

簡單測試:

VAR=HELL; OUTPUT="$(eval echo "\$S${VAR^^}")"; echo $OUTPUT
/bin/bash

它動態創建 SHELL 變量,然后成功打印

您似乎正在嘗試根據CI_COMMIT_REF_NAME的值獲取變量S3_BUCKET_DEVELOPMENTS3_BUCKET_PRODUCTION的值,您可以使用參數間接執行此操作:

$ a=b
$ b=c
$echo "${!a}" # c

在您的情況下,您還需要一個臨時變量,這樣的事情可能會起作用:

- s3_bucket_variable=S3_BUCKET_${CI_COMMIT_REF_NAME^^}
- s3_bucket=${!s3_bucket_variable}
- aws s3 rm "s3://$s3_bucket" --recursive

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM