【问题标题】:Using an array of values to repeat a step in GitHub Actions workflow使用值数组重复 GitHub Actions 工作流程中的步骤
【发布时间】:2020-03-29 12:19:31
【问题描述】:

我正在尝试创建一个 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

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

【问题讨论】:

标签: yaml workflow github-actions


【解决方案1】:

Github Actions 对此提供了一些支持。有一个very good tutorial here 详细解释了如何执行此操作,但基本上您要做的是将这些步骤分成两个工作。第一个作业将输出一个 JSON 对象,该对象将作为第二个作业的matrix 的输入。

这是一个简单的例子:

jobs:

  setup:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.matrix.outputs.value }}
    steps:
      - id: matrix
        run: |
          echo '::set-output name=value::[\"a\", \"b\", \"c\"]'
  build:
    needs: [ setup ]
    runs-on: ubuntu-latest
    strategy:
      matrix:
        value: ${{fromJson(needs.setup.outputs.matrix)}}
    steps:
      - run: |
          echo "${{ matrix.value }}"

【讨论】:

    【解决方案2】:

    如果不运行它很难说,但我会说您需要通过将输出分配给变量来使用第二步中的输出,例如:

    env:
              OUTPUT: ${{ steps.id.outputs.arr }}
    

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

    该特定操作的问题在于它一次需要一个提交。但是你可以check out the code,它是一个shell 脚本。您可以从第 15 行 fork 并使其拆分输入并在其上运行一个循环,将eslint 应用于每个输入。

    【讨论】:

    • 我可以在第一步中使用::set-output::set-env,这没有问题,但无论我设置什么(输出或环境变量)我不知道如何重复我数组中每个值的第二步。
    • @errata 首先,GitHub 操作没有提供我所知道的这种机制,尽管原则上可以递归生成事件,但您需要编辑代码;问题是,只要你在编辑代码,你也可以分叉使用的操作。
    • 感谢您的解释!您能否进一步扩展您的答案,您说“GitHub Actions 中没有这样的机制”,但除了修改操作本身(正如您建议的那样,我很可能会这样做)并避免做同样的事情对于任何其他操作,工作流 .yml 文件本身是否有一些替代方法?
    • @errata 感谢您接受答案。不幸的是,情况似乎并非如此。有very limited control flow in the action syntax。例如,您可以使用“if”,但不能动态创建步骤。另一种选择是直接运行 shell 脚本,因为 github 操作也可以这样做。
    • 我也有类似的要求。但是,就我而言,我需要遍历一些 yaml 值(AWS 账户 ID)并根据这些 ID 访问机密。但是,既没有办法基于动态变量访问机密,也没有办法循环这些步骤。 GitHub Actions 实在是太令人失望了。
    猜你喜欢
    • 2020-01-01
    • 2021-12-28
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2020-05-12
    • 2020-04-03
    • 2022-11-02
    相关资源
    最近更新 更多