使用一组值重复 GitHub 操作工作流程中的一个步骤

err*_*ata 10 workflow yaml github-actions

我正在尝试创建一个 GitHub Actions 工作流程,该工作流程将收集在上次提交中更改的特定路径,并为每个收集的路径(如果有)运行一个步骤。

目前,在我的工作流程中,我正在创建一个路径数组,但我不确定如何处理我的数组:

name: Test

on:
  push

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

      # This step will create "an array" of strings, e.g. "path1 path2 path3"
      - name: array
        id: arr
        run: |
          arr=()
          for i in "$(git diff-tree --no-commit-id --name-only -r ${{ github.sha }})"
          do
            if [[ $i == *"path1"* ]]; then
              arr+=("path1")
            fi
            if [[ $i == *"path2"* ]]; then
              arr+=("path2")
            fi
          done
          echo ::set-output name=arr::${arr[@]}

      # How to run this step by iterating the `${{ steps.arr.outputs.arr }}`?
      - name: reviewdog-lint
        uses: reviewdog/action-eslint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-review
          eslint_flags: 'my_project/some_folder/${{ SINGLE_PATH }}/'  # `SINGLE_PATH` would be a path from the array
Run Code Online (Sandbox Code Playgroud)

像这样的事情一开始就有可能吗?如果没有,推荐什么方法来循环遍历某些值并将它们用作其他工作流程步骤中的参数?

Mic*_*ers 35

GitHub Actions 对此提供了一些支持。这里有一个非常好的教程,详细解释了如何执行此操作,但本质上您要做的就是将这些步骤分为两项工作。第一个作业将输出一个 JSON 对象,该对象将作为matrix第二个作业的输入。

这是一个简单的例子:

name: Test Github Actions Dynamic Matrix
on:
  workflow_dispatch:
  
jobs:
  setup:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.matrix.outputs.value }}
    steps:
      - id: matrix
        run: |
          echo "value=[\"a\", \"b\", \"c\"]" >> $GITHUB_OUTPUT
      - run: |
          echo "${{ steps.matrix.outputs.value }}"
  build:
    needs: [ setup ]
    runs-on: ubuntu-latest
    strategy:
      matrix:
        value: ${{fromJSON(needs.setup.outputs.matrix)}}
    steps:
      - run: |
          echo "${{ matrix.value }}"
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到它的动作

  • 这并不是一个真正的答案,因为这是不同作业的序列化,而不是步骤。每个作业都将在不同的运行器上运行,并且无法使用之前步骤的结果。 (11认同)
  • 这不再起作用:`评估作业“构建”的“策略”时出错。.github/workflows/blank.yml(行:20,列:16):解析 fromJson 时出错,.github/workflows/blank.yml(行:20,列:16):解析值时遇到意外字符:\。路径'',第1行,位置1.,.github/workflows/blank.yml(行:20,列:16):值''的意外类型,预期类型:序列。` (8认同)

jjm*_*elo 2

很难说不运行它,但我想说你需要在第二步中使用输出,将其分配给变量,例如:

env:
          OUTPUT: ${{ steps.id.outputs.arr }}
Run Code Online (Sandbox Code Playgroud)

$OUTPUT然后在操作中用作环境变量。

该特定操作的问题在于它一次需要一次提交。但是你可以查看代码,它是一个shell脚本。您可以从第 15 行分叉它,并使其分割输入并对其运行一个循环,应用于eslint其中的每一个。

  • 我可以在第一步中使用 `::set-output` 或 `::set-env` ,这没有问题,但无论我设置什么(输出或环境变量),我都不知道如何重复我的数组中每个值的第二步。 (2认同)
  • @errata 感谢您接受答案。不幸的是,情况似乎并非如此。[操作语法中的控制流非常有限](https://help.github.com/es/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idenv) 。例如,您可以使用“if”,但不能动态创建步骤。另一种选择是直接运行 shell 脚本,因为 github actions 也可以做到这一点。 (2认同)