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

如何在GitHub Actions作业间传递动态生成的作业级环境变量

GitHub Actions动态变量跨作业传递方案

因为GitHub Actions要求作业的outputs必须预先声明,无法直接传递未提前定义的动态键值对,所以需要通过统一打包动态变量为单个结构化输出的方式实现跨作业传递,具体步骤如下:

1. 在mainjob1中打包动态变量

将所有动态生成的key=value对打包成JSON字符串,作为单个作业输出传递:

name: Main Workflow

on:
  push:
    branches:
      - main

jobs:
  mainjob1:
    runs-on: ubuntu-latest
    outputs:
      dynamic_vars: ${{ steps.split.outputs.dynamic_vars }} # 预先声明单个统一输出
    steps:
      - name: Set Dynamic Variable list using ForEach loop
        id: split
        run: |
          # 收集所有动态键值对并转为JSON
          $vars = @{}
          "${{ needs.READ_VARS_FROM_XML.outputs.key_value_x }}" -split '[\r\n]+' | ForEach-Object {
            $trimvalue = $_.Trim()
            if ($trimvalue -match '^(\w+)=(\w+)$') { # 过滤合法的key=value格式
              $key = $matches[1]
              $value = $matches[2]
              $vars[$key] = $value
              # 写入当前作业的环境变量
              echo "$trimvalue" >> $env:GITHUB_ENV
            }
          }
          # 将哈希表转为压缩JSON字符串,写入作业输出
          $json = $vars | ConvertTo-Json -Compress
          echo "dynamic_vars=$json" >> $env:GITHUB_OUTPUT

      - name: Print sample single key-value from the dynamic variable list
        run: |
          echo "PORT NUMBER: ${{ env.port }} or ${{ fromJson(steps.split.outputs.dynamic_vars).port }}"

2. 在mainjob2中解析并使用动态变量

通过fromJson函数解析传递过来的JSON字符串,遍历或直接访问所需的键值对:

mainjob2:
    needs: mainjob1
    runs-on: ubuntu-latest
    steps:
      - name: Parse and access dynamic variables
        run: |
          # 将JSON字符串转为哈希表
          $dynamicVars = '${{ needs.mainjob1.outputs.dynamic_vars }}' | ConvertFrom-Json
          
          # 遍历所有动态变量并输出
          Write-Host "All dynamic variables:"
          $dynamicVars.PSObject.Properties | ForEach-Object {
            Write-Host "$($_.Name) = $($_.Value)"
            # 可选:写入当前作业的环境变量
            echo "$($_.Name)=$($_.Value)" >> $env:GITHUB_ENV
          }
          
          # 直接访问单个变量
          Write-Host "PORT NUMBER from dynamic vars: $($dynamicVars.port)"

关键说明

  • 必须预先在作业outputs中声明统一的输出项,GitHub Actions不支持动态添加作业输出键。
  • 使用JSON格式打包是因为它能保留键值对的结构,便于后续解析;如果偏好简单格式,也可以用换行分隔的key=value字符串,在mainjob2中按行分割解析。
  • 当前作业内使用动态变量时,依然可以直接通过env.key访问,不影响原有逻辑。

内容的提问来源于stack exchange,提问作者Ashar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:33:32