update.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # Copyright: (c) OpenSpug Organization. https://github.com/openspug/spug
  2. # Copyright: (c) <spug.dev@gmail.com>
  3. # Released under the AGPL-3.0 License.
  4. from django.core.management.base import BaseCommand
  5. from django.conf import settings
  6. import subprocess
  7. import requests
  8. import os
  9. class Command(BaseCommand):
  10. help = '升级Spug版本'
  11. def handle(self, *args, **options):
  12. version, is_repair = settings.SPUG_VERSION, False
  13. res = requests.get(f'https://api.spug.cc/apis/release/latest/?version={version}').json()
  14. if res['error']:
  15. return self.stderr.write(self.style.ERROR(f'获取新版本失败:{res["error"]}'))
  16. if not res['data']['has_new']:
  17. self.stdout.write(res['data']['extra'])
  18. is_repair = True
  19. answer = input(f'\r\n当前已是最新版本,是否要进行修复性更新[y|n]?')
  20. else:
  21. version = res['data']['version']
  22. self.stdout.write(res['data']['content'])
  23. self.stdout.write('\r\n')
  24. self.stdout.write(res['data']['extra'])
  25. answer = input(f'\r\n发现新版本 {version} 是否更新[y|n]?')
  26. if answer.lower() != 'y':
  27. return
  28. # update web
  29. web_dir = os.path.join(settings.BASE_DIR, '../spug_web')
  30. commands = [
  31. f'curl -o /tmp/spug_web.tar.gz https://cdn.spug.cc/spug/web_{version}.tar.gz',
  32. f'rm -rf {web_dir}/build',
  33. f'tar xf /tmp/spug_web.tar.gz -C {web_dir}'
  34. ]
  35. task = subprocess.Popen(' && '.join(commands), shell=True)
  36. if task.wait() != 0:
  37. return self.stderr.write(self.style.ERROR('获取更新失败,排除网络问题后请附带输出内容至官方论坛反馈。'))
  38. # update api
  39. commands = [
  40. f'cd {settings.BASE_DIR}',
  41. f'git fetch origin refs/tags/{version}:refs/tags/{version} --no-tags',
  42. f'git checkout {version}'
  43. ]
  44. if is_repair:
  45. commands.insert(1, f'git tag -d {version}')
  46. task = subprocess.Popen(' && '.join(commands), shell=True)
  47. if task.wait() != 0:
  48. return self.stderr.write(self.style.ERROR('获取更新失败,排除网络问题后请附带输出内容至官方论坛反馈。'))
  49. # update dep
  50. commands = [
  51. f'cd {settings.BASE_DIR}',
  52. 'pip3 install -r requirements.txt -i https://pypi.doubanio.com/simple/'
  53. ]
  54. task = subprocess.Popen(' && '.join(commands), shell=True)
  55. if task.wait() != 0:
  56. return self.stderr.write(self.style.ERROR('更新依赖包失败,排除网络问题后请附带输出内容至官方论坛反馈。'))
  57. # update db
  58. apps = [x.split('.')[-1] for x in settings.INSTALLED_APPS if x.startswith('apps.')]
  59. commands = [
  60. f'cd {settings.BASE_DIR}',
  61. f'python3 ./manage.py makemigrations ' + ' '.join(apps),
  62. f'python3 ./manage.py migrate',
  63. f'python3 ./tools/migrate.py {settings.SPUG_VERSION}'
  64. ]
  65. task = subprocess.Popen(' && '.join(commands), shell=True)
  66. if task.wait() != 0:
  67. return self.stderr.write(self.style.ERROR('更新表结构失败,请附带输出内容至官方论坛反馈。'))
  68. self.stdout.write(self.style.SUCCESS('''升级成功,请自行重启服务,如果通过官方文档安装一般重启命令为
  69. Docker: docker restart spug
  70. Centos: systemctl restart supervisord
  71. Ubuntu: systemctl restart supervisor
  72. '''))
  73. self.stderr.write(self.style.WARNING(f'最后别忘了刷新浏览器,确保系统设置/关于里的api与web版本一致哦~'))