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
https://gitlab.cn/docs/jh/ci/variables/
https://juejin.cn/post/7261519520106774588?searchId=20250518141743EBC241E25841E9296E0A#heading-24
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

.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
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
下面代码未验证
# .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"