使用自定义 GitHub Actions CI/CD 部署到 Vercel

GitHub105 次阅读14 分钟

除了上一篇介绍的 使用 Github Action自动执行Vercel 部署** **使用Deploy Hooks 的方式进行部署之外,还可以有更复杂的场景。

比如可以将 Vercel 与 GitHub Actions 一起使用作为您的 CI/CD 提供程序,在每次推送代码时生成预览部署,并在代码合并到main分支时部署到生产环境。

这种则需要使用到 Vercel 的访问令牌 access_token 等。

1、获取相关访问令牌

获取VERCEL\_TOKENVERCEL\_ORG\_IDVERCEL\_PROJECT\_ID 相关token。

1.1、获取 Vercel api 访问令牌VERCEL_TOKEN

在 个人账号设置 → Token 菜单下,创建 api 访问令牌,也即是VERCEL\_TOKEN

image.png

1.2、获取VERCEL_PROJECT_ID

在Vercel 具体项目下, 项目设置 下找到 Project Id。

image.png

1.3、获取VERCEL_ORG_ID

  • 使用命令行npm i -g vercel安装Vercel CLI并运行vercel login
  • 在新建文件夹中,运行vercel link以创建一个新的 Vercel 项目,或者是已有的Git 项目,会提示 ✅  Linked to ``**xxx-projects/next-starter-example**`` (created .vercel) 并生成.vercel 文件夹。
  • 在生成的.vercel文件夹中,从project.json{"projectId":"prj\_xxx","orgId":"team\_xxx"}保存projectId和orgId。

💡 在Account Setting→General 菜单下,有Vercel ID\[This is your user ID within Vercel.\] API Token,是否可以作为VERCEL\_ORG\_ID[未验证]

image.png

1.4、配置到 Github 中

将以上VERCEL\_TOKENVERCEL\_ORG\_IDVERCEL\_PROJECT\_ID添加到 GitHub 项目的 actions secret 配置中。

image.png

2、配置 Github Actions

当代码推送到非 main 分支时,生成预览部署:

name: GitHub Actions Vercel Preview Deployment
env:
  VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
  VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
on:
  push:
    branches-ignore:
      - main
jobs:
  Deploy-Preview:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Vercel CLI
        run: npm install --global vercel@canary
      - name: Pull Vercel Environment Information
        run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}
      - name: Build Project Artifacts
        run: vercel build --token=${{ secrets.VERCEL_TOKEN }}
      - name: Deploy Project Artifacts to Vercel
        run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }}

当代码推送到 main 分支时,生成正式部署:

name: GitHub Actions Vercel Production Deployment
env:
  VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
  VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
on:
  push:
    branches:
      - main
jobs:
  Deploy-Production:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Vercel CLI
        run: npm install --global vercel@canary
      - name: Pull Vercel Environment Information
        run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}
      - name: Build Project Artifacts
        run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}
      - name: Deploy Project Artifacts to Vercel
        run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}

3、借助marketplace 上的 Github Actions 实现

也可以借助一些已经实现好的 actions 来实现我们的需求。比如:

3.1、代码推送或者发起 pull request 时触发

# 可以参考我的工作流
# 定义 GitHub Actions 的工作流程名称
name: Deploy to Vercel

# 触发条件
on:
  push:
    branches: [ main ] # 当代码推送到 main 分支时触发
  pull_request:
    branches: [ main ] # 当针对 main 分支发起 Pull Request 时触发

# 定义工作流程中的作业(jobs)
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: '9.8.0'
      - name: Install Dependencies
        run: pnpm install
      - name: Build
        run: pnpm build
      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          working-directory: ./

3.2、另一例:deploy-to-vercel-action

使用 GitHub Actions 将您的项目/站点部署到Vercel。在何时部署站点方面,它比 Vercel 的 GitHub 集成提供了更多的自定义功能。使用 GitHub Actions Events,您可以选择部署每个提交,仅在新版本上或甚至在 cron 计划上部署。该操作还可以部署每个 PR 并使用自定义预览 URL 对其进行评论。它使用 Vercel CLI,也可以自动在 GitHub 上创建部署。

name: Deploy CI
on:
  push:
    branches: [master]
  pull_request:
    types: [opened, synchronize, reopened]
jobs:
  deploy:
    runs-on: ubuntu-latest
    if: "!contains(github.event.head_commit.message, '[skip ci]')"
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Deploy to Vercel Action
        uses: BetaHuhn/deploy-to-vercel-action@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GH_PAT }}
          VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
          VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
          VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

参考资料

How can I use GitHub Actions with Vercel?

Bring Your Own CI/CD - GitHub Actions** **