Github actions

中文文档

代码在项目的.github/workflows目录下,.yml格式文件。

应用场景

  • master分支,自动化测试
  • dev分支,自动部署到测试机
  • v*.*.*格式的tag,自动上线(支持回滚)

代码演示

触发条件on

  • push
  • branches
  • paths

任务jobs

步骤steps,可自定义,也可使用第三方

# 直接使用 uses 第三方
- uses: actions/checkout@v2 #git pull

# 使用 name 和 uses 第三方
- name: Use Node.js
  uses: actions/setup-node@v1
  with:
    node-version: 14

# 使用 name 和 run
- name: lint and test
  run: |
    npm i
    npm run lint
    npm run test

# 直接使用 run
- run: npm i
- run: npm run lint
- run: npm run test

操作

新建workflow

新建deno.yml

name: Deno

on:
  push:
    branches: #分支
      - main
    paths: #触发条件
      - '.github/workflows/**'
      # - '__test__/**' # dev 不需要立即测试
      - 'src/**'

jobs:
  test:
    runs-on: ${{ matrix.os }} # runs a test on Ubuntu, Windows and macOS

    strategy:
      matrix:
        deno: ["v1.x", "nightly"]
        os: [macOS-latest, windows-latest, ubuntu-latest]

    steps:
      - uses: actions/checkout@v2
      - name: print node version
        run: |  #执行自定义命令
          node -v
          npm -v

当我们执行git push的时候,推送到github,在Actions里面我们可以看到我们推送的内容,这时候状态未未执行,有个黄色小圆点,当正在执行的时候是一个loading的小圆点,执行成功为对勾,失败为红色叉。

如果失败,请查看失败说明。

Docker

介绍

Docker就是一种虚拟机技术,比传统虚拟机(如vmware,virtualbox)要更加简单,轻量

  • 启动快
  • 资源占用少
  • 体积小

安装

文档

安装完记得镜像加速

安装完,运行docker version可查看版本

基本概念

使用vmware、virtualbox时,步骤如下

  • 下载一个centos.iso文件
  • 使用vmwaire安装一个系统A
  • 使用vmwaire安装一个系统B
  • ......

此处的centos.iso文件就是一个image镜像,安装出来的系统就是一个一个的container容器。

docker的所有image都可以在https://hub.docker.com/搜索并下载,还可以自定义image上传到这个仓库

常用命令

如果没有安装,可以在play with docker体验一下。

image镜像

  • 下载镜像docker pull <image-name>:<tag>
  • 查看所有镜像docker images
  • 删除镜像docker rmi <image-id>
  • 上传镜像docker push <username>/<respository>:<tag>,要先注册https://hub.docker.com/

如果docker images出现REPOSITORY是<none>的情况,可以运行docker image prune删除。

container

  • 启动容器docker run -p xxxx:xxxx -v=hostPath:containerPath -d --name <container-name><image-name>

    • -p端口映射
    • -v数据卷,文件映射
    • -d后台运行
    • --name定义容器名称
  • 查看所有容器docker ps,加-a显示隐藏的容器

  • 停止容器docker stop <container-id>
  • 删除容器docker rm <container-id>,加-f是强制删除
  • 查看容器信息,如IP地址docker inspect <container-id>
  • 查看容器日志docker logs <container-id>
  • 进入容器控制台docker exec -it <container-id> /bin/sh

功能演示

以nginx为例

docker run -p 81:80 -d --name nginx1 nginx
docker ps

# 访问 localhost:81 ,并查看 log

docker exec -it <container-id> /bin/sh
cd /usr/share/nginx/html
echo hello docker world index.html
exit

# 重新访问 localhost:81 ,强制刷新

docker stop <container-id>
docker rm <container-id>

单独演示一下-v数据卷。

# 1. 新建 /Users/wfp/html/index.html ,内容自定义即可

# 2. 运行
docker run -p 81:80 -v=/Users/wfp/html:/usr/share/nginx/html  -d --name nginx1 nginx

# 3. 访问 重新访问 localhost:81 ,看是否你创建的页面?

Dockerfile

一个简单的配置文件,描述如何构建一个新的image镜像

注意:必须是Dockerfile这个文件名,必须在项目的根目录

# node环境
FROM node:14
WORKDIR /app
COPY . /app

# 构建镜像时,一般用于做一些系统配置,安装必备的软件。可有多个 RUN
RUN xxx
RUN xxx
RUN xxx

# 启动容器时,只能有一个 CMD
CMD xxx

# 环境变量
ENV K1=v1
ENV K2=v2

构建

文件根目录执行

docker build -t <name> . # 最后的 `.` 指 Dockerfile 在当前目录下。
docker images

代码演示

  • .dockerignore文件忽略
.git
node_modules
logs
.docker-volumes
  • Dockerfile文件
# Dockerfile
FROM node:14
WORKDIR /app
COPY . /app

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

# 安装
RUN npm set registry https://registry.npm.taobao.org
RUN npm install
RUN npm install pm2 -g

