import re import requests from celery.utils.log import get_task_logger from pingcap_sso.celery import app as celery_app from pingcap_sso.models import TiDBRelease logger = get_task_logger(__name__) @celery_app.task def sync_tidb_releases_from_github(github_token): tidb_release_api = 'https://api.github.com/repos/pingcap/tidb/tags' requests_headers = { 'Content-Type': 'application/json; charset=utf-8', } if github_token: requests_headers['Authorization'] = f'token {github_token}' tags = [] page = 1 per_page = 100 has_result = True while has_result: try: result = requests.get( '{}?page={}&per_page={}'.format(tidb_release_api, page, per_page), headers=requests_headers, timeout=3 ).json() has_result = bool(result) tags += [i['name'] for i in result] page += 1 except Exception as e: logger.error(e) has_result = False break for tag in tags: tag = tag.lower() r = re.findall(r'^v(\d+)\.(\d+)\.(\d+)$', tag) if not r: continue TiDBRelease.objects.get_or_create( major_number=r[0][0], version=tag )