2022-06-05 22:56:52 +00:00
|
|
|
"""Ensure that the release tag matches the InvenTree version number.
|
2022-05-28 23:40:37 +00:00
|
|
|
|
2022-06-05 22:56:52 +00:00
|
|
|
Behaviour:
|
2022-05-28 23:40:37 +00:00
|
|
|
master / main branch:
|
|
|
|
- version number must end with 'dev'
|
|
|
|
|
|
|
|
tagged branch:
|
|
|
|
- version number must match tag being built
|
|
|
|
- version number cannot already exist as a release tag
|
|
|
|
|
2021-08-07 11:21:09 +00:00
|
|
|
"""
|
|
|
|
|
2024-08-11 01:03:18 +00:00
|
|
|
import itertools
|
2022-05-30 23:50:38 +00:00
|
|
|
import json
|
2022-05-20 15:24:51 +00:00
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import sys
|
2024-01-11 00:28:58 +00:00
|
|
|
from pathlib import Path
|
2021-08-07 11:21:09 +00:00
|
|
|
|
2022-05-30 23:50:38 +00:00
|
|
|
import requests
|
|
|
|
|
2024-08-02 09:57:23 +00:00
|
|
|
REPO = os.getenv('GITHUB_REPOSITORY', 'inventree/inventree')
|
|
|
|
GITHUB_API_URL = os.getenv('GITHUB_API_URL', 'https://api.github.com')
|
|
|
|
|
2022-05-30 23:50:38 +00:00
|
|
|
|
2024-08-07 10:34:54 +00:00
|
|
|
def get_existing_release_tags(include_prerelease=True):
|
2024-01-11 03:40:07 +00:00
|
|
|
"""Request information on existing releases via the GitHub API."""
|
2022-12-21 12:00:23 +00:00
|
|
|
# Check for github token
|
|
|
|
token = os.getenv('GITHUB_TOKEN', None)
|
|
|
|
headers = None
|
|
|
|
|
|
|
|
if token:
|
2024-01-11 00:28:58 +00:00
|
|
|
headers = {'Authorization': f'Bearer {token}'}
|
2022-12-21 12:00:23 +00:00
|
|
|
|
2024-08-02 09:57:23 +00:00
|
|
|
response = requests.get(f'{GITHUB_API_URL}/repos/{REPO}/releases', headers=headers)
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
if response.status_code != 200:
|
2024-01-11 00:28:58 +00:00
|
|
|
raise ValueError(
|
|
|
|
f'Unexpected status code from GitHub API: {response.status_code}'
|
|
|
|
)
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
data = json.loads(response.text)
|
|
|
|
|
|
|
|
# Return a list of all tags
|
|
|
|
tags = []
|
|
|
|
|
|
|
|
for release in data:
|
|
|
|
tag = release['tag_name'].strip()
|
2024-01-11 00:28:58 +00:00
|
|
|
match = re.match(r'^.*(\d+)\.(\d+)\.(\d+).*$', tag)
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
if len(match.groups()) != 3:
|
|
|
|
print(f"Version '{tag}' did not match expected pattern")
|
|
|
|
continue
|
|
|
|
|
2024-08-07 10:34:54 +00:00
|
|
|
if not include_prerelease and release['prerelease']:
|
|
|
|
continue
|
|
|
|
|
2022-05-30 23:50:38 +00:00
|
|
|
tags.append([int(x) for x in match.groups()])
|
|
|
|
|
|
|
|
return tags
|
|
|
|
|
|
|
|
|
2022-08-01 03:31:26 +00:00
|
|
|
def check_version_number(version_string, allow_duplicate=False):
|
2022-05-30 23:50:38 +00:00
|
|
|
"""Check the provided version number.
|
|
|
|
|
|
|
|
Returns True if the provided version is the 'newest' InvenTree release
|
|
|
|
"""
|
|
|
|
print(f"Checking version '{version_string}'")
|
|
|
|
|
|
|
|
# Check that the version string matches the required format
|
2024-01-11 00:28:58 +00:00
|
|
|
match = re.match(r'^(\d+)\.(\d+)\.(\d+)(?: dev)?$', version_string)
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
if not match or len(match.groups()) != 3:
|
2024-01-11 00:28:58 +00:00
|
|
|
raise ValueError(
|
|
|
|
f"Version string '{version_string}' did not match required pattern"
|
|
|
|
)
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
version_tuple = [int(x) for x in match.groups()]
|
|
|
|
|
|
|
|
# Look through the existing releases
|
2024-08-07 10:34:54 +00:00
|
|
|
existing = get_existing_release_tags(include_prerelease=False)
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
# Assume that this is the highest release, unless told otherwise
|
|
|
|
highest_release = True
|
|
|
|
|
|
|
|
for release in existing:
|
2022-08-01 03:31:26 +00:00
|
|
|
if release == version_tuple and not allow_duplicate:
|
2022-05-30 23:50:38 +00:00
|
|
|
raise ValueError(f"Duplicate release '{version_string}' exists!")
|
|
|
|
|
|
|
|
if release > version_tuple:
|
|
|
|
highest_release = False
|
2024-08-26 23:04:55 +00:00
|
|
|
print(f'Found newer release: {release!s}')
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
return highest_release
|
|
|
|
|
|
|
|
|
2021-08-07 11:21:09 +00:00
|
|
|
if __name__ == '__main__':
|
2024-08-02 09:57:23 +00:00
|
|
|
# Ensure that we are running in GH Actions
|
|
|
|
if os.environ.get('GITHUB_ACTIONS', '') != 'true':
|
|
|
|
print('This script is intended to be run within a GitHub Action!')
|
|
|
|
sys.exit(1)
|
|
|
|
|
2024-02-13 01:57:25 +00:00
|
|
|
if 'only_version' in sys.argv:
|
|
|
|
here = Path(__file__).parent.absolute()
|
2024-04-03 06:50:13 +00:00
|
|
|
version_file = here.joinpath(
|
|
|
|
'..', '..', 'src', 'backend', 'InvenTree', 'InvenTree', 'api_version.py'
|
|
|
|
)
|
2024-02-13 01:57:25 +00:00
|
|
|
text = version_file.read_text()
|
|
|
|
results = re.findall(r"""INVENTREE_API_VERSION = (.*)""", text)
|
2024-07-17 13:45:26 +00:00
|
|
|
# If 2. args is true lower the version number by 1
|
|
|
|
if len(sys.argv) > 2 and sys.argv[2] == 'true':
|
|
|
|
results[0] = str(int(results[0]) - 1)
|
2024-02-13 01:57:25 +00:00
|
|
|
print(results[0])
|
|
|
|
exit(0)
|
2024-08-02 09:57:23 +00:00
|
|
|
|
2022-05-28 23:40:37 +00:00
|
|
|
# GITHUB_REF_TYPE may be either 'branch' or 'tag'
|
|
|
|
GITHUB_REF_TYPE = os.environ['GITHUB_REF_TYPE']
|
|
|
|
|
|
|
|
# GITHUB_REF may be either 'refs/heads/<branch>' or 'refs/heads/<tag>'
|
|
|
|
GITHUB_REF = os.environ['GITHUB_REF']
|
2022-08-02 02:11:07 +00:00
|
|
|
GITHUB_REF_NAME = os.environ['GITHUB_REF_NAME']
|
2022-05-29 03:47:29 +00:00
|
|
|
GITHUB_BASE_REF = os.environ['GITHUB_BASE_REF']
|
|
|
|
|
2022-08-02 02:11:07 +00:00
|
|
|
# Print out version information, makes debugging actions *much* easier!
|
2024-01-11 00:28:58 +00:00
|
|
|
print(f'GITHUB_REF: {GITHUB_REF}')
|
|
|
|
print(f'GITHUB_REF_NAME: {GITHUB_REF_NAME}')
|
|
|
|
print(f'GITHUB_REF_TYPE: {GITHUB_REF_TYPE}')
|
|
|
|
print(f'GITHUB_BASE_REF: {GITHUB_BASE_REF}')
|
2022-08-02 02:11:07 +00:00
|
|
|
|
2024-01-11 00:28:58 +00:00
|
|
|
here = Path(__file__).parent.absolute()
|
2024-04-03 01:16:59 +00:00
|
|
|
version_file = here.joinpath(
|
|
|
|
'..', '..', 'src', 'backend', 'InvenTree', 'InvenTree', 'version.py'
|
|
|
|
)
|
2021-08-07 11:21:09 +00:00
|
|
|
|
2021-10-10 23:19:59 +00:00
|
|
|
version = None
|
|
|
|
|
2024-08-26 23:04:55 +00:00
|
|
|
with open(version_file, encoding='utf-8') as f:
|
2021-10-10 23:19:59 +00:00
|
|
|
text = f.read()
|
|
|
|
|
|
|
|
# Extract the InvenTree software version
|
2024-01-11 00:28:58 +00:00
|
|
|
results = re.findall(r"""INVENTREE_SW_VERSION = '(.*)'""", text)
|
2021-08-07 11:21:09 +00:00
|
|
|
|
2022-05-15 15:52:23 +00:00
|
|
|
if len(results) != 1:
|
2024-01-11 00:28:58 +00:00
|
|
|
print(f'Could not find INVENTREE_SW_VERSION in {version_file}')
|
2021-08-07 11:21:09 +00:00
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
version = results[0]
|
|
|
|
|
2021-10-10 23:19:59 +00:00
|
|
|
print(f"InvenTree Version: '{version}'")
|
|
|
|
|
2022-08-01 03:31:26 +00:00
|
|
|
# Check version number and look for existing versions
|
2022-08-02 02:11:07 +00:00
|
|
|
# If a release is found which matches the current tag, throw an error
|
|
|
|
|
|
|
|
allow_duplicate = False
|
|
|
|
|
|
|
|
# Note: on a 'tag' (release) we *must* allow duplicate versions, as this *is* the version that has just been released
|
|
|
|
if GITHUB_REF_TYPE == 'tag':
|
|
|
|
allow_duplicate = True
|
|
|
|
|
|
|
|
# Note: on a push to 'stable' branch we also allow duplicates
|
|
|
|
if GITHUB_BASE_REF == 'stable':
|
|
|
|
allow_duplicate = True
|
|
|
|
|
|
|
|
highest_release = check_version_number(version, allow_duplicate=allow_duplicate)
|
2021-09-12 11:36:14 +00:00
|
|
|
|
2022-05-30 23:50:38 +00:00
|
|
|
# Determine which docker tag we are going to use
|
|
|
|
docker_tags = None
|
2021-09-12 11:17:56 +00:00
|
|
|
|
2022-05-30 23:50:38 +00:00
|
|
|
if GITHUB_REF_TYPE == 'tag':
|
2022-06-06 22:57:51 +00:00
|
|
|
# GITHUB_REF should be of the form /refs/heads/<tag>
|
2022-05-28 23:40:37 +00:00
|
|
|
version_tag = GITHUB_REF.split('/')[-1]
|
2022-05-29 07:41:14 +00:00
|
|
|
print(f"Checking requirements for tagged release - '{version_tag}':")
|
2021-10-10 23:19:59 +00:00
|
|
|
|
2022-05-28 23:40:37 +00:00
|
|
|
if version_tag != version:
|
|
|
|
print(f"Version number '{version}' does not match tag '{version_tag}'")
|
|
|
|
sys.exit
|
2021-09-12 11:17:56 +00:00
|
|
|
|
2024-08-26 23:04:55 +00:00
|
|
|
docker_tags = [version_tag, 'stable'] if highest_release else [version_tag]
|
2021-09-12 11:17:56 +00:00
|
|
|
|
2022-05-29 07:41:14 +00:00
|
|
|
elif GITHUB_REF_TYPE == 'branch':
|
2023-06-03 14:04:52 +00:00
|
|
|
# Otherwise we know we are targeting the 'master' branch
|
2022-05-30 23:50:38 +00:00
|
|
|
docker_tags = ['latest']
|
2022-05-29 07:41:14 +00:00
|
|
|
|
2022-05-28 23:40:37 +00:00
|
|
|
else:
|
2024-01-11 00:28:58 +00:00
|
|
|
print('Unsupported branch / version combination:')
|
|
|
|
print(f'InvenTree Version: {version}')
|
|
|
|
print('GITHUB_REF_TYPE:', GITHUB_REF_TYPE)
|
|
|
|
print('GITHUB_BASE_REF:', GITHUB_BASE_REF)
|
|
|
|
print('GITHUB_REF:', GITHUB_REF)
|
2022-05-28 23:40:37 +00:00
|
|
|
sys.exit(1)
|
|
|
|
|
2022-05-30 23:50:38 +00:00
|
|
|
if docker_tags is None:
|
2024-01-11 00:28:58 +00:00
|
|
|
print('Docker tags could not be determined')
|
2022-05-28 23:40:37 +00:00
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
print(f"Version check passed for '{version}'!")
|
2022-05-30 23:50:38 +00:00
|
|
|
print(f"Docker tags: '{docker_tags}'")
|
2021-08-07 11:21:09 +00:00
|
|
|
|
2024-08-11 01:03:18 +00:00
|
|
|
target_repos = [REPO.lower(), f'ghcr.io/{REPO.lower()}']
|
|
|
|
|
2022-05-28 23:40:37 +00:00
|
|
|
# Ref: https://getridbug.com/python/how-to-set-environment-variables-in-github-actions-using-python/
|
2024-08-26 23:04:55 +00:00
|
|
|
with open(os.getenv('GITHUB_ENV'), 'a', encoding='utf-8') as env_file:
|
2022-05-30 23:50:38 +00:00
|
|
|
# Construct tag string
|
2024-08-11 01:03:18 +00:00
|
|
|
tag_list = [[f'{r}:{t}' for t in docker_tags] for r in target_repos]
|
|
|
|
tags = ','.join(itertools.chain(*tag_list))
|
2022-05-30 23:50:38 +00:00
|
|
|
|
2024-01-11 00:28:58 +00:00
|
|
|
env_file.write(f'docker_tags={tags}\n')
|
2022-05-30 23:50:38 +00:00
|
|
|
|
|
|
|
if GITHUB_REF_TYPE == 'tag' and highest_release:
|
2024-01-11 00:28:58 +00:00
|
|
|
env_file.write('stable_release=true\n')
|