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

关于GitHub Actions复合动作的执行环境与变量传递的技术问询

关于GitHub Actions复合动作的执行环境与变量传递的技术问询

先看你提供的复合动作代码片段:

runs:
  using: "composite"
  steps:
    - uses: azure/login@v2
      with:
        client-id: ${{ inputs.clientId }}
        tenant-id: ${{ inputs.tenantId }}
        allow-no-subscriptions: true
    - name: Get Token
      id: get-token
      run: |
        token=$(az account get-access-token --scope=${{ inputs.ammaScope }} --query accessToken --output tsv)
        echo "::add-mask::$token"
        echo "token=$token" >> "${GITHUB_OUTPUT}"
      shell: bash

用户疑问

  • 每个步骤是不是运行在独立的Bash Shell里?正常情况下,同一个Job里的所有步骤都是在同一个Shell运行的。如果是独立的,那它和调用这个复合动作的Job里的其他步骤是不是同一个Shell?
  • 复合动作能不能通过export MY_VAR=MY_VALUE这种方式导出环境变量,还是只能通过输出(outputs)和调用它的Job里的其他步骤通信?

解答

咱们逐个理清这些问题:

  1. Shell环境的独立性说明
    其实不管是复合动作里的步骤,还是Job直接定义的步骤,每个run步骤都会启动一个全新的Shell进程——哪怕是同一个Job里的不同步骤,也不会共享同一个Shell会话。复合动作的步骤也遵循这个规则,它们和调用Job里的其他步骤一样,每个run执行完Shell就销毁,上下文不会保留。

    举个实际的例子:如果在复合动作的某一步里执行export MY_VAR=foo,不管是复合动作的下一个步骤,还是调用Job里的后续步骤,都拿不到这个变量,因为执行export的Shell进程已经结束了,环境变量不会跨进程传递。

  2. 复合动作的变量传递方式
    复合动作没办法通过export直接把环境变量传递给外层的调用Job,因为Shell进程的隔离性导致环境变量无法持久化到整个Job的全局上下文里。

    如果要把复合动作里的数据传递给调用Job的其他步骤,靠谱的方式主要有两种:

    • 通过GITHUB_OUTPUT传递输出参数:就像你代码里做的那样,用echo "token=$token" >> "${GITHUB_OUTPUT}"定义输出,然后在调用Job里通过${{ steps.<你的复合动作步骤ID>.outputs.token }}来获取这个值。
    • 写入工作目录的文件:如果是较大的数据,可以把内容写入到Job共享的工作区文件中,后续所有步骤(包括调用Job的步骤)都能读取这个文件里的内容。

备注:内容来源于stack exchange,提问作者Shuzheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:54:37