如何无需GitLab Runner,通过gitlab-ci.yml在远程服务器自动部署?
无需GitLab Runner实现Docker-Compose自动部署方案
核心思路
直接借助GitLab CI的SSH远程执行能力,在流水线中建立与目标Ubuntu服务器的无密码SSH连接,拉取最新代码并执行docker-compose命令完成部署,无需在服务器上部署GitLab Runner。
具体步骤
1. 目标Ubuntu服务器配置SSH免密访问
- 生成SSH密钥对(无则创建):
全程回车默认生成私钥ssh-keygen -t ed25519 -C "gitlab-ci-deploy"~/.ssh/id_ed25519和公钥~/.ssh/id_ed25519.pub。 - 将公钥添加到服务器授权列表,确保无密码登录权限:
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh - 测试本地(或任意环境)能否无密码登录服务器:
ssh -i ~/.ssh/id_ed25519 你的服务器用户名@你的服务器IP
2. GitLab项目配置CI/CD安全变量
进入GitLab项目的Settings > CI/CD > Variables,添加以下变量(勾选「Protect variable」和「Mask variable」保障安全):
SSH_PRIVATE_KEY:填入上述生成的SSH私钥完整内容(即~/.ssh/id_ed25519文件内的文本)SERVER_IP:目标Ubuntu服务器的IP地址SERVER_USER:服务器上用于登录的用户名PROJECT_PATH:项目在服务器上的存放路径(例如/opt/your-project)
3. 编写.gitlab-ci.yml部署脚本
在项目根目录创建该文件,内容如下:
stages: - deploy deploy: stage: deploy image: alpine:latest before_script: # 安装SSH、Git、Docker-Compose依赖 - apk add --no-cache openssh-client git docker-compose # 配置SSH免密登录环境 - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - ssh-keyscan -H $SERVER_IP >> ~/.ssh/known_hosts script: # 远程执行部署命令:拉取代码、重启服务 - ssh $SERVER_USER@$SERVER_IP " if [ ! -d $PROJECT_PATH ]; then git clone git@gitlab.com:你的用户名/你的项目名.git $PROJECT_PATH; else cd $PROJECT_PATH && git pull origin main; fi && cd $PROJECT_PATH && docker-compose down && docker-compose up -d --build " only: - main # 仅在main分支推送代码时触发部署
4. 验证部署流程
- 将代码推送到GitLab的main分支
- 进入GitLab项目的CI/CD > Pipelines查看作业执行状态
- 登录服务器检查容器运行状态:
docker-compose ps -a
注意事项
- 确保目标服务器已预先安装
git、docker和docker-compose - 若项目为私有仓库,需在服务器上配置Git SSH密钥,或改用HTTPS拉取(需配置Git凭证)
- 生产环境建议限制该SSH用户的命令执行权限,仅允许部署相关操作
- 可在部署脚本中添加数据库备份步骤,避免数据丢失
内容的提问来源于stack exchange,提问作者nikolardlvc
相关产品推荐
相关产品推荐

