使用值数组重复 GitHub 操作工作流程中的步骤
Using an array of values to repeat a step in GitHub Actions workflow
我正在尝试创建一个 GitHub 操作工作流,它将收集上次提交中更改的特定路径,并 运行 每个收集的路径的步骤,如果有的话。
目前,在我的工作流程中,我正在创建一个路径数组,但我不确定如何继续我的数组:
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
一开始这样的事情有可能吗?如果不是,建议使用什么方法循环遍历某些值并将它们用作其他工作流步骤中的参数?
如果没有 运行 就很难说,但我会说您需要通过将输出分配给变量来使用第二步中的输出,例如:
env:
OUTPUT: ${{ steps.id.outputs.arr }}
然后您使用 $OUTPUT
作为动作中的环境变量。
该特定操作的问题在于它一次需要一个提交。但是你可以 check out the code,这是一个 shell 脚本。您可以从第 15 行分叉它并使其拆分输入并 运行 在它上面循环,将 eslint
应用到它们中的每一个。
Github 操作对此有一些支持。有一个 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 }}"
我正在尝试创建一个 GitHub 操作工作流,它将收集上次提交中更改的特定路径,并 运行 每个收集的路径的步骤,如果有的话。
目前,在我的工作流程中,我正在创建一个路径数组,但我不确定如何继续我的数组:
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
一开始这样的事情有可能吗?如果不是,建议使用什么方法循环遍历某些值并将它们用作其他工作流步骤中的参数?
如果没有 运行 就很难说,但我会说您需要通过将输出分配给变量来使用第二步中的输出,例如:
env:
OUTPUT: ${{ steps.id.outputs.arr }}
然后您使用 $OUTPUT
作为动作中的环境变量。
该特定操作的问题在于它一次需要一个提交。但是你可以 check out the code,这是一个 shell 脚本。您可以从第 15 行分叉它并使其拆分输入并 运行 在它上面循环,将 eslint
应用到它们中的每一个。
Github 操作对此有一些支持。有一个 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 }}"