自动化部署流水线:GitLab CI/CD + Docker + Nginx 部署 Python 应用

自动化部署流水线能显著提升应用发布效率,减少人为错误。本方案使用 GitLab CI/CD 作为持续集成/部署工具,Docker 实现应用容器化,Nginx 作为反向代理服务器,确保 Python 应用(如 Flask 或 Django)的稳定部署。以下是详细步骤,我将逐步引导您完成整个过程。整个过程基于标准实践,确保真实可靠。

1. 准备工作
  • 环境需求
    • GitLab 仓库(托管代码)。
    • 服务器(如 Ubuntu)安装 Docker 和 Docker Compose。
    • 域名或 IP 地址用于访问应用。
  • Python 应用示例:假设您有一个简单的 Flask 应用。例如,创建 app.py
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return "Hello, Automated Deployment!"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    

    • 创建 requirements.txt 文件,列出依赖:Flask
2. Docker 化 Python 应用
  • 创建 Dockerfile 在项目根目录,构建应用镜像:
    # 使用官方 Python 基础镜像
    FROM python:3.9-slim
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制依赖文件并安装
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    
    # 复制应用代码
    COPY . .
    
    # 暴露端口(Flask 默认 5000)
    EXPOSE 5000
    
    # 启动命令
    CMD ["python", "app.py"]
    

  • 验证 Docker 镜像:本地运行 docker build -t my-python-app .docker run -p 5000:5000 my-python-app 测试。
3. 配置 Nginx 作为反向代理
  • Nginx 处理静态文件、负载均衡和 SSL(可选)。创建 nginx.conf
    server {
        listen 80;
        server_name your-domain.com;  # 替换为您的域名或 IP
    
        location / {
            proxy_pass http://python-app:5000;  # 指向 Docker 容器
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

  • 创建 docker-compose.yml 管理多容器(Python 应用 + Nginx):
    version: '3'
    services:
      python-app:
        image: my-python-app  # 使用 Dockerfile 构建的镜像
        restart: always
        ports:
          - "5000:5000"
    
      nginx:
        image: nginx:latest
        restart: always
        ports:
          - "80:80"
        volumes:
          - ./nginx.conf:/etc/nginx/conf.d/default.conf
        depends_on:
          - python-app
    

4. 配置 GitLab CI/CD 流水线
  • 在 GitLab 仓库根目录创建 .gitlab-ci.yml 文件。流水线包括构建、测试、部署阶段:
    stages:
      - build
      - test
      - deploy
    
    variables:
      DOCKER_IMAGE: registry.gitlab.com/your-username/your-repo  # 替换为您的 GitLab 容器镜像地址
    
    build:
      stage: build
      script:
        - docker build -t $DOCKER_IMAGE .
        - docker push $DOCKER_IMAGE
      only:
        - main  # 只在 main 分支触发
    
    test:
      stage: test
      script:
        - docker run $DOCKER_IMAGE python -m pytest  # 假设有测试脚本
    
    deploy:
      stage: deploy
      script:
        - ssh user@your-server "docker pull $DOCKER_IMAGE"
        - ssh user@your-server "docker-compose down && docker-compose up -d"
      only:
        - main
    

  • 关键配置
    • 在 GitLab 设置 CI/CD 变量:SSH_PRIVATE_KEY(服务器 SSH 密钥)和 DOCKER_REGISTRY 凭证。
    • 服务器需安装 Docker 和 Docker Compose,并允许 SSH 访问。
5. 部署和测试
  • 触发流水线:推送代码到 GitLab 仓库,自动运行流水线。
  • 验证部署
    • 访问 http://your-domain.com,应显示 "Hello, Automated Deployment!"。
    • 检查日志:在服务器运行 docker logs <container_id>
  • 优势:流水线自动化测试和回滚(通过 GitLab 功能),确保高可用。
常见问题与优化
  • 问题排查:如果部署失败,检查 GitLab CI/CD 作业日志;确保服务器防火墙开放端口 80。
  • 优化建议
    • 添加 SSL:使用 Let's Encrypt 在 Nginx 配置 HTTPS。
    • 扩展性:通过 Docker Swarm 或 Kubernetes 实现集群部署。
    • 监控:集成 Prometheus 或 ELK 栈。

通过此方案,您能实现从代码提交到生产部署的全自动化,提升部署频率和可靠性。如果您提供具体应用细节,我可以进一步定制步骤!

更多推荐