# 启动
CMD echo $SERVER_NAME && echo $AUTHOR_NAME &&npm run server && npx pm2 log #一定要是阻塞控制台的程序

# 环境变量
ENV SERVER_NAME="tanchidemao"
ENV AUTHOR_NAME="roy"
  • 本地安装pm2 npm i pm2 --save-dev,或者Dockerfile中全局安装pm2

测试过程:

docker build -t editor-server .  # 构建 image
docker images

docker run -p 8081:3000 -d --name server1 editor-server  # 创建容器,注意端口映射
docker ps
docker logs <container-id>  # 需等待构建完成

# 访问 localhost:8081 ,查看 docker logs

docker stop <container-id>
docker rm <container-id>
docker rmi <image-id>

Docker-compose

软件设计和开发,有单一职责原则。Docker也一样,每个容器都只负责一个服务。

如果开发环境需要多个服务(nodejs mysql mongodb redis),就需要启动多个Docker容器。

要连同这多个Docker容器,就需要Docker-compose。

配置文件

新建docker-compose.yml文件。先以redis为例,演示多个容器如何关联。

version: '3'
services:
    editor-server:  # service name
        build:
            context: .  # 当前目录
            dockerfile: Dockerfile  # 基于 Dockerfile 构建
        image: editor-server # 依赖于当前 Dockerfile 创建出来的镜像
        container_name: editor-server
        ports:
            - 8081:3000 # 宿主机通过 8081 访问
    editor-redis:  # service name,重要!
        image: redis  # 引用官网 redis 镜像
        container_name: editor-redis
        ports:
            # 宿主机,可以用 127.0.0.1:6378 即可连接容器中的数据库 `redis-cli -h 127.0.0.1 -p 6378`
            # 但是,其他 docker 容器不能,因为此时 127.0.0.1 是 docker 容器本身,而不是宿主机
            - 6378:6379
        environment:
            - TZ=Asia/Shanghai # 设置时区

命令

  • 构建容器docker-compose build <service-name>
  • 启动所有服务器docker-compose up -d,后台启动
  • 停止所有服务docker-compose down
  • 查看服务docker-compose ps
docker-compose build editor-server # 配置文件的 service name
docker-compose up -d
docker-compose ps

# 访问 localhost:8081 ,查看 docker logs

docker-compose down

链接Mysql和Mongodb

成功连接redis之后,要继续连接mysql和mongodb

区别

  • redis无数据看,而mysql和mongodb需要创建数据库
  • redis是缓存,无序数据持久化,而mysql和mongodb需要

代码修改

  • 修改docker-compose.yml,代码如下
version: '3'
services:
    editor-server:  # service name
        build:
            context: .  # 当前目录
            dockerfile: Dockerfile  # 基于 Dockerfile 构建
        image: editor-server # 依赖于当前 Dockerfile 创建出来的镜像
        container_name: editor-server
        ports:
            - 8081:3000 # 宿主机通过 8081 访问
    editor-redis:  # service name,重要!
        image: redis  # 引用官网 redis 镜像
        container_name: editor-redis
        ports:
            # 宿主机,可以用 127.0.0.1:6378 即可连接容器中的数据库 `redis-cli -h 127.0.0.1 -p 6378`
            # 但是,其他 docker 容器不能,因为此时 127.0.0.1 是 docker 容器本身,而不是宿主机
            - 6378:6379
        environment:
            - TZ=Asia/Shanghai # 设置时区

    editor-mysql:
        image: mysql # 引用官网 mysql 镜像
        container_name: editor-mysql
        restart: always # 出错则重启
        privileged: true # 高权限,执行下面的 mysql/init
        command: --default-authentication-plugin=mysql_native_password # 远程访问
        ports:
            - 3305:3306 # 宿主机可以用 127.0.0.1:3305 即可连接容器中的数据库,和 redis 一样
        volumes:
            - .docker-volumes/mysql/log:/var/log/mysql  # 记录日志
            - .docker-volumes/mysql/data:/var/lib/mysql # 数据持久化
            - ./mysql/init:/docker-entrypoint-initdb.d/ # 初始化 sql
        environment:
            - MYSQL_DATABASE=imooc_lego_course # 初始化容器时创建数据库
            - MYSQL_ROOT_PASSWORD=Mysql_2019
            - TZ=Asia/Shanghai # 设置时区
    editor-mongo:
        image: mongo # 引用官网 mongo 镜像
        container_name: editor-mongo
        restart: always
        volumes:
            - '.docker-volumes/mongo/data:/data/db' # 数据持久化
        environment:
            - MONGO_INITDB_DATABASE=imooc_lego_course
            - TZ=Asia/Shanghai # 设置时区
        ports:
            - '27016:27017' # 宿主机可以用 127.0.0.1:27016 即可连接容器中的数据库
  • 增加mysql/init/init.sql,初始化mysql
-- docker-compose 启动 mysql 时的初始化代码

