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

页面历史

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。