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

如何在GitHub Actions中根据布尔输入条件筛选矩阵元素?

问题描述

我想要创建一个GitHub Actions工作流,接收布尔类型的输入参数,通过对应站点的部署令牌(deploy token)完成特定站点的部署。目前已定义了如下示例输入和矩阵:

输入参数

ABC:
    type: boolean
    description: ABC
XYZ:
    type: boolean
    description: XYZ

矩阵定义

- project: ABC
     site_id: abc
     deploy_token_name: deploy_token_abc
     deploy_id: abc
- project: XYZ
     site_id: xyz
     deploy_token_name: deploy_token_xyz
     deploy_id: xyz

希望仅将workflow_dispatch中选中的输入对应的矩阵值加入到实际运行的矩阵中,请问是否有实现方法?

解决方案

可以通过动态生成矩阵的方式实现,核心思路是先通过前置作业根据用户选中的输入筛选出需要运行的矩阵项,再将筛选结果传递给后续的部署作业。以下是完整的实现示例:

name: 选择性部署站点
on:
  workflow_dispatch:
    inputs:
      ABC:
        type: boolean
        description: 是否部署ABC站点
        default: false
      XYZ:
        type: boolean
        description: 是否部署XYZ站点
        default: false

jobs:
  # 前置作业:根据用户输入筛选矩阵项
  generate-matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.filter.outputs.matrix }}
    steps:
      - id: filter
        run: |
          # 定义原始矩阵数据(格式化为JSON方便jq处理)
          RAW_MATRIX='[
            {"project": "ABC", "site_id": "abc", "deploy_token_name": "deploy_token_abc", "deploy_id": "abc"},
            {"project": "XYZ", "site_id": "xyz", "deploy_token_name": "deploy_token_xyz", "deploy_id": "xyz"}
          ]'
          
          # 使用jq根据用户输入筛选矩阵项
          FILTERED_MATRIX=$(echo "$RAW_MATRIX" | jq --arg abc "${{ github.event.inputs.ABC }}" --arg xyz "${{ github.event.inputs.XYZ }}" '
            map(
              if .project == "ABC" and ($abc == "true") then .
              elif .project == "XYZ" and ($xyz == "true") then .
              else empty end
            )
          ')
          
          # 将筛选结果输出为GitHub Actions可识别的格式
          echo "matrix=$FILTERED_MATRIX" >> "$GITHUB_OUTPUT"

  # 部署作业:使用筛选后的矩阵执行部署
  deploy:
    needs: generate-matrix
    runs-on: ubuntu-latest
    # 当筛选后的矩阵为空时,跳过此作业
    if: ${{ fromJSON(needs.generate-matrix.outputs.matrix) != '[]' }}
    strategy:
      matrix:
        include: ${{ fromJSON(needs.generate-matrix.outputs.matrix) }}
    steps:
      - name: 部署${{ matrix.project }}站点
        run: |
          # 替换为实际的部署逻辑
          echo "开始部署站点:${{ matrix.site_id }}"
          # 调用部署令牌示例:使用仓库中配置的secrets
          echo "部署令牌名称:${{ matrix.deploy_token_name }}"
          # 示例部署命令(根据实际场景调整)
          # deploy-tool --site ${{ matrix.site_id }} --token ${{ secrets[matrix.deploy_token_name] }} --id ${{ matrix.deploy_id }}

关键逻辑说明

  1. 输入定义:在workflow_dispatch中保留原布尔输入,增加default: false避免误触发。
  2. 矩阵筛选:利用jq工具对原始矩阵进行过滤,仅保留用户选中的项目对应的矩阵项。
  3. 动态矩阵传递:通过前置作业的outputs将筛选后的矩阵传递给部署作业,部署作业使用fromJSON解析并加载到strategy.matrix.include中。
  4. 空矩阵防护:通过if判断确保当没有选中任何项目时,部署作业不会执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:52:45