【问题标题】:How can I run PNPM workspace projects as parallel jobs on GitHub Actions?如何在 GitHub Actions 上将 PNPM 工作区项目作为并行作业运行?
【发布时间】:2021-07-18 08:52:25
【问题描述】:

给定一个包含两个包的存储库结构,如下所示:

$ 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 中?

【问题讨论】:

    标签: continuous-integration github-actions monorepo pnpm


    【解决方案1】:

    嗯...我对此进行了更多思考,我找到了一个解决方案。

    我首先制作了一个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 可以并行运行它们:

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 2021-09-23
      • 2021-04-26
      • 2021-12-19
      • 1970-01-01
      • 2020-03-24
      • 2020-04-02
      • 2021-01-08
      • 2023-01-05
      相关资源
      最近更新 更多