From 322f17eefb522b5bcf38a5f507820f22f74b1252 Mon Sep 17 00:00:00 2001 From: vapao Date: Tue, 5 May 2020 12:04:39 +0800 Subject: [PATCH] =?UTF-8?q?A=20=E6=B7=BB=E5=8A=A0manage.py=20update?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=8D=87=E7=BA=A7spug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/management/commands/update.py | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/spug_api/apps/account/management/commands/update.py b/spug_api/apps/account/management/commands/update.py index 00af4d8..101d61b 100644 --- a/spug_api/apps/account/management/commands/update.py +++ b/spug_api/apps/account/management/commands/update.py @@ -2,16 +2,53 @@ # Copyright: (c) # Released under the MIT License. from django.core.management.base import BaseCommand -from django.core.management import execute_from_command_line +from django.core.management import call_command from django.conf import settings +import subprocess +import requests +import os class Command(BaseCommand): help = '升级Spug版本' - def add_arguments(self, parser): - parser.add_argument('version', help='要升级的版本') - def handle(self, *args, **options): + res = requests.get('https://gitee.com/api/v5/repos/openspug/spug/releases/latest').json() + version = res.get('tag_name') + if not version: + return self.stderr.write(self.style.ERROR('获取新版本失败,排除网络问题后可至官方论坛反馈')) + if version == settings.SPUG_VERSION: + return self.stdout.write(self.style.SUCCESS('当前已是最新版本')) + answer = input(f'发现新版本 {version} 是否更新[y|n]?') + if answer.lower() != 'y': + return - self.stdout.write(self.style.SUCCESS('升级成功')) + # update web + web_dir = os.path.join(settings.BASE_DIR, '../spug_web') + commands = [ + f'curl -o /tmp/spug_web.tar.gz https://spug.dev/installer/web_{version}.tar.gz', + f'rm -rf {web_dir}/build', + f'tar xf /tmp/spug_web.tar.gz -C {web_dir}' + ] + task = subprocess.Popen(' && '.join(commands), shell=True) + if task.wait() != 0: + return self.stderr.write(self.style.ERROR('获取更新失败,排除网络问题后可至官方论坛反馈。')) + + # update api + commands = [ + f'cd {settings.BASE_DIR}', + 'git fetch --tags', + f'git checkout {version}' + ] + task = subprocess.Popen(' && '.join(commands), shell=True) + if task.wait() != 0: + return self.stderr.write(self.style.ERROR('获取更新失败,排除网络问题后可至官方论坛反馈。')) + + # update db + apps = [x.split('.')[-1] for x in settings.INSTALLED_APPS if x.startswith('apps.')] + call_command('makemigrations', *apps) + call_command('migrate') + + self.stdout.write(self.style.SUCCESS('''升级成功,请自行重启服务,如果通过官方文档安装一般重启命令为 + Centos: systemctl restart supervisord + Ubuntu: systemctl restart supervisor'''))