如何解决如何在 GitHub Actions 上将 PNPM 工作区项目作为并行作业运行?
给定一个包含两个包的存储库结构,如下所示:
$ tree
.
└── packages
├── foo
└── bar
$ cat pnpm-workspace.yaml
packages:
- 'packages/**'
$ pnpm -s m ls --depth -1
monorepo /monorepo
@mono/foo@0.0.0 /monorepo/packages/foo
@mono/baz@0.0.0 /monorepo/packages/bar
我想运行 GitHub Actions CI,以便它自动将每个项目作为单独的作业运行。在这里,我设置了一个手动执行并行化的作业:
name: CI
on:
push:
jobs:
build:
strategy:
matrix:
package: ["@mono/foo","@mono/bar" ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: pnpm/action-setup@v2
with:
version: 6.9.1
- run: pnpm run --filter ${{ matrix.package }} test
运行速度很快,因为每个项目都作为并行作业运行,但我不想手动维护该 matrix.package
列表。如何利用 pnpm
提供输入到 GitHub Actions CI 的工作区项目列表?
解决方法
嗯...我对这个问题有更多的了解,我找到了一个的解决方案。
我首先制作了一个 package.json
脚本来将 pnpm
输出变成一个 json 数组片段:
$ cat package.json
{
"scripts": {
"list-packages": "echo [$(pnpm -s m ls --depth -1 | tr \" \" \"\n\" | grep -o \"@.*@\" | rev | cut -c 2- | rev | sed -e 's/\\(.*\\)/\"\\1\"/' | paste -sd,- )]",}
}
$ pnpm -s list-packages
["@mono/foo","@mono/bar"]
(我对 shell 不够了解,不知道是否有更简单的方法来表达这种转换,所以我很乐意学习!)
然后我followed GitHub documentation on dynamically setting matrix variables创建了这个工作流程:
name: CI
on:
push:
workflow_dispatch:
jobs:
packages:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v2
- uses: pnpm/action-setup@v2
with:
version: 6.9.1
- run: $(echo pnpm -s list-packages2)
- id: set-matrix
run: echo "::set-output name=matrix::{\"packages\":$(pnpm -s list-packages)}"
build:
needs: packages
strategy:
matrix: ${{ fromJson(needs.packages.outputs.matrix) }}
runs-on: ubuntu-latest
steps:
- run: echo ${{ matrix.package }}
packages
作业现在获取 $(pnpm -s list-packages)
的输出并将其放入矩阵变量中,这使得 GitHub Actions 并行运行它们:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。