如何在 GitHub Actions 的运行步骤 (bash) 中保留带双引号的输入?

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

这个问题是 GitHub Actions 挑战,但据我所知,我可能应该通过运行命令(bash)来解决。

背景

我有一个 json 文件(见下文),可以自动填充我的 DigitalOcean 环境中的 DNS 区域。

dns-records.json

{
    "records": [
        {
            "key": "@",
            "type": "CNAME",
            "ttl": "600",
            "value": "<WEBSITE_NAME>.<HOSTING_DOMAIN>"
        },
        {
            "key": "www",
            "type": "CNAME",
            "ttl": "86400",
            "value": "@"
        },
        {
            "key": "@",
            "type": "CAA",
            "ttl": "86400",
            "value": "0 issue \"letsencrypt.org\""
        },
        {
            "key": "assets",
            "type": "CNAME",
            "ttl": "86400",
            "value": "<WEBSITE_NAME>.<DO_SPACES_REGION>.cdn.digitaloceanspaces.com"
        }
    ]
}

在我的 GitHub Actions 工作流程中,我使用矩阵方法触发 doctl CLI 命令来创建 DNS 记录。在调用的创建作业中,可以通过 ${{ input.RECORD_DATA }} 访问这些值。

挑战

我确实想在特定情况下更改 RECORD_DATA:如果记录类型是 CNAME 并且记录值不是“@”(“@”键就可以!),那么我必须添加一个点(“.”) ) 到字符串末尾 - 但前提是最右边的字符还不是点。

由于 GitHub Actions 不支持条件/三元运算符(if-else 语句),因此我对 if-else 使用 bash 运行步骤。

伪代码:

RECORD_DATA_LAST_CHAR="insert magic here?"
if [ RECORD_TYPE == 'CNAME' && $RECORD != '@' && $RECORD_DATA_LAST_CHAR != '.' ]; then
  echo "MANIPULATED_RECORD_DATA=$RECORD_DATA." >> $GITHUB_OUTPUT
ese
  echo "MANIPULATED_RECORD_DATA=$RECORD_DATA" >> $GITHUB_OUTPUT
fi

PS1:对 $GITHUB_OUTPUT 的回显是在后续工作流程步骤中重用变量的 GHA 方式。

PS2:我通常使用步骤级环境变量作为输入,因此 bash 可以使用它来代替 GHA ${{}}。

env:
  RECORD_DATA: ${{ inputs.RECORD_DATA }}

我的第一个问题:如何在 bash run 命令中获取 ${{ input.RECORD_DATA }} 的最后一个字符,这种方式也适用于 json 中包含空格和双引号的 CAA 示例?

我的第二个问题:我必须使用 $MANIPULATED_RECORD_DATA 作为 doctl 命令的输入来创建 DNS 记录。如何保留 LetsEncrypt CAA 示例记录中的原始 转义 引号,以便传递 $MANIPULATED_RECORD_DATA 时包括这些引号?

错误结果

没有结束点的失败示例。

doctl compute domain records create domain.name \
    --record-type CNAME \
    --record-name @ \
    --record-data "hostname.domain.name" \
    --record-ttl 600 \
    --verbose=false

shell: /usr/bin/bash --noprofile --norc -e -o pipelinefail {0} 错误:POST https://api.digitalocean.com/v2/domains/domain.name/records:422(请求“629564e1-160e-4f9b-bd26-37e441df0ca7”)数据需要以点(.)结尾

字符串内引号未转义时失败的 dotl 示例。

doctl compute domain records create domain.name \
    --record-type CAA \
    --record-name @ \
    --record-data "0 issue "letsencrypt.org"" \
    --record-ttl 86400 \
    --verbose=false

shell: /usr/bin/bash --noprofile --norc -e -o pipelinefail {0} 错误:POST https://api.digitalocean.com/v2/domains/domain.name/records:422(请求“173475ec-31d1-41f7-9ae6-aa9424f4a4bd”)标签不能为空,标签不能为空不能为空,Tag 不能为空,Tag 必须为 issues、issuewild 和/或 iodef

失败的尝试和错误尝试

我发现this post关于如何使var(包括引号)可用于子进程。但我未能将其包含在 GHA 运行命令中。

export var
bash -c 'echo "$var"'

我无法让

RECORD_DATA_LAST_CHAR=${RECORD_DATA: -1}
工作,但这也许也与报价问题有关?我尝试过参数扩展和 sed 但不知何故未能将它们与 echo 正确结合使用。

任何帮助我“摆脱困境”的帮助将不胜感激。我是 GHA 的新手,也不是 bash 专家。

注意:我知道只需在 json 文件中添加点和记录即可消除我的问题。我想避免这个硬性要求。

bash github-actions digital-ocean
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.