CI/CD GitHub Action 自动化更新并重构建docker服务

颜熙云
2023-12-01

首次部署

  • 填写dokcer-compose.yml文件,配置NGINX、Mongo、Node服务等
  • 在对应位置存放项目文件,创建Dockerfile等配置文件

dokcer-compose.yml

version: "2"
services:
  nginxproxy:
    container_name: nginx-proxy
    restart: always
    image: nginx
    ports:
      - 443:443
      - 80:80
    volumes:
      - ./Nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./Nginx/conf:/etc/nginx/conf.d
      - ./Nginx/cert:/etc/nginx/cert
      - ./Nginx/log:/var/log/nginx
      - ./Projects/basePage:/usr/share/nginx/html
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
  webviewserver:
    container_name: webviewserver
    restart: always
    build: ./Projects/webview/server
    ports:
      - "3004:3004"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - ./Projects/webview/server:/server
  webview:
    container_name: webview
    restart: always
    image: nginx
    ports:
      - 10000:80
    volumes:
      - ./Projects/webview/html:/usr/share/nginx/html

Dockerfile

FROM keymetrics/pm2:latest-alpine
WORKDIR /server
EXPOSE 3000
CMD ["pm2-runtime", "start", "process.json"]

process.json

{
  "name": "serverName",
  "script": "./app.js",
  "exec_mode": "cluster",
  "instances": 1,
  "wait_ready": true,
  "listen_timeout": 10000,
  "kill_timeOut": 20000,
  "env": {
    "NODE_ENV": "pro",
  }
}

留意配置中映射的端口及运行的环境

GitHub Action

通过git的push tag命令将更新的代码自动更新至服务器,并重启docker使更新生效

  • 在项目中创建目录文件 /.github/workflows/main.yml
  • 提版触发

main.yml

name: Manage Publish With Dev # 自动部署的名称-云平台
on:
  push:
    tags: # 当我们提交代码为tag 是以'v'开头的时候才会触发自动部署到服务端 如 git push tag v0.1.0
      - 'mv*'
jobs:
  #c-server推送
  build-and-deploy:
    runs-on: ubuntu-latest # 运行环境,告诉它运行在什么环境
    steps: # 步骤

    # 第一步:下载源码(CI/CD拉取代码到自己的本地)
    - name: Checkout
      uses: actions/checkout@master
    
    # 对应项目目录,打包静态文件
    - name: Build
      uses: actions/setup-node@master
    - run: cd ./web/canteen && npm install # 安装第三方包
    - run: cd ./web/canteen && npm run build:dev # 打包

    # 文件传输
    - name: Deploy to webView      
      uses: AEnterprise/rsync-deploy@1.0.1  # 使用别人包装好的步骤镜像
      env:
        DEPLOY_KEY: ${{ secrets.SSH_PRIVATE_KEY }}   # 引用配置,SSH私钥
        ARGS: -avz --delete --exclude='*.pyc'   # rsync参数,排除.pyc文件
        SERVER_PORT: '${{ secrets.PORT }}'  # SSH端口
        FOLDER: ./web/canteen/dist/*  # 要推送的文件夹,路径相对于代码仓库的根目录
        SERVER_IP: ${{ secrets.HOST }}  # 引用配置,服务器的host名(IP或者域名domain.com)
        USERNAME: ${{ secrets.USERNAME }}  # 引用配置,服务器登录名
        SERVER_DESTINATION: /root/Projects/canteenmid/html/canteen   # 部署到目标文件夹
   
    # Server
    - name: Deploy to midServer      
      uses: AEnterprise/rsync-deploy@1.0.1  # 使用别人包装好的步骤镜像
      env:
        DEPLOY_KEY: ${{ secrets.SSH_PRIVATE_KEY }}   # 引用配置,SSH私钥
        ARGS: -avz --delete --exclude='*.pyc'   # rsync参数,排除.pyc文件
        SERVER_PORT: '${{ secrets.PORT }}'  # SSH端口
        FOLDER: ./web/server/*  # 要推送的文件夹,路径相对于代码仓库的根目录
        SERVER_IP: ${{ secrets.HOST }}  # 引用配置,服务器的host名(IP或者域名domain.com)
        USERNAME: ${{ secrets.USERNAME }}  # 引用配置,服务器登录名
        SERVER_DESTINATION: /root/Projects/canteenmid/server/   # 部署到目标文件夹

    # 第四步,重启docker服务
    - name: Deploy
      uses: appleboy/ssh-action@master # 使用ssh链接服务器
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        port: ${{ secrets.PORT }}
        script: | 
          cd /root
          ./script/update.sh canteenmid

触发方式

git tag  // 查询所有版本
git tag mv1.0.0 // 设定新版本版本号为1.0.0
git push origin mv1.0.0 // 提交1.0.0版本

update.sh 脚本文件 需根据自身不同的目录结构更改
作用:进入docker 容器中,平滑重启服务

CNAME=$1
main(){
    cd .. 
    cd Projects
    cd $CNAME
    cd server
    npm install
    cd /root
    docker exec -i $CNAME"server" /bin/sh -c "pm2 reload all && exit"
}
main
 类似资料: