如何在GitHub Actions中实现矩阵作业的指定项仅包含?
GitHub Actions 矩阵仅包含指定应用的解决方案
方案一:修正作业级别if条件语法
你之前的报错大概率是JSON转义问题导致的。在GitHub Actions表达式中,用单引号包裹JSON字符串时,内部的双引号无需转义,直接使用正常的JSON数组格式即可:
jobs: example_matrix: runs-on: ubuntu-latest strategy: matrix: app: ${{ fromJson(needs.affected-apps.outputs.apps) }} if: ${{ contains(fromJson('["app1", "app2"]'), matrix.app) }} steps: - uses: actions/setup-node@v3 - uses: ... - uses: ... - uses: ...
这个条件会直接在作业级别生效,不匹配的矩阵项会被标记为“跳过”,仅执行符合条件的作业。
方案二:前置作业过滤矩阵数据源(更高效)
如果受影响应用数量极多,方案一虽然能跳过作业,但GitHub Actions仍会先创建所有矩阵作业项,可能造成不必要的资源占用。此时可以提前过滤出需要保留的应用,再生成矩阵:
jobs: filter-target-apps: runs-on: ubuntu-latest outputs: filtered_apps: ${{ steps.filter-step.outputs.apps }} steps: - id: filter-step run: | # 读取受影响应用列表 affected_apps='${{ needs.affected-apps.outputs.apps }}' # 定义需要保留的应用清单 allowed_apps='["app1", "app2"]' # 使用jq计算两个数组的交集,得到最终需要执行的应用列表 filtered_result=$(echo "$affected_apps" | jq --argjson allowed "$allowed_apps" '. as $affected | $allowed | map(select(. as $item | $affected | index($item)))') # 将结果输出为GitHub Actions可用的变量 echo "apps=$filtered_result" >> "$GITHUB_OUTPUT" example_matrix: runs-on: ubuntu-latest needs: [affected-apps, filter-target-apps] strategy: matrix: app: ${{ fromJson(needs.filter-target-apps.outputs.filtered_apps) }} steps: - uses: actions/setup-node@v3 - uses: ... - uses: ... - uses: ...
这种方式会直接生成仅包含目标应用的矩阵,无需额外的条件判断,更适合大规模应用的场景。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

