gitlabpublish

gitLab自动化部署

# 1. gitLab runner 文章资料

https://juejin.cn/post/7240662396021030970?searchId=20250518141743EBC241E25841E9296E0A https://juejin.cn/post/7017741051825750052?searchId=20250518141743EBC241E25841E9296E0A

https://zhuanlan.zhihu.com/p/184936276 备用地址: https://mp.weixin.qq.com/s?__biz=MzUzNjk5MTE1OQ==&mid=2247487611&idx=1&sn=4f17fce67502800329e466abe343cc3e&chksm=faec94a3cd9b1db550ef2fba8289281dff25dc861e1b835e682d871604252566142e61df12fb&mpshare=1&scene=24&srcid=0903vDJnTy61h2qazwfy4eIS&sharer_sharetime=1599094841693&sharer_shareid=f3eecc8b0741e2359b9d2e3440c468b3#rd

# 2. gitLab runner 变量

https://gitlab.cn/docs/jh/ci/variables/

# 3. gitLab CI/CD 自动化部署前端项目

https://juejin.cn/post/7261519520106774588?searchId=20250518141743EBC241E25841E9296E0A#heading-24

  • 3.1 部署前端静态文件到远程服务器
  • 3.1.1 本地工程根目录创建.gitlab-ci.yml 文件,配置如下:

# 3.1. 在项目的.gitlab-ci.yml 配置如下

image: node:18

stages:
  - init
  - build
  - deploy

# 定义变量写在项目中,实际上是全局变量配置,详情看3.1.2 , 这里注释
variables:
  REMOTE_USER: root # 远程服务器用户名
  SSH_PASSWORD: Ecs@2025 # 远程服务器密码
  SSH_HOST: 110.41.43.213 # 远程服务器IP
  REMOTE_PATH: /var/www/html # 远程服务器部署路径

cache:
  paths:
    - node_modules/
    - dist/

# before_script:
#   - npm install

init:
  stage: init
  script:
    - npm install
    - echo "init done"

build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/

deploy:
  stage: deploy
  script:
    - echo "deploy to server start" # 部署到远程服务器开始
    - apt-get update && apt-get install -y sshpass
    - sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no -r dist/* $SSH_USER@$SSH_HOST:$REMOTE_PATH
    - echo "deploy to server end" # 部署到远程服务器完成

    # 测试SSH连接(带详细调试信息)
    # - echo "$SSH_PASSWORD" | sshpass -d0 ssh -vvv -o StrictHostKeyChecking=no $SSH_USERNAME@$SSH_HOST "echo 'Connection test'"

    # # 创建目录
    # - echo "$SSH_PASSWORD" | sshpass -d0 ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$SSH_HOST "mkdir -p $DEPLOY_PATH"

    # # 部署文件
    # - echo "$SSH_PASSWORD" | sshpass -d0 rsync -avz --delete --progress dist/ $SSH_USERNAME@$SSH_HOST:$DEPLOY_PATH

    # # 可选:重启Nginx
    # - echo "$SSH_PASSWORD" | sshpass -d0 ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$SSH_HOST "nginx -s reload || systemctl restart nginx"
  only:
    - main
  • 3.1.2 gitlab 环境变量配置注意事项 gitlab 环境变量配置CI/CD variables

# 4. gitlab 自动化部署后端 node 项目

# 4.1. gitlab-ci.yml 配置文件

.gitlab-ci.yml

image: node:18

stages:
  - deploy

cache: # 缓存
  paths:
    - node_modules

deploy:
  stage: deploy
  image: ringcentral/sshpass:latest # 这行设置了以后无法使用apt-get安装软件
  script:
    # - apt-get update && apt-get install -y sshpass  rsync
    - ls -la
    - pwd
    # 1、自动信任主机,执行远程服务器的 "pwd; ls",正好可以查看服务器目录、文件是否正常
    - sshpass -p $SSH_PASSWORD ssh -o StrictHostKeyChecking=no $SSH_USER@$SSH_HOST "pwd;ls;"

    # 2 查看远程服务器是否有 node-project 目录,如果没有就创建
    - sshpass -p $SSH_PASSWORD ssh $SSH_USER@$SSH_HOST "mkdir -p /var/www/node-project;"

    # 3 copy 当前项目package.json deploy.sh  app.mjs到服务器上的 /root/node-project 目录
    - sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no -rv package.json deploy.sh  app.mjs $SSH_USER@$SSH_HOST:/var/www/node-project/

    # 3 使用rsync权限不足
    # - rsync -avz --delete \
    #   --exclude='dist' \
    #   --exclude='.git' \
    #   --exclude='node_modules' \
    #   -e sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no -rv . $SSH_USER@$SSH_HOST:/var/www/node-project/

    - ls -la

    # 4. 安装依赖
    - sshpass -p $SSH_PASSWORD ssh $SSH_USER@$SSH_HOST  "cd /var/www/node-project && npm install"

    # 5、执行部署脚本
    - sshpass -p $SSH_PASSWORD ssh $SSH_USER@$SSH_HOST 'bash -s' < ./deploy.sh

    # 6、查看服务器是否有node进程
    - sshpass -p $SSH_PASSWORD ssh $SSH_USER@$SSH_HOST "ps aux | grep '[n]ode app.mjs'"
  only:
    - pre

# 4.2. 部署脚本 deploy.sh

echo "=== 启动应用 ==="

cd /var/www/node-project

# npm install

pm2 start app.mjs --name node-project
pm2 save
pm2 startup
pm2 save
pm2 list

ps aux | grep '[n]ode app.mjs'

# nohup node app.mjs

echo "应用已启动,PID: $!"

exit 0

# 5. 阿里云配置. github action 上传前端文件

文章地址 (opens new window)

# 5.1. 命令工具部署就是将本地 build 构建 和 FTP 文件上传,直接通过程序来实现。例如我们通过 gitlab 的 CI/CD 工具 或 github action 上传前端文件。

下面代码未验证

# .github/workflows/main.yml
# name: deploy to aliyun
on:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 切换分支
      - name: Checkout
        uses: actions/checkout@master
      - name: work around permission issue
        run: git config --global --add safe.directory /github/workspace
      # 使用 node:10
      - name: use Node.js 10
        uses: actions/setup-node@v1
        with:
          node-version: 10
      # npm install 同时 build 打包
      - name: npm install and build
        run: |
          npm install
          npm run build
        env:
          CI: true
      # Deploy 上传到阿里云, secrets.ACCESS_TOKEN为配置token
      - name: Deploy aliyun
        uses: easingthemes/ssh-deploy@v2.0.7
        env:
          SSH_PRIVATE_KEY: ${{ secrets.ACCESS_TOKEN }}
          ARGS: "-avz --delete"
          SOURCE: "./docs/.vuepress/dist/"
          REMOTE_HOST: "47.111.149.160"
          REMOTE_USER: "root"
          TARGET: "/var/www/HerryLo.github.io"
上次更新: