这个问题是 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 文件中添加点和记录即可消除我的问题。我想避免这个硬性要求。