这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
前端需要知道的CI / CD知识不完全指北(二)
本系列主要介绍 利用Git Action 实现 CI/CD 流程, 涉及到的知识点包括
CI/CD
Github actions
Docker Docker-compose
, 实现使用Github action Docker / Docker compose 自动发布代码到测试机
如何使用 Github Actions 做自动化测试?
# /.github/workflows/test.yml
# 自动化测试
name: test
on: # 触发条件
push: # 项目 git push 的时候触发
branches: [ master ] # 在 master 分支 push的时候触发
paths: # [触发条件] push的文件在这个范围之内触发
- '.github/workflows/**'
- '__test__/**'
- 'src/**'
jobs: # 任务
test: # 任务1 test
runs-on: ubuntu-latest # 在 ubuntu系统的基础上运行
steps: # 步骤 steps, 可自定义也可以使用第三方
# Step 1 直接使用 uses 第三方,
- uses: actions/checkout@v2 # 意思是 git pull 获取当前最新代码
# Step 2 使用 name 和 uses 第三方
- name: Use Node.js # name: step 名称
uses: actions/setup-node@v1 # 第三方 actions , 安装nodejs并指定版本号
with:
node-version: 16
# Step 3 使用 name
- name: Lint and test
run: | # RUN 自定义的命令
npm i
npm run lint
npm run test:remote
失败如何处理
点击re-rull all jobs 重新执行
测试流程
- pre-commit 时执行本地接口测试 npm run test:local
- master push 时执行远程接口测试 npm run test:remote
Github Actions部署文件到服务器
在服务器生成秘钥
配置 env 变量
ssh-keygen -m PEM -t rsa -b 4096
配置 TARGETREMOTE_HOST
REMOTE_USER
REMOTE_PORT
ARGS
SOURCE``EXCLUDE
Use the latest version from Marketplace,eg: ssh-deploy@v2 or use the latest version from a branch, eg: ssh-deploy@main
- name: Deploy to Staging server
uses: easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
ARGS: "-rltgoDzvO"
SOURCE: "dist/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
EXCLUDE: "/dist/, /node_modules/"
示例
name: Node CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Install Node.js
uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: Install npm dependencies
run: npm install
- name: Run build task
run: npm run build --if-present
- name: Deploy to Server
uses: easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
ARGS: "-rltgoDzvO --delete"
SOURCE: "dist/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
EXCLUDE: "/dist/, /node_modules/"