如何编写GitLab Pipeline脚本实现EC2上Node.js项目自动部署?
GitLab CI/CD 自动部署 Node.js 后端到 AWS EC2
前置准备(EC2 端)
用 systemd 管理 Node.js 服务
创建服务配置文件(替换成你的实际信息):# /etc/systemd/system/your-app.service [Unit] Description=Node.js Express Backend After=network.target [Service] User=ec2-user # 你的EC2登录用户,如ubuntu/ec2-user WorkingDirectory=/home/ec2-user/your-backend # 项目部署目录 ExecStart=/usr/bin/node server.js # 项目入口文件 Restart=always Environment=NODE_ENV=production # 如需添加环境变量,可继续添加 Environment=KEY=VALUE [Install] WantedBy=multi-user.target执行命令生效:
sudo systemctl daemon-reload sudo systemctl enable your-app预克隆项目并配置权限
在EC2上克隆你的GitLab项目到指定目录:cd /home/ec2-user git clone git@gitlab.com:your-username/your-project.git your-backend确保部署密钥已配置正确,EC2能无密码拉取GitLab代码。
配置免密 sudo
编辑sudoers文件,让EC2用户能免密重启服务:sudo visudo添加一行(替换用户名和服务名):
ec2-user ALL=(ALL) NOPASSWD: /bin/systemctl restart your-app
GitLab CI/CD 配置文件(.gitlab-ci.yml)
直接在项目根目录创建该文件,内容如下:
stages: - deploy deploy_to_ec2: stage: deploy only: - main # 仅推送main分支时触发 script: # 连接EC2拉取最新代码 - ssh -o StrictHostKeyChecking=no ec2-user@your-ec2-public-ip "cd /home/ec2-user/your-backend && git pull origin main" # 安装生产依赖(如有更新) - ssh ec2-user@your-ec2-public-ip "cd /home/ec2-user/your-backend && npm install --production" # 重启服务生效新代码 - ssh ec2-user@your-ec2-public-ip "sudo systemctl restart your-app" tags: - ssh # 确保使用支持SSH的Runner,共享Runner需有此标签,自托管Runner可自定义
关键配置说明
SSH 密钥管理
在GitLab项目的「Settings → CI/CD → Variables」中添加SSH_PRIVATE_KEY变量,值为能SSH到EC2的私钥(注意是私钥内容,不是路径),勾选「Protect variable」和「Mask variable」保证安全。安全组设置
确保EC2安全组允许SSH(22端口)访问,若使用GitLab共享Runner,可临时开放0.0.0.0/0(不推荐),或限制GitLab官方Runner的IP段。可选优化
- 若项目需要构建步骤(如TypeScript编译),可添加
build阶段,在Runner上完成构建后再同步到EC2。 - 可添加健康检查脚本,在重启服务后验证服务是否正常启动。
- 若项目需要构建步骤(如TypeScript编译),可添加
内容的提问来源于stack exchange,提问作者Dejan Milić
相关产品推荐
相关产品推荐

