Deploy

Матеріал з Wiki.Zina
Версія від 12:43, 11 квітня 2019, створена >Zina (→Скрипт)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Как обновить сайт из git репозитория

[ред. | ред. код]

Автоматически

[ред. | ред. код]

Зависимости

[ред. | ред. код]
sudo apt-get install gcc python-dev python-setuptools python-virtualenv
virtualenv venv
venv/bin/pip install -r deploy_requirements.txt

или руками если такого файла нет

venv/bin/pip install Fabric==1.14.1 mysqlclient==1.4.2.post1 pytz==2018.9
venv/bin/pip freeze > deploy_requirements.txt

Скрипт

[ред. | ред. код]

Называем скрипт fabfile.py и модифицируем его под проект

# -*- coding: utf-8 -*-
import os
import json
import six
from uuid import uuid4
from fabric.api import run, local, cd, settings, env, abort
from fabric.contrib.console import confirm
from fabric import operations
sites = {
    'beta': {
        'host': '37.53.93.49',
        'port': 850,
        'user': 'zina',
        'password': 'bGs5.Wzq,_c8&Y,^',
        'site_root': '/var/www/zina/data/www/site-domain',
        'remote_db_name': '',
        'remote_db_host': 'localhost',
        'remote_db_login': '',
        'remote_db_password': '',
        'local_db_password': '',
        # DRUPAL 8 'static_root': '/var/www/zina/data/www/site-domain/sites/default/files',
        'static_root': '/var/www/zina/data/www/site-domain/public/media',
        # DRUPAL 8 'static_root_copy_to': 'sites/default',
        'static_root_copy_to': 'public',
        'repo_clone_url': 'https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git', # example:  https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git
        'drush': 'drush9',
        'role': 'beta',
    },
    'prod': {
        'host': '77.120.105.84',
        'port': 22,
        'user': '',
        'password': '',
        'site_root': '/var/www/username/data/www/site-domain',
        'remote_db_name': '',
        'remote_db_host': 'localhost',
        'remote_db_login': '',
        'remote_db_password': '',
        'local_db_password': '',
        # DRUPAL 8 'static_root': '/var/www/zina/data/www/site-domain/sites/default/files',
        'static_root': '/var/www/zina/data/www/site-domain/public/media',
        # DRUPAL 8 'static_root_copy_to': 'sites/default',
        'static_root_copy_to': 'public',
        'repo_clone_url': 'https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git', # example:  https://{git_login}:{git_password}@bitbucket.org/zinadz/rud-garden.com.git
        'drush': 'env PATH="/opt/php71/bin:$PATH" drush9',
        'role': 'production',
    },
}
env.password = ''
env.roledefs = {
    'beta': [],
    'production': [],
}
local_root = os.path.dirname(__file__)
try:
    settings_file_path = os.path.join(local_root, 'fabric_settings.json')
    open(settings_file_path, 'a').close()
except IOError:
    print(u'Невозможно создать файл настроек. Проверьте права')
    raise
with open(settings_file_path, 'r+') as settings_file:
    try:
        fabric_settings = json.load(settings_file)
    except ValueError:
        fabric_settings = {}


def deploy():
    role_list = env.roles if env.roles else env.roledefs.keys()
    if not fabric_settings.get('git_login'):
        fabric_settings['git_login'] = raw_input(u'Git login> ')
    if not fabric_settings.get('git_password'):
        fabric_settings['git_password'] = raw_input(u'Git password> ')
    with open(settings_file_path, 'r+') as settings_file:
        json.dump(fabric_settings, settings_file)
    for role_name in role_list:
        for site in six.itervalues(sites):
            if site['role'] == role_name:
                env.host = site['host']
                env.port = site['port']
                env.user = site['user']
                env.password = site['password']
                env.host_string = '{}@{}'.format(site['user'], site['host'])
                site_root = site['site_root']
                repository = site['repo_clone_url'].format(**fabric_settings)
                with settings(warn_only=True):
                    if run('test -d {}'.format(site_root)).failed:
                        run('git clone {} {}'.format(repository, site_root))
                    #если движок не django то заменить src/manage.py на index.php
                    elif run('test -f {}'.format(os.path.join(site_root, 'src/manage.py'))).failed:
                        if not confirm(u'Дирректория {} сайта не содержит движок django. Удалить ее и склонировать репозиторий?'.format(site_root).encode('utf-8'), False):
                            abort(u'Выход')
                        run('rm -rf {}'.format(site_root))
                        run('mkdir {}'.format(site_root))
                        run('git clone {} {}'.format(repository, site_root))
                with cd(site_root):
                    run('git pull {} master'.format(repository))
                    #START Для движка django
                    run('venv/bin/pip install -r requirements.txt')
                    run('venv/bin/python src/manage.py migrate')
                    run('venv/bin/python src/manage.py collectstatic -c -v 0 --noinput')
                    run('touch logs/reload.txt')
                    #END Для движка django
                    #START Для движка drupal
                    run('%s cache-rebuild' % site['drush'])
                    #END Для движка drupal


def update_local_db():
    role_list = env.roles if env.roles else ['beta']
    for role_name in role_list:
        for site in six.itervalues(sites):
            if site['role'] == role_name:
                env.host = site['host']
                env.port = site['port']
                env.user = site['user']
                env.password = site['password']
                env.host_string = '{}@{}'.format(site['user'], site['host'])
                backup_filepath = '/tmp/{remote_db_name}-{hash}.sql'.format(remote_db_name=site['remote_db_name'], hash=uuid4().hex)
                run('mysqldump -u{remote_db_login} -p\'{remote_db_password}\' -h{remote_db_host} {remote_db_name} > {backup_filepath}'.format(backup_filepath=backup_filepath, **site))
                operations.get(remote_path=backup_filepath,
                               local_path=os.path.join(local_root, '{remote_db_name}.sql'.format(**site)))
                run('rm -f %s' % backup_filepath)
                local('mysql -uroot -p{local_db_password} -hlocalhost --execute="DROP DATABASE IF EXISTS {remote_db_name};CREATE DATABASE {remote_db_name} CHARACTER SET utf8 COLLATE utf8_general_ci;" && mysql -uroot -p{local_db_password} -hlocalhost {remote_db_name} < {remote_db_name}.sql && rm {remote_db_name}.sql'.format(**site))


def update_local_static():
    role_list = env.roles if env.roles else ['beta']
    for role_name in role_list:
        for site in six.itervalues(sites):
            if site['role'] == role_name:
                env.host = site['host']
                env.port = site['port']
                env.user = site['user']
                env.password = site['password']
                env.host_string = '{}@{}'.format(site['user'], site['host'])
                local('rsync -amv -e "ssh -p{port}" --delete {user}@{host}:{static_root} {copy_to}'.format(**{
                    'port': site['port'],
                    'user': site['user'],
                    'host': site['host'],
                    'static_root': site['static_root'],
                    'copy_to': site['static_root_copy_to'],
                }))

Добавляем в .gitignore

/venv/
/fabric_settings.json
*.py[co]

Запуск

[ред. | ред. код]
venv/bin/fab -R beta deploy
venv/bin/fab -R production deploy
##обновляем базу
venv/bin/fab -R beta update_local_db
venv/bin/fab -R production update_local_db

Вручную

[ред. | ред. код]
  • логинимся по ssh на сервер

ssh username@77.120.120.73

  • переходим в дирректорию сайта

cd www/site.com.ua

  • ставим свой bitbucket login в remote url .git/config

vim .git/config

[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = https://shmel210@bitbucket.org/zinadz/tmm.git