使用Github复合动作传参时Serverless部署报变量解析错误
问题:Serverless Framework在GitHub Actions中解析嵌套变量失败
背景
我有一个使用Serverless Framework部署云栈的GitHub复合动作,接收serverless-path、stage等输入参数,动作代码如下:
inputs: serverless-path: description: 'The relative path to the project root.' type: string required: true stage: description: 'The serverless deployment stage to use.' type: string required: true default: 'dev' otherArgs: description: 'Additional arguments to provide to the serverless deploy command.' type: string required: false default: '' runs: using: 'composite' steps: - name: Checkout code uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: '16.13.0' cache: yarn - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v2 with: aws-region: us-east-1 role-to-assume: *** - name: Install project dependencies shell: bash run: yarn install --frozen-lockfile working-directory: ${{ inputs.serverless-path }} - name: debug step shell: bash run: yarn run serverless print --stage ${STAGE} working-directory: ${{ inputs.serverless-path }} env: STAGE: ${{ inputs.stage }}
错误现象
运行该动作时,Serverless命令抛出如下错误:
Error: Cannot resolve serverless.yml: Variables resolution errored with: - Cannot resolve variable at "provider.environment.SHOP": Value not found at "self" source
将${{ inputs.stage }}替换为'dev'这类静态字符串时,命令可正常执行,怀疑问题与输入参数的传递方式有关。
调试过程
我做了几项测试验证${{inputs.stage}}的有效性:
- 在Serverless命令前添加
echo '${{ inputs.stage }}',输出显示值为dev,视觉上与预期一致 - 注释serverless.yml中嵌套变量的行,添加多种获取stage值的环境变量定义:
运行provider: ... environment: CUSTOM_STAGE: ${self:custom.stage} OPT_STAGE: ${opt:stage} SLS_STAGE: ${sls:stage} # SHOP: ${self:custom.environment.${self:custom.stage}.SHOP} ... custom: stage: ${opt:stage, 'default'}sls print无报错,各stage值均正确获取为dev,说明stage已传入变量解析流程,但嵌套变量场景报错 - 查看完整错误输出,命令行中的stage参数显示为
--stage dev,视觉上符合预期,但仍报错
问题原因
核心问题是从GitHub inputs传入的stage值末尾带有不可见的特殊字符(如零宽空格):
- 视觉上
dev和dev无区别,但实际字节序列不同 - 在解析嵌套变量
${self:custom.environment.${self:custom.stage}.SHOP}时,Serverless使用的是带特殊字符的stage值,而你的custom配置中对应的是无特殊字符的dev,因此找不到对应的值,抛出"Value not found at 'self' source"错误 - 静态字符串
'dev'无特殊字符,所以可以正常匹配解析
解决方案
1. 清理输入参数的特殊字符
在GitHub Actions中使用trim函数去除输入参数的前后空白及不可见字符,修改env定义:
env: STAGE: ${{ trim(inputs.stage) }}
2. 直接使用处理后的参数
绕开环境变量传递,直接在命令中使用trim后的参数,减少中间环节可能引入的问题:
- name: debug step shell: bash run: yarn run serverless print --stage ${{ trim(inputs.stage) }} working-directory: ${{ inputs.serverless-path }}
3. 验证特殊字符(可选)
添加调试命令查看字符的十六进制值,确认是否存在特殊字符:
echo -n '${{ inputs.stage }}' | xxd
如果输出中包含e2 80 8b(零宽空格的十六进制编码),即可确认问题根源。
内容的提问来源于stack exchange,提问作者fraxture
相关产品推荐
相关产品推荐

