You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:45:26