最近在用 docusaurus 做一个文档网站,通过 GitHub Pages 进行部署,每次部署的时候,需要在本地执行构建命令,然后将构建产物提交到 GitHub 上面,比较麻烦。因此这边用了 GitHub Action 实现持续集成。
持续集成由很多操作组成,比如拉取代码、执行测试用例、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions 。
我们先来了解一下一些术语:
workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。step (步骤):每个 job 由多个 step 构成,一步步完成。action (动作):每个 step 可以依次执行一个或多个命令(action)。
workflow 文件
GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的 .github/workflows 目录。
workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为 .yml ,比如 deploy.yml 。一个库可以有多个 workflow 文件。GitHub 只要发现 .github/workflows 目录里面有 .yml 文件,就会自动运行该文件。
workflow 文件的配置字段非常多,这里列举一些基本字段。
name
name 字段是 workflow 的名称。
如果省略该字段,默认为当前 workflow 的文件名。
name: deploy for feature_dev
on
on 字段指定触发 workflow 的条件,通常是 push 、pull_request 。
指定触发事件时,可以限定分支或标签。
on:
push:
branches:
- mian
上面代码指定,只有 main 分支发生 push 事件时,才会触发 workflow 。
jobs
jobs 字段,表示要执行的一项或多项任务。其中的 runs-on 字段指定运行所需要的虚拟机环境。
runs-on: ubuntu-latest
steps
steps 字段指定每个 job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。
jobs.<job_id>.steps.name :步骤名称。jobs.<job_id>.steps.run :该步骤运行的命令或者 action。jobs.<job_id>.steps.env :该步骤所需的环境变量。
通过查看 官方 Actions 和 awesome-actions,找到所需的 Actions:
- Checkout: 从 Github 拉取仓库代码到 Github 服务器的
$GITHUB_WORKSPACE 目录下 - cache: 缓存 npm
- setup-node: 安装 Node 和 Npm 环境
- actions-gh-pages: 在 Github 上发布静态资源
可用的 Action 很多,这里只是设置了一个简单的流程
workflow 配置示例
下面放一下项目中的 .github/workflows/ci.yaml 文件:
name: Frontend Weekly
on:
push:
branches:
- main
jobs:
build_and_deploy:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
ref: main
- name: Cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 14
- name: Build
run: |
npm install yarn -g
yarn
yarn build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
publish_branch: gh-pages
full_commit_message: ${{ github.event.head_commit.message }}
参考
从零开始配置 TypeScript 项目
使用Docker Compose、Nginx、SSH和Github Actions实现前端自动化部署测试机
|