在GitHub Actions的Bash步骤中保留带双引号输入及处理DNS记录
GitHub Actions中处理DigitalOcean DNS记录的Bash脚本解决方案
问题背景
通过GitHub Actions矩阵调用doctl CLI,基于dns-records.json自动填充DigitalOcean DNS区域。需对${{ inputs.RECORD_DATA }}做特殊处理:当记录类型为CNAME、值不为@且末尾无点时,自动添加末尾点;同时要兼容含空格和转义双引号的CAA记录,确保处理后引号保留并正确传入doctl。
核心问题与解决方法
1. 兼容特殊字符的最后一个字符获取
直接使用Bash参数扩展${RECORD_DATA: -1}即可,但必须用双引号包裹变量,避免含空格、引号的CAA记录被拆分导致取错字符。
在GitHub Actions中通过环境变量传递输入值,确保特殊字符被正确保留:
- name: Process DNS record data env: RECORD_DATA: ${{ inputs.RECORD_DATA }} RECORD_TYPE: ${{ inputs.RECORD_TYPE }} run: | MANIPULATED_RECORD_DATA="$RECORD_DATA" # 处理CNAME规则 if [[ "$RECORD_TYPE" == "CNAME" && "$RECORD_DATA" != "@" ]]; then LAST_CHAR="${RECORD_DATA: -1}" if [[ "$LAST_CHAR" != "." ]]; then MANIPULATED_RECORD_DATA="${RECORD_DATA}." fi fi # 将处理后的值写入GitHub环境变量,供后续步骤调用 echo "MANIPULATED_RECORD_DATA=$MANIPULATED_RECORD_DATA" >> "$GITHUB_ENV"
2. 保留CAA记录的转义双引号
调用doctl时,必须用双引号包裹处理后的变量,确保转义引号被完整传递给CLI,不会被Bash解析丢失。
示例调用步骤:
- name: Create DigitalOcean DNS record run: | doctl compute domain records create ${{ inputs.DOMAIN }} \ --record-type ${{ inputs.RECORD_TYPE }} \ --record-name ${{ inputs.RECORD_NAME }} \ --record-data "$MANIPULATED_RECORD_DATA" \ --record-ttl ${{ inputs.RECORD_TTL }}
关键注意事项
- 所有涉及
RECORD_DATA的变量引用必须用双引号包裹,防止空格、引号等特殊字符触发Bash的单词拆分。 - 通过
$GITHUB_ENV传递处理后的值,避免直接在步骤间传递时出现转义丢失问题。 - 测试验证:针对CAA记录(如
0 issue "letsencrypt.org"),处理后应完整保留引号;CNAME记录(如example.com)应自动添加末尾点,example.com.则保持不变。
内容的提问来源于stack exchange,提问作者Tom Peperkamp
相关产品推荐
相关产品推荐

