images.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from __future__ import absolute_import
  2. from __future__ import print_function
  3. from __future__ import unicode_literals
  4. import os
  5. import shutil
  6. import docker
  7. from .const import REPO_ROOT
  8. from .utils import ScriptError
  9. class ImageManager(object):
  10. def __init__(self, version):
  11. self.docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
  12. self.version = version
  13. def build_images(self, repository, files):
  14. print("Building release images...")
  15. repository.write_git_sha()
  16. docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
  17. distdir = os.path.join(REPO_ROOT, 'dist')
  18. os.makedirs(distdir, exist_ok=True)
  19. shutil.copy(files['docker-compose-Linux-x86_64'][0], distdir)
  20. os.chmod(os.path.join(distdir, 'docker-compose-Linux-x86_64'), 0o755)
  21. print('Building docker/compose image')
  22. logstream = docker_client.build(
  23. REPO_ROOT, tag='docker/compose:{}'.format(self.version), dockerfile='Dockerfile.run',
  24. decode=True
  25. )
  26. for chunk in logstream:
  27. if 'error' in chunk:
  28. raise ScriptError('Build error: {}'.format(chunk['error']))
  29. if 'stream' in chunk:
  30. print(chunk['stream'], end='')
  31. print('Building test image (for UCP e2e)')
  32. logstream = docker_client.build(
  33. REPO_ROOT, tag='docker-compose-tests:tmp', decode=True
  34. )
  35. for chunk in logstream:
  36. if 'error' in chunk:
  37. raise ScriptError('Build error: {}'.format(chunk['error']))
  38. if 'stream' in chunk:
  39. print(chunk['stream'], end='')
  40. container = docker_client.create_container(
  41. 'docker-compose-tests:tmp', entrypoint='tox'
  42. )
  43. docker_client.commit(container, 'docker/compose-tests', 'latest')
  44. docker_client.tag('docker/compose-tests:latest', 'docker/compose-tests:{}'.format(self.version))
  45. docker_client.remove_container(container, force=True)
  46. docker_client.remove_image('docker-compose-tests:tmp', force=True)
  47. @property
  48. def image_names(self):
  49. return [
  50. 'docker/compose-tests:latest',
  51. 'docker/compose-tests:{}'.format(self.version),
  52. 'docker/compose:{}'.format(self.version)
  53. ]
  54. def check_images(self, version):
  55. docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
  56. for name in self.image_names:
  57. try:
  58. docker_client.inspect_image(name)
  59. except docker.errors.ImageNotFound:
  60. print('Expected image {} was not found'.format(name))
  61. return False
  62. return True
  63. def push_images(self):
  64. docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
  65. for name in self.image_names:
  66. print('Pushing {} to Docker Hub'.format(name))
  67. logstream = docker_client.push(name, stream=True, decode=True)
  68. for chunk in logstream:
  69. if 'status' in chunk:
  70. print(chunk['status'])
  71. if 'error' in chunk:
  72. raise ScriptError(
  73. 'Error pushing {name}: {err}'.format(name=name, err=chunk['error'])
  74. )