· 7 years ago · Sep 14, 2018, 12:36 PM
1from fabric.api import hide, env, settings, abort, run, cd, shell_env
2from fabric.colors import magenta, red
3from fabric.contrib.files import append
4from fabric.contrib.project import rsync_project
5import os
6
7env.user = 'root'
8env.abort_on_prompts = True
9# TODO: Смените на путь на Ñервере, по которому будут Ñкопированы файлы приложениÑ
10PATH = '/srv/mywebapp'
11ENV_FILE = '/etc/profile.d/variables.sh'
12VARIABLES = ('SECRET_KEY', )
13
14
15def deploy():
16 def rsync():
17 exclusions = ('.git*', '.env', '*.sock*', '*.lock', '*.pyc', '*cache*',
18 '*.log', 'log/', 'id_rsa*', 'maintenance')
19 rsync_project(PATH, './', exclude=exclusions, delete=True)
20
21 def docker_compose(command):
22 with cd(PATH):
23 with shell_env(CI_BUILD_REF_NAME=os.getenv(
24 'CI_BUILD_REF_NAME', 'master')):
25 # прÑчем прогреÑÑ-бар, Ñм. https://git.io/vXH8a
26 run('set -o pipefail; docker-compose %s | tee' % command)
27
28 # СохранÑем переменные на Ñервере
29 variables_set = True
30 for var in VARIABLES + ('CI_BUILD_TOKEN', ):
31 if os.getenv(var) is None:
32 variables_set = False
33 print(red('ERROR: environment variable ' + var + ' is not set.'))
34 if not variables_set:
35 abort('Missing required parameters')
36 with hide('commands'):
37 run('rm -f "%s"' % ENV_FILE)
38 append(ENV_FILE,
39 ['export %s="%s"' % (var, val) for var, val in zip(
40 VARIABLES, map(os.getenv, VARIABLES))])
41 # Fabric перечитывает переменные из Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ñ€Ð¸ каждом вызове run(),
42 # поÑтому нет ÑмыÑла делать Ñто Ñвно. Ñм. http://stackoverflow.com/q/38024726/1336774
43
44 # ЛогинимÑÑ Ð² registry
45 run('docker login -u %s -p %s %s' % (os.getenv('REGISTRY_USER',
46 'gitlab-ci-token'),
47 os.getenv('CI_BUILD_TOKEN'),
48 os.getenv('CI_REGISTRY',
49 'registry.gitlab.com')))
50
51 # ВыполнÑем начальную уÑтановку, еÑли нужно
52 with settings(warn_only=True):
53 with hide('warnings'):
54 need_bootstrap = run('docker ps | grep -q web').return_code != 0
55 if need_bootstrap:
56 print(magenta('No previous installation found, bootstrapping'))
57 rsync()
58 docker_compose('up -d')
59
60 # Включаем заглушку "техничеÑкие работы", Ñм. https://habr.ru/post/139968
61 run('touch %s/nginx/maintenance && docker kill -s HUP nginx_1' % PATH)
62 rsync()
63 docker_compose('pull')
64 docker_compose('up -d')
65 # Убираем заглушку
66 run('rm -f %s/nginx/maintenance && docker kill -s HUP nginx_1' % PATH)