select "init start...";

-- 设置 root 用户可外网访问
use mysql;
SET SQL_SAFE_UPDATES=0; -- 解除安全模式,测试环境,没关系
update user set host='%' where user='root';
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Mysql_2019'; -- 密码参考 docker-compose.yml
flush privileges;

select "init end...";
  • 修改config/envs/prd-dev.js,增加mysql和mongodb的配置
const devConf = require('./dev');

//修改redis连接配置
Object.assign(devConf.redisConf, {
  //和docker-compose中配置的service名字一致
  //【注意】端口依然是6379,而不是6378,后者是宿主机的端口
  host: 'editor-redis'
});

//修改mongodb连接配置
Object.assign(devConf.mongodbConf,{
  host: 'editor-mongo',//和docler-compose中配置的service名字一致
});

//修改mysql连接配置
Object.assign(devConf.mysqlConf,{
  host: 'editor-mysql',//和docler-compose中配置的service名字一致
});
  • 修改.gitignore文件,增加一行.docker-volumes

演示

docker-compose build editor-server # 配置文件的 service name
docker-compose up -d
docker-compose ps

# 访问 localhost:8081 ,查看 docker logs

docker-compose down

配置测试机

创建work账号

处于安全考虑,日常不会用root账号登录,权限太高了。

用root登录,创建work账号

adduser work
passwd work

添加work的sudo权限

whereis sudoers # 找到文件位置 /etc/sudoers

chmod u+w /etc/sudoers # 修改权限, u 表示所有者, w 表示写权限 + 表示添加

vim /etc/sudoers # 编辑该文件
# 找到     `root    ALL=(ALL)       ALL`
# 再加一行  `work    ALL=(ALL)       ALL`

chmod u-w /etc/sudoers

然后使用work登录机器。输入su,在输入root账号的密码,即可拥有超级权限。

登录信任

使用work登录机器,创建~/.ssh/authorized_keys文件。

# 修改文件夹权限
chmod 700  ~/.ssh
chmod 600  ~/.ssh/authorized_keys

将本机的id_rsa.pub内容粘贴进来。

退出重新用work登录,将不用在输入密码。

安装必备软件

以下都需要su权限

git

yum -y install git
git --version

docker

docker version
docker-compose --version

开放端口

开放需要的端口,否则外网无法访问该端口

  • B端 FE - 80
  • B端 server - 8081
  • C端 - 8082
  • 统计服务,收集日志 - 8083
  • 统计服务 OpenAPI - 8080
  • admin FE - 8085
  • admin server - 8084

发布到测试机

梳理思路

  • 使用github actions监听dev分支push
  • 登录测试机,获取最新dev分支代码
  • 重新构建镜像docker-compose build editor-server
  • 重启所有容器docker-compose up -d

代码演示

新建deploy-dev.yml内容如下:

name: deploy for dev

on:
    push:
        branches:
            - 'dev' # 只针对 dev 分支
        paths:
            - '.github/workflows/*'
            # - '__test__/**' # dev 不需要立即测试
            - 'src/**'
            - 'Dockerfile'
            - 'docker-compose.yml'
            - 'bin/*'

jobs:
    deploy-dev:
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v2
            - name: set ssh key # 临时设置 ssh key
              run: |
                  mkdir -p ~/.ssh/
                  # secrets.WFP_ID_RSA github里面设置的
                  echo "${{secrets.WFP_ID_RSA}}" > ~/.ssh/id_rsa
                  chmod 600 ~/.ssh/id_rsa
                  ssh-keyscan "182.92.xxx.xxx" >> ~/.ssh/known_hosts
            - name: deploy # 部署
              run: |
                  ssh work@182.92.xxx.xxx "
                    # 【注意】用 work 账号登录,手动创建 /home/work/imooc-lego 目录
                    # 然后 git clone https://username:password@github.com/imooc-lego/biz-editor-server.git -b dev (私有仓库,使用 github 用户名和密码)
                    # 记得删除 origin ,否则会暴露 github 密码

                    cd /home/work/imooc-lego/biz-editor-server;
                    git remote add origin https://wangfupeng1988:${{secrets.WFP_PASSWORD}}@github.com/imooc-lego/biz-editor-server.git;
                    git checkout dev;
                    git pull origin dev; # 重新下载最新代码
                    git remote remove origin; # 删除 origin ,否则会暴露 github 密码
                    # 启动 docker
                    docker-compose build editor-server; # 和 docker-compose.yml service 名字一致
                    docker-compose up -d;
                  "
            - name: delete ssh key # 删除 ssh key
              run: rm -rf ~/.ssh/id_rsa

远程接口测试

待测试机部署完成,即可进行远程接口测试npm run test:remote,即test.yml的内容

注意,一定要等待测试机部署完成,否则测试不通过

Copyright © imooc-lego (2020 - present) all right reserved,powered by GitbookFile Modify: 2021-06-27 08:04:56

results matching ""

    No results matching ""