目的
了解CI/CD,通过Github Actions实践CI/CD
基本概念
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。其核心概念是持续集成、持续交付和持续部署。
了解背景
在大型的开源项目中,如果每天将当日push的所有代码手动进行code review,构建,部署,这种交付方式是十分耗时且效率低下的,并且缺乏可见性,无法得知错误发生的位置和原因。
所以需要一个服务让开发者在频繁提交代码的情况下能够保证代码质量,从而进行自动构建,部署。所有有了CI/CD的概念。
CI(持续集成)
持续集成是一种需要频繁提交代码到共享仓库的软件实践。
优点:
- 快速发现错误,错误定位也比较准确
- 防止分支大幅落后主干,之后难以集成
CD(持续交付/持续部署)
持续交付:一种软件工程方法团队可以在短时间内将软件部署到生产环境,确保在任何时候可靠地发布软件
持续部署:持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
Github Action是什么?
Github Actions是由Github创建的 CI/CD服务。它的目的使所有软件开发工作流程的自动化变得容易。它提供了虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目。CI提供了许多操作,例如抓取代码,运行测试,发布到第三方服务等操作,这些操作称为actions。
基本概念
- workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。(可以理解为一个配置文件就是一个workflow)
- job (任务):一个 workflow 可以有一个或多个 jobs,可以按顺序亦可并行执行。
- step(步骤):每个 job 由多个 step 构成,一步步完成。
- action (动作):每个 step 可以依次执行一个或多个命令(action)。

workflow配置文件规范
Github Actions通过配置文件(存放在代码仓库的.github/workflows目录中)创建工作流程,该文件采用YAML格式,文件名随意,但后缀名为.yml,比如deploy.yml。GitHub 会根据设置的不同触发条件去执行对应的.yml文件。
配置文件的字段可查看此链接
基于公司生产环境为例的workflow
name: master CI
on:
# 在push的分支为master的时候触发
push:
branches: [ master ]
jobs:
# 构建任务
build:
# 必写配置:虚拟机环境
runs-on: ubuntu-latest
steps:
# 拉取代码
- uses: actions/checkout@v2
- name: use nodeJs
uses: actions/setup-node@v1
with:
# 定义node版本
node-version: '12.x'
- name: install dependencies
# 生产环境用npm ci更快,条件:1. package-lock.json必须存在 2. package-lock.json 和 package.json需要匹配
run: npm ci
# --if-present 代表仅运行存在的脚本
# 执行构建命令
- run: npm run build:prod --if-present
# 执行测试命令
- run: npm run test
env:
CI: true
# 部署任务
deploy:
# 部署任务需要依赖build任务,决定了执行顺序,否则就是并行执行
needs: [build]
runs-on: ubuntu-latest
- name: Deploy
# 执行构建脚本
run: |
export PROJECT_DIR=(echo{PROJECT_DIR} | base64 -d)
echo {PROJECT_DIR}
sh{PROJECT_DIR}/deploy.sh
tar zxvf ${PROJECT}