Skip to content

到了这一步,我们已经在项目中集成代码规范约束提交信息规范约束单元测试约束,从而保证我们远端仓库(如 GitHub、GitLab、Gitee 仓库等)的代码都是高质量的。
本项目是要搭建一套规范的前端工程化环境,为此我们使用 CI(Continuous Integration 持续集成)来完成项目最后的部署工作。
常见的 CI 工具有 GitHub Actions、GitLab CI、Travis CI、Circle CI 等。
这里,我们使用 GitHub Actions。

什么是 GitHub Actions

GitHub Actions 是 GitHub 的持续集成服务,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器、发布到第三方服务等等,GitHub 把这些操作称为 actions。

配置 GitHub Actions

创建 GitHub 仓库

因为 GitHub Actions 只对 GitHub 仓库有效,所以我们创建 GitHub 仓库来托管项目代码。

其中,我们用:

  • master 分支存储项目源代码
  • gh-pages 分支存储打包后的静态文件

gh-pages 分支,是 GitHub Pages 服务的固定分支,可以通过 HTTP 的方式访问到这个分支的静态文件资源。

创建 GitHub Token

创建一个有 repoworkflow 权限的 GitHub Token

注意:新生成的 Token 只会显示一次,保存起来,后面要用到。如有遗失,重新生成即可。

在仓库中添加 secret

将上面新创建的 Token 添加到 GitHub 仓库的 Secrets 里,并将这个新增的 secret 命名为 VUE3_DEPLOY (名字无所谓,看你喜欢)。
步骤:仓库 -> settings -> Secrets -> New repository secret。

新创建的 secret VUE3_DEPLOY 在 Actions 配置文件中要用到,两个地方需保持一致!

创建 Actions 配置文件

  1. 在项目根目录下创建 .github 目录。
  2. 在 .github 目录下创建 workflows 目录。
  3. 在 workflows 目录下创建 deploy.yml 文件。

deploy.yml 文件的内容:

yaml
name:
  deploy on:
    push:
      branches: [master] # master 分支有 push 时触发

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js v14.x
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: Install
        run: npm install # 安装依赖
      - name: Build
        run: npm run build # 打包
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3 # 使用部署到 GitHub pages 的 action
        with:
          publish_dir: ./dist # 部署打包后的 dist 目录
          github_token: ${{ secrets.VUE3_DEPLOY }} # secret 名
          user_name: ${{ secrets.MY_USER_NAME }}
          user_email: ${{ secrets.MY_USER_EMAIL }}
          commit_message: Update Vite2.x + Vue3.x + TypeScript Starter # 部署时的 git 提交信息,自由填写
name:
  deploy on:
    push:
      branches: [master] # master 分支有 push 时触发

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js v14.x
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: Install
        run: npm install # 安装依赖
      - name: Build
        run: npm run build # 打包
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3 # 使用部署到 GitHub pages 的 action
        with:
          publish_dir: ./dist # 部署打包后的 dist 目录
          github_token: ${{ secrets.VUE3_DEPLOY }} # secret 名
          user_name: ${{ secrets.MY_USER_NAME }}
          user_email: ${{ secrets.MY_USER_EMAIL }}
          commit_message: Update Vite2.x + Vue3.x + TypeScript Starter # 部署时的 git 提交信息,自由填写
  1. 检出代码。
  2. 设置 Node.js v14.x。
  3. 安装依赖。
  4. 构建(打包)应用。
  5. 使用 peaceiris/actions-gh-pages GitHub Action 部署打包后的内容到 GitHub Pages。

自动合并由 Dependabot 创建的拉取请求(PR)
Dependabot 是 GitHub 的一个官方机器人,它会自动检测项目中的依赖,当依赖有新版本时,会自动创建一个拉取请求(PR),并在 PR 中提供更新日志和 diff 信息,方便我们查看更新内容。
但是,Dependabot 创建的 PR 默认是不会自动合并的,需要我们手动点击合并,这样就会增加我们的工作量。
为了解决这个问题,我们可以使用 GitHub Actions 来自动合并 Dependabot 创建的 PR。

yaml
name: Dependabot Auto Merge
on:
  pull_request:
    types: [labeled, edited]

jobs:
  dependabot:
    name: Dependabot
    runs-on: ubuntu-latest
    permissions: write-all
    if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request'}}
    steps:
      - name: Enable auto-merge for Dependabot PRs
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: Dependabot Auto Merge
on:
  pull_request:
    types: [labeled, edited]

jobs:
  dependabot:
    name: Dependabot
    runs-on: ubuntu-latest
    permissions: write-all
    if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request'}}
    steps:
      - name: Enable auto-merge for Dependabot PRs
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
yaml
version: 2
updates:
  - package-ecosystem: 'npm' # See documentation for possible values
    directory: '/' # Location of package manifests
    schedule:
      interval: 'daily'
      timezone: 'Asia/Shanghai'
      time: '00:00'
version: 2
updates:
  - package-ecosystem: 'npm' # See documentation for possible values
    directory: '/' # Location of package manifests
    schedule:
      interval: 'daily'
      timezone: 'Asia/Shanghai'
      time: '00:00'

自动部署触发原理

当有新提交的代码 push 到 GitHub 仓库时,就会触发 GitHub Actions,在 GitHub 服务器上执行 Action 配置文件里面的命令,例如:安装依赖项目打包等,然后将打包好的静态文件部署到 GitHub Pages 上,最后,我们就能通过域名访问了。使用自动部署,我们只需专注于项目开发阶段,任何重复且枯燥的行为都交由程序去完成,懒才是程序员第一生产力。
事实上,自动部署只是 GitHub Actions 功能的冰山一角,GitHub Actions 能做的事还很多很多,大家感兴趣的话自行查阅。