首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >GitLab 自动部署代码到服务器:完整实践指南

GitLab 自动部署代码到服务器:完整实践指南

作者头像
编程小白狼
发布2025-11-05 08:27:24
发布2025-11-05 08:27:24
6470
举报
文章被收录于专栏:编程小白狼编程小白狼

在现代软件开发中,自动化部署已成为提高开发效率和保证部署质量的关键环节。本文将详细介绍如何使用 GitLab 实现代码的自动部署到服务器。

1. 准备工作

1.1 环境要求
  • GitLab 项目(自托管或 GitLab.com
  • 目标服务器(支持 SSH 访问)
  • 基本的 CI/CD 概念理解
1.2 服务器配置

确保目标服务器已安装:

  • Git
  • 运行环境(如 Node.js、Python、Java 等,根据项目需要)
  • Web 服务器(如 Nginx、Apache)

2. 配置 GitLab CI/CD

2.1 创建 .gitlab-ci.yml 文件

在项目根目录创建 .gitlab-ci.yml 文件,这是 GitLab CI/CD 的核心配置文件。

代码语言:javascript
复制
# .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
2.2 高级部署脚本示例

对于更复杂的部署场景,可以使用专门的部署脚本:

代码语言:javascript
复制
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

3. 配置 GitLab 变量

在 GitLab 项目设置中配置 CI/CD 变量,避免将敏感信息硬编码在配置文件中:

必需变量:
  • SSH_PRIVATE_KEY:服务器 SSH 私钥
  • SERVER_IP:服务器 IP 地址
  • SERVER_USER:服务器用户名
  • PROJECT_PATH:项目在服务器上的路径
  • DEPLOY_COMMANDS:部署命令(如:npm install && npm run build && pm2 restart app
配置步骤:
  1. 进入 GitLab 项目
  2. 点击 Settings > CI/CD
  3. 展开 Variables 部分
  4. 点击 Add variable 添加上述变量

4. 服务器端配置

4.1 设置部署用户
代码语言:javascript
复制
# 在服务器上创建部署专用用户
sudo adduser deployer
sudo usermod -aG sudo deployer  # 如果需要 sudo 权限

# 切换到部署用户
su - deployer
4.2 配置 SSH 密钥认证
代码语言:javascript
复制
# 在服务器上生成 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
4.3 项目目录准备
代码语言:javascript
复制
# 克隆项目
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"

5. 高级部署策略

5.1 蓝绿部署配置
代码语言:javascript
复制
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:
    - main
5.2 Docker 部署
代码语言:javascript
复制
deploy_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:
    - main

6. 监控和回滚

6.1 健康检查
代码语言:javascript
复制
health_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"]
6.2 自动回滚
代码语言:javascript
复制
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

7. 最佳实践

7.1 安全建议
  • 使用专门的部署用户,限制权限
  • 定期轮换 SSH 密钥
  • 使用 GitLab 受保护分支和环境
  • 敏感信息存储在 CI/CD 变量中
7.2 性能优化
  • 使用缓存加速构建过程
  • 并行执行独立任务
  • 优化 Docker 镜像层
7.3 错误处理
  • 设置合理的超时时间
  • 实现完善的日志记录
  • 配置失败通知

结论

通过 GitLab CI/CD 实现自动部署可以显著提高开发效率和部署可靠性。本文介绍了从基础到高级的多种部署方案,你可以根据项目需求选择合适的策略。记得始终遵循安全最佳实践,并建立完善的监控和回滚机制。

开始自动化你的部署流程,让团队专注于开发而不是手动部署的繁琐工作吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 准备工作
    • 1.1 环境要求
    • 1.2 服务器配置
  • 2. 配置 GitLab CI/CD
    • 2.1 创建 .gitlab-ci.yml 文件
    • 2.2 高级部署脚本示例
  • 3. 配置 GitLab 变量
    • 必需变量:
    • 配置步骤:
  • 4. 服务器端配置
    • 4.1 设置部署用户
    • 4.2 配置 SSH 密钥认证
    • 4.3 项目目录准备
  • 5. 高级部署策略
    • 5.1 蓝绿部署配置
    • 5.2 Docker 部署
  • 6. 监控和回滚
    • 6.1 健康检查
    • 6.2 自动回滚
  • 7. 最佳实践
    • 7.1 安全建议
    • 7.2 性能优化
    • 7.3 错误处理
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档