到了这一步,我们已经在项目中集成代码规范约束、提交信息规范约束,单元测试约束,从而保证我们远端仓库(如 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
创建一个有 repo 和 workflow 权限的 GitHub Token
注意:新生成的 Token 只会显示一次,保存起来,后面要用到。如有遗失,重新生成即可。
在仓库中添加 secret
将上面新创建的 Token 添加到 GitHub 仓库的 Secrets 里,并将这个新增的 secret 命名为 VUE3_DEPLOY (名字无所谓,看你喜欢)。
步骤:仓库 -> settings -> Secrets -> New repository secret。
新创建的 secret VUE3_DEPLOY 在 Actions 配置文件中要用到,两个地方需保持一致!
创建 Actions 配置文件
- 在项目根目录下创建 .github 目录。
- 在 .github 目录下创建 workflows 目录。
- 在 workflows 目录下创建 deploy.yml 文件。
deploy.yml 文件的内容:
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 提交信息,自由填写
- 检出代码。
- 设置 Node.js v14.x。
- 安装依赖。
- 构建(打包)应用。
- 使用 peaceiris/actions-gh-pages GitHub Action 部署打包后的内容到 GitHub Pages。
自动合并由 Dependabot 创建的拉取请求(PR)
Dependabot 是 GitHub 的一个官方机器人,它会自动检测项目中的依赖,当依赖有新版本时,会自动创建一个拉取请求(PR),并在 PR 中提供更新日志和 diff 信息,方便我们查看更新内容。
但是,Dependabot 创建的 PR 默认是不会自动合并的,需要我们手动点击合并,这样就会增加我们的工作量。
为了解决这个问题,我们可以使用 GitHub Actions 来自动合并 Dependabot 创建的 PR。
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 }}
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 能做的事还很多很多,大家感兴趣的话自行查阅。