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

使用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}}的有效性:

  1. 在Serverless命令前添加echo '${{ inputs.stage }}',输出显示值为dev​,视觉上与预期一致
  2. 注释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已传入变量解析流程,但嵌套变量场景报错
  3. 查看完整错误输出,命令行中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:05:32