如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程

大公司的程序员,容易产生的错觉之一就是,误将平台能力当作自己的能力。在大团队,我们不应仅关注自己的一亩三分地,更需要了解平台的各个环节。一方面,有助于更好地利用平台相关特性,另一方面,也为了自我技术更好地成长。本文,介绍了如何使用 Jekins、Docker、GitLab 搭建 Django 自动化开发部署流程。相关工具都是开源、可以拿来即用的。

1. 开发流程

在生产环境,Web 应用采用的是 K8S 多实例部署,状态服务 MySQL、RabbitMQ 采用的是集群部署。同时,还搭建了监控和日志采集、检索等周边。相比较于生产环境,这里的开发流程,我希望能尽量模拟生产环境,但也不需要太完善。毕竟,个人的时间和精力有限,当有需求时,逐步完善是一个不错的选择。这里使用 GitLab 作为开发仓库,使用 Jenkins 作为自动化引擎,部署使用的是 Docker 镜像。下面是一个简单的部署流程:当满足触发条件时,Jenkins 就会自动从 GitLab 拉取代码,制作 Docker 镜像,最终在服务器上运行 Django 实例。这样基本就可以,模拟整个部署流程。

2. GitLab 配置

选用 GitLab 是因为,其允许创建私有仓库。
  • 创建仓库
首先得创建一个 GitLab 仓库,例如: ProjectA
  • 添加远程访问 SSH-KEY
在本地执行命令,生成远程访问需要的 SSH-KSY

相关推荐

站点声明:本站部分内容转载自网络,作品版权归原作者及来源网站所有,任何内容转载、商业用途等均须联系原作者并注明来源。

相关侵权、举报、投诉及建议等,请发邮件至E-mail:service@mryunwei.com

回到顶部
1
ssh-keygen -o -t rsa -b 4096 -C "[email protected]"
if os.getenv('Env') == 'Production':
    DEBUG = False
else:
    DEBUG = True
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfile')
1. 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
WHITENOISE_STATIC_PREFIX = '/static/'
MIDDLEWARE.append('whitenoise.middleware.WhiteNoiseMiddleware')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
FROM python:3.7-alpine

RUN apk update 
    && apk add --no-cache --virtual bash 
    && apk add gcc 
    && apk add musl-dev 
    && apk add linux-headers 
    && apk add jpeg-dev 
    && apk add zlib-dev 
    && apk add mariadb-dev 
    && apk add libffi-dev

COPY requirements.txt /requirements.txt
RUN pip install --upgrade pip 
    && pip install -r requirements.txt 
    && rm /usr/bin/mysql*

RUN mkdir /code
WORKDIR /code
django==2.1.2
gunicorn==19.9.0
mysqlclient==1.3.13
pymysql==0.9.2
whitenoise==4.1.2
celery==4.2.1
django-celery-results==1.0.4
django-celery-beat==1.3.0
redis==2.10.6
FROM mysql:5.7
COPY my.cnf /etc/mysql/conf.d/my.cnf
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
version: '2'
services:
  python:
    build: ./docker/python
    container_name: django
    ports:
      - 7900:7900
    volumes:
      - ./code:/code
    command: >
      bash -c "pip install -r requirements.txt
      && python manage.py migrate
      && python manage.py collectstatic --no-input
      && gunicorn news.wsgi -b 0.0.0.0:7900"
    environment:
      - Env=Production
    depends_on:
      - mysql
      - redis
      - rabbitmq
      - celery
      - mongo
    networks:
      - django-networks

  mysql:
    build: ./docker/mysql
    container_name: mysql
    ports:
      - 3306:3306
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=news
    networks:
      - django-networks

  redis:
    image: redis:latest
    container_name: redis
    expose:
      - "6379"
    networks:
      - django-networks

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    environment:
        - RABBITMQ_DEFAULT_USER=guest
        - RABBITMQ_DEFAULT_PASS=guest
    ports:
        - "5673:5673"
    networks:
      - django-networks

  celery:
    build: ./docker/python
    container_name: celery
    environment:
      - Env=Production
    depends_on:
        - rabbitmq
        - mysql
    volumes:
        - ./code:/code
    command: >
      bash -c "pip install -r requirements.txt
      && celery -A news.celery worker -l INFO
      && celery -A news.celery beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler"
    networks:
        - django-networks

  mongo:
    image: mongo:latest
    container_name: mongo
    ports:
      - "27018:27017"
    volumes:
      - ./data/mongo:/data/db
    networks:
      - django-networks

networks:
  django-networks:
    driver: "bridge"
#!/bin/bash
docker-compose build
docker-compose stop
docker-compose up -d
server {
     listen 80;
     server_name yourdomain.com;

     location / {
         proxy_pass http://127.0.0.1:7900;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}