如何在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 }}
关键逻辑说明
- 输入定义:在
workflow_dispatch中保留原布尔输入,增加default: false避免误触发。 - 矩阵筛选:利用
jq工具对原始矩阵进行过滤,仅保留用户选中的项目对应的矩阵项。 - 动态矩阵传递:通过前置作业的
outputs将筛选后的矩阵传递给部署作业,部署作业使用fromJSON解析并加载到strategy.matrix.include中。 - 空矩阵防护:通过
if判断确保当没有选中任何项目时,部署作业不会执行。
内容的提问来源于stack exchange,提问作者av8304
相关产品推荐
相关产品推荐

