Merge remote-tracking branch 'origin/docker-speedup' into integration_2025_wk26 (!3349)
Speed up docker deployment in CI - Using docker compose up --wait instead of a custom healthcheck script: from: https://docs.docker.com/reference/cli/docker/compose/up/ --wait Wait for services to be running|healthy. Implies detached mode. --wait-timeout Maximum duration in seconds to wait for the project to be running|healthy - Speeding up the healthchecks by reducing the interval from 1-10s to 0.5s during start period start_period creates a special period after the start of the container where the healthcheck is executed every start_interval . During this time the failures do not count towards the retries counter, but successes change the status to healthy. This allows container to reach healthy status much sooner. - Using init: true to speed up docker compose down/stop `init: true` initializes the docker container with tini or alternative: tini is used to collect all the processes and correctly pass the termination signal to them. This allows the docker container to be stopped without waiting 10 seconds to kill the container - Smallest example of this is: services: test-init: image: ubuntu:jammy command: sleep 10d
This commit is contained in:
@@ -152,19 +152,6 @@ def GetImageName(ssh, svcName, file):
|
||||
else:
|
||||
return ret.stdout.strip()
|
||||
|
||||
def GetServiceHealth(ssh, svcName, file):
|
||||
if svcName is None:
|
||||
return False, f"Service {svcName} not found in {file}"
|
||||
image = GetImageName(ssh, svcName, file)
|
||||
if 'db_init' in svcName or 'db-init' in svcName: # exits with 0, there cannot be healthy
|
||||
return True, f"Service {svcName} healthy, image {image}"
|
||||
for _ in range(8):
|
||||
result = ssh.run(f"docker compose -f {file} ps --format json {svcName} | jq -r 'if type==\"array\" then .[0].Health else .Health end'", silent=True)
|
||||
if result.stdout == 'healthy':
|
||||
return True, f"Service {svcName} healthy, image {image}"
|
||||
time.sleep(5)
|
||||
return False, f"Failed to deploy: service {svcName}"
|
||||
|
||||
def ExistEnvFilePrint(ssh, wd, prompt='env vars in existing'):
|
||||
ret = ssh.run(f'cat {wd}/.env', silent=True, reportNonZero=False)
|
||||
if ret.returncode != 0:
|
||||
@@ -311,7 +298,6 @@ class Containerize():
|
||||
self.yamlPath = ['', '', '']
|
||||
self.services = ['', '', '']
|
||||
self.deploymentTag = ''
|
||||
self.eNB_logFile = ['', '', '']
|
||||
|
||||
self.testCase_id = ''
|
||||
|
||||
@@ -320,17 +306,6 @@ class Containerize():
|
||||
self.dockerfileprefix = ''
|
||||
self.host = ''
|
||||
|
||||
self.deployedContainers = []
|
||||
self.tsharkStarted = False
|
||||
self.pingContName = ''
|
||||
self.pingOptions = ''
|
||||
self.pingLossThreshold = ''
|
||||
self.svrContName = ''
|
||||
self.svrOptions = ''
|
||||
self.cliContName = ''
|
||||
self.cliOptions = ''
|
||||
|
||||
self.imageToCopy = ''
|
||||
#checkers from xml
|
||||
self.ran_checkers={}
|
||||
self.num_attempts = 1
|
||||
@@ -872,31 +847,24 @@ class Containerize():
|
||||
if num_attempts <= 0:
|
||||
raise ValueError(f'Invalid value for num_attempts: {num_attempts}, must be greater than 0')
|
||||
for attempt in range(num_attempts):
|
||||
imagesInfo = []
|
||||
healthInfo = []
|
||||
logging.info(f'will start services {services}')
|
||||
status = ssh.run(f'docker compose -f {wd_yaml} up -d -- {services}')
|
||||
if status.returncode != 0:
|
||||
status = ssh.run(f'docker compose -f {wd_yaml} up -d --wait --wait-timeout 60 -- {services}')
|
||||
info = ssh.run(f"docker compose -f {wd_yaml} ps --all --format=\'table {{{{.Service}}}} [{{{{.Image}}}}] {{{{.Status}}}}\' -- {services} | column -t")
|
||||
deployed = status.returncode == 0
|
||||
if not deployed:
|
||||
msg = f'cannot deploy services {services}: {status.stdout}'
|
||||
logging.error(msg)
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'NOK', [msg])
|
||||
return False
|
||||
for svc in services.split():
|
||||
health, msg = GetServiceHealth(ssh, svc, f'{wd_yaml}')
|
||||
logging.info(msg)
|
||||
imagesInfo.append(msg)
|
||||
healthInfo.append(health)
|
||||
deployed = all(healthInfo)
|
||||
if deployed:
|
||||
else:
|
||||
break
|
||||
elif (attempt < num_attempts - 1):
|
||||
warning_msg = f'Restart services {services}'
|
||||
if (attempt < num_attempts - 1):
|
||||
warning_msg = (f'Failed to deploy on attempt {attempt}, restart services {services}')
|
||||
logging.warning(warning_msg)
|
||||
imagesInfo.append(warning_msg)
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'NOK', ['\n'.join(imagesInfo)])
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'NOK', [warning_msg])
|
||||
for svc in services.split():
|
||||
CopyinServiceLog(ssh, lSourcePath, yaml_dir, svc, wd_yaml, f'{svc}-{HTML.testCase_id}-attempt{attempt}.log')
|
||||
ssh.run(f'docker compose -f {wd_yaml} down -- {services}')
|
||||
imagesInfo = info.stdout.splitlines()[1:]
|
||||
logging.debug(f'{info.stdout.splitlines()[1:]}')
|
||||
if deployed:
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'OK', ['\n'.join(imagesInfo)])
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user