in scripts/setup.py [0:0]
def get_docker_image_meta(build=False):
image = 'mozilla/addons-server'
version = 'local'
digest = None
# First get the tag from the full tag variable
tag = get_value('DOCKER_TAG', f'{image}:{version}')
# extract version or digest from existing tag
if '@' in tag:
image, digest = tag.split('@')
version = None
elif ':' in tag:
image, version = tag.split(':')
# DOCKER_DIGEST or DOCKER_VERSION can override the extracted version or digest
# Note: it will inherit the image from the provided DOCKER_TAG if also provided
if bool(os.environ.get('DOCKER_DIGEST', False)):
digest = os.environ['DOCKER_DIGEST']
tag = f'{image}@{digest}'
version = None
elif bool(os.environ.get('DOCKER_VERSION', False)):
version = os.environ['DOCKER_VERSION']
tag = f'{image}:{version}'
is_local = version == 'local' and digest is None
docker_target = (
get_value('DOCKER_TARGET', 'development')
if is_local
else os.environ.get('DOCKER_TARGET', 'production')
)
is_production = docker_target == 'production'
docker_commit = os.environ.get('DOCKER_COMMIT')
docker_build = os.environ.get('DOCKER_BUILD')
valid_version_digest = (version and not digest) or (digest and not version)
valid_docker_target = is_production or (is_local and not build)
def valid_build_commit(value):
# We don't care what the value is in local images
if is_local:
return True
# When building, the value is required
# to be written to the build-info.json
elif build:
return bool(value)
# When running (on production), the value is forbidden
# it was defined in the build-info.json
elif is_production:
return not bool(value)
# Define metadata and define if the value is valid
data = {
# Docker tag is always required but often derived from other inputs
'DOCKER_TAG': (tag, tag is not None),
# Docker version and digest are mutually exclusive
# exactly and only one should be set
'DOCKER_VERSION': (version, valid_version_digest),
'DOCKER_DIGEST': (digest, valid_version_digest),
# Docker target can be set on local images,
# but should be production for remote images.
# Remote images are always built for production.
'DOCKER_TARGET': (docker_target, valid_docker_target),
# Docker commit and build are:
# - optional for non production images
# - forbidden on remote images (already defined in the build-info.json)
'DOCKER_COMMIT': (docker_commit, valid_build_commit(docker_commit)),
'DOCKER_BUILD': (docker_build, valid_build_commit(docker_build)),
}
errors = {}
meta = {}
for key, (value, valid) in data.items():
# Add defined values to meta
if value:
meta[key] = value
# Add invalid values to errors
if not valid:
errors[key] = value
if len(errors.keys()):
raise ValueError(
f'\n{json.dumps(meta, indent=2)}\n'
f'Invalid items: check setup.py for validations (build={build})'
'\n• ' + '\n• '.join(errors.keys())
)
return meta