在现代软件开发中,自动化部署已成为提高开发效率和保证部署质量的关键环节。本文将详细介绍如何使用 GitLab 实现代码的自动部署到服务器。
确保目标服务器已安装:
在项目根目录创建 .gitlab-ci.yml 文件,这是 GitLab CI/CD 的核心配置文件。
# .gitlab-ci.yml
stages:
- test
- deploy
# 测试阶段
test:
stage: test
script:
- echo "Running tests..."
# 这里添加你的测试命令,例如:
# - npm test
# - pytest
# - mvn test
only:
- main
- develop
# 部署到生产环境
deploy_production:
stage: deploy
script:
- echo "Deploying to production server..."
- chmod 400 $SSH_PRIVATE_KEY
- ssh -o StrictHostKeyChecking=no -i $SSH_PRIVATE_KEY $SERVER_USER@$SERVER_IP "cd $PROJECT_PATH && git pull origin main && $DEPLOY_COMMANDS"
only:
- main
when: manual # 设置为手动触发,生产环境部署建议谨慎
# 部署到测试环境
deploy_staging:
stage: deploy
script:
- echo "Deploying to staging server..."
- chmod 400 $STAGING_SSH_PRIVATE_KEY
- ssh -o StrictHostKeyChecking=no -i $STAGING_SSH_PRIVATE_KEY $STAGING_SERVER_USER@$STAGING_SERVER_IP "cd $STAGING_PROJECT_PATH && git pull origin develop && $STAGING_DEPLOY_COMMANDS"
only:
- develop对于更复杂的部署场景,可以使用专门的部署脚本:
deploy_advanced:
stage: deploy
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $SERVER_IP >> ~/.ssh/known_hosts
script:
- |
ssh $SERVER_USER@$SERVER_IP << EOF
set -e
cd $PROJECT_PATH
echo "Pulling latest code..."
git fetch --all
git reset --hard origin/main
echo "Installing dependencies..."
npm install # 或 pip install -r requirements.txt, mvn install 等
echo "Building application..."
npm run build # 或相应的构建命令
echo "Restarting application..."
pm2 restart my-app # 或 systemctl restart your-service
echo "Deployment completed successfully!"
EOF
only:
- main
environment:
name: production
url: https://your-domain.com在 GitLab 项目设置中配置 CI/CD 变量,避免将敏感信息硬编码在配置文件中:
SSH_PRIVATE_KEY:服务器 SSH 私钥SERVER_IP:服务器 IP 地址SERVER_USER:服务器用户名PROJECT_PATH:项目在服务器上的路径DEPLOY_COMMANDS:部署命令(如:npm install && npm run build && pm2 restart app)# 在服务器上创建部署专用用户
sudo adduser deployer
sudo usermod -aG sudo deployer # 如果需要 sudo 权限
# 切换到部署用户
su - deployer# 在服务器上生成 SSH 密钥对
ssh-keygen -t rsa -b 4096 -C "gitlab-deployer"
# 将公钥添加到 authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 将私钥内容复制到 GitLab 的 SSH_PRIVATE_KEY 变量中
cat ~/.ssh/id_rsa# 克隆项目
git clone https://gitlab.com/your-username/your-project.git
cd your-project
# 设置 Git 配置(如果需要)
git config --global user.email "deployer@example.com"
git config --global user.name "Deployer"deploy_blue_green:
stage: deploy
script:
- |
# 确定当前环境(蓝或绿)
CURRENT_COLOR=$(ssh $SERVER_USER@$SERVER_IP "cd $PROJECT_PATH && cat current_color 2>/dev/null || echo 'blue'")
# 确定目标环境
if [ "$CURRENT_COLOR" = "blue" ]; then
TARGET_COLOR="green"
TARGET_PATH="$PROJECT_PATH/green"
else
TARGET_COLOR="blue"
TARGET_PATH="$PROJECT_PATH/blue"
fi
# 部署到目标环境
ssh $SERVER_USER@$SERVER_IP "
set -e
echo 'Deploying to $TARGET_COLOR environment...'
# 准备目标目录
mkdir -p $TARGET_PATH
cd $TARGET_PATH
# 克隆或更新代码
if [ -d .git ]; then
git pull origin main
else
git clone $CI_REPOSITORY_URL .
fi
# 安装依赖和构建
npm install
npm run build
# 切换流量(这里以 Nginx 为例)
sudo cp $TARGET_PATH/nginx-config-$TARGET_COLOR.conf /etc/nginx/sites-available/your-site
sudo nginx -s reload
# 更新当前环境记录
echo '$TARGET_COLOR' > $PROJECT_PATH/current_color
echo 'Deployment to $TARGET_COLOR environment completed!'
"
only:
- maindeploy_docker:
stage: deploy
script:
- |
ssh $SERVER_USER@$SERVER_IP "
set -e
cd $PROJECT_PATH
# 拉取最新代码
git pull origin main
# 构建 Docker 镜像
docker build -t your-app:latest .
# 停止并删除旧容器
docker stop your-app || true
docker rm your-app || true
# 运行新容器
docker run -d \
--name your-app \
-p 3000:3000 \
--restart unless-stopped \
your-app:latest
# 清理旧镜像
docker image prune -f
"
only:
- mainhealth_check:
stage: deploy
script:
- |
echo "Performing health check..."
MAX_ATTEMPTS=10
ATTEMPT=0
until [ $ATTEMPT -eq $MAX_ATTEMPTS ]; do
if curl -f http://$SERVER_IP:3000/health; then
echo "Health check passed!"
exit 0
fi
echo "Health check attempt $((ATTEMPT+1)) failed. Retrying..."
ATTEMPT=$((ATTEMPT+1))
sleep 30
done
echo "Health check failed after $MAX_ATTEMPTS attempts"
exit 1
needs: ["deploy_production"]rollback:
stage: deploy
script:
- |
ssh $SERVER_USER@$SERVER_IP "
set -e
cd $PROJECT_PATH
echo 'Rolling back to previous version...'
git log --oneline -2
git revert HEAD --no-edit
# 重新部署前一个版本
npm install
npm run build
pm2 restart my-app
echo 'Rollback completed successfully!'
"
when: manual
only:
- main通过 GitLab CI/CD 实现自动部署可以显著提高开发效率和部署可靠性。本文介绍了从基础到高级的多种部署方案,你可以根据项目需求选择合适的策略。记得始终遵循安全最佳实践,并建立完善的监控和回滚机制。
开始自动化你的部署流程,让团队专注于开发而不是手动部署的繁琐工作吧!