GitHub Actions中如何将环境变量的JSON用作matrix列表
解决GitHub Actions中复用JSON环境变量作为Matrix列表的问题
问题原因
GitHub Actions的matrix策略在作业初始化阶段解析,此时作业级/工作流级的env变量还未加载到作业上下文,直接引用${{ fromJson($SERVICES_JSON) }}会失效。
解决方案1:改用工作流变量定义服务列表
如果可以接受同时定义工作流变量和环境变量,将服务列表设为工作流级variables,既满足matrix直接访问需求,也能通过env同步给其他作业:
name: Deployment on: workflow_dispatch: # 定义工作流级变量,供matrix直接解析 variables: SERVICES_JSON: '[ "a", "b", "c" ]' # 同步为环境变量,供其他作业使用 env: SERVICES_JSON: ${{ variables.SERVICES_JSON }} jobs: pull-docker-images: runs-on: ubuntu-latest name: Pull docker images strategy: matrix: service: ${{ fromJson(variables.SERVICES_JSON) }} steps: - name: Prepare new image name env: SERVICE: ${{ matrix.service }} run: echo "NEW_IMAGE=${DOCKER_REGISTRY}/${PROJECT}/${SERVICE}:${BUILD}" >> $GITHUB_ENV
解决方案2:通过前置作业传递矩阵参数
如果必须保留env中的SERVICES_JSON,可以用前置作业将JSON内容输出为作业产物,后续作业通过needs获取并解析为矩阵:
name: Deployment on: workflow_dispatch: env: SERVICES_JSON: '[ "a", "b", "c" ]' jobs: # 前置作业:提取服务列表作为输出产物 setup-matrix: runs-on: ubuntu-latest outputs: services: ${{ steps.extract.outputs.services }} steps: - id: extract run: echo "services=$SERVICES_JSON" >> $GITHUB_OUTPUT # 依赖前置作业的拉取镜像作业 pull-docker-images: needs: setup-matrix runs-on: ubuntu-latest name: Pull docker images strategy: matrix: service: ${{ fromJson(needs.setup-matrix.outputs.services) }} steps: - name: Prepare new image name env: SERVICE: ${{ matrix.service }} run: echo "NEW_IMAGE=${DOCKER_REGISTRY}/${PROJECT}/${SERVICE}:${BUILD}" >> $GITHUB_ENV
额外结构修正
原始YAML存在语法错误:jobs下必须先定义作业名称(如pull-docker-images),再嵌套runs-on、name等字段,上述示例已修正该问题。
内容的提问来源于stack exchange,提问作者chujudzvin
相关产品推荐
相关产品推荐

