Skip to content

turbo + vercel cli 实现简单的 monorepo 文档部署

相比于上一次的工作流配置,本次改造仅仅是应用了 turbo 工具,实现了任务编排。

并且处理了以下边缘情况:

  1. 打包文件的剪切移动。实现文档项目和部署路径之间的解耦。
  2. 处理文件移动命令在 window 系统和 linux 系统内有故障的 bug。
  3. 处理新项目执行 vercel pull 时获取不合适的运行命令 bug。
  4. 优化了工作流的变量。

工作流文件

yaml
# use-vercel-cli-build-try-4.yaml

# 参考资料
# https://vercel.com/guides/how-can-i-use-github-actions-with-vercel
# https://vercel.com/guides/how-to-alias-a-preview-deployment-using-the-cli

name: 基于vercel命令的部署
env:
  # vercel的token
  vct: ${{ secrets.vercel_token }}

  # 从教程内得知 环境变量名称必须大写
  VERCEL_ORG_ID: ${{ secrets.vercel_orgId }}
  VERCEL_PROJECT_ID: ${{ secrets.vercel_projectId }}

  # vercel项目名称
  pjn: vercel-monorepo-test-1-zn20

  # 项目路径
  p1: ./packages/monorepo-1
  p2: ./packages/proj-2-vp2-custom-components
  p3: ./packages/monorepo-3
  p4: ./packages/monorepo-4
  p5: ./packages/monorepo-5

  # 项目url
  p1-url: monorepo-1.ruancat6312.top

  p2-url-1: monorepo-2.ruancat6312.top
  p2-url-2: m2.ruan-cat.com
  p2-url-3: m2.ruancat6312.top

  p3-url: monorepo-3.ruancat6312.top
  p4-url: monorepo-4.ruancat6312.top

  p5-url-1: monorepo-5.ruancat6312.top
  p5-url-2: monorepo5.ruan-cat.com

on:
  push:
    branches:
      - dev

jobs:
  Deploy-Production:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@main

      - name: 开启 corepack
        run: corepack enable && corepack install

      - name: 检查pnpm版本
        run: pnpm -v

      - name: 安装整个项目的依赖
        run: pnpm i

      - name: 用npm安装vercel cli工具
        run: npm i -g vercel@latest

      - name: 检查vercel cli版本
        run: vc -v

      - name: 各子项目连接现有的vercel项目
        # 本地window使用
        # run: vc link --yes --cwd=./packages/monorepo-3 --project=vercel-monorepo-test-1-zn20
        run: |
          vc link --yes --cwd=${{env.p1}} --project=${{env.pjn}} -t ${{env.vct}}
          vc link --yes --cwd=${{env.p2}} --project=${{env.pjn}} -t ${{env.vct}}
          vc link --yes --cwd=${{env.p3}} --project=${{env.pjn}} -t ${{env.vct}}
          vc link --yes --cwd=${{env.p4}} --project=${{env.pjn}} -t ${{env.vct}}
          vc link --yes --cwd=${{env.p5}} --project=${{env.pjn}} -t ${{env.vct}}

      - name: vercel生成特定.vercel/output/static目录
        # build命令仍然需要用token来运行。
        # run: vc build --yes --prod --cwd=./packages/monorepo-3 -A ./vercel.null.json
        run: |
          vc build --yes --prod --cwd=${{env.p1}} -A ./vercel.null.json -t ${{env.vct}}
          vc build --yes --prod --cwd=${{env.p2}} -A ./vercel.null.json -t ${{env.vct}}
          vc build --yes --prod --cwd=${{env.p3}} -A ./vercel.null.json -t ${{env.vct}}
          vc build --yes --prod --cwd=${{env.p4}} -A ./vercel.null.json -t ${{env.vct}}
          vc build --yes --prod --cwd=${{env.p5}} -A ./vercel.null.json -t ${{env.vct}}

      - name: turbo并发打包全部子项目
        run: pnpm run on-github-action-flow

      - name: 各子项目上传文件并部署到vercel内
        run: |
          url1="$(vc deploy --yes --prebuilt --prod --cwd=${{env.p1}} -t ${{env.vct}})"
          vc alias -t ${{env.vct}} set "$url1" ${{env.p1-url}}

          url2="$(vc deploy --yes --prebuilt --prod --cwd=${{env.p2}} -t ${{env.vct}})"
          vc alias -t ${{env.vct}} set "$url2" ${{env.p2-url-1}}
          vc alias -t ${{env.vct}} set "$url2" ${{env.p2-url-2}}
          vc alias -t ${{env.vct}} set "$url2" ${{env.p2-url-3}}

          url3="$(vc deploy --yes --prebuilt --prod --cwd=${{env.p3}} -t ${{env.vct}})"
          vc alias -t ${{env.vct}} set "$url3" ${{env.p3-url}}

          url4="$(vc deploy --yes --prebuilt --prod --cwd=${{env.p4}} -t ${{env.vct}})"
          vc alias -t ${{env.vct}} set "$url4" ${{env.p4-url}}

          url5="$(vc deploy --yes --prebuilt --prod --cwd=${{env.p5}} -t ${{env.vct}})"
          vc alias -t ${{env.vct}} set "$url5" ${{env.p5-url-1}}
          vc alias -t ${{env.vct}} set "$url5" ${{env.p5-url-2}}

下一步优化思路

github action 的命令从串行改成并行

目前的运行命令,大多数还是串行的运行命令。比如 vercel 的 link、build、deploy 和 alias 命令,现在在工作流内的写法仍旧是串行的,不是并行的。

冗长的变量

变量其实挺多的。未来 monorepo 变多时,重复冗余的内容会很多。

快速耗尽的 token 免费额度

使用 vercel cli 的 api 实现的部署,在目前的 monorepo 项目中,发现不足以支撑高强度的,短时间内的频繁更新,额度消耗太快了。

能不能实现差异化的部署?

或者说我直接去找其他的部署平台?不一定要吊死在 vercel 这一棵树上?

贡献者

The avatar of contributor named as ruan-cat ruan-cat

页面历史