Merge pull request #1519 from shin-/brew-more

Docker-brew 0.5.2 support and memory footprint reduction
This commit is contained in:
Joffrey F 2013-08-14 10:40:05 -07:00
commit 12ffb522a6
3 changed files with 45 additions and 7 deletions

View File

@ -14,6 +14,7 @@ logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
level='INFO') level='INFO')
client = docker.Client() client = docker.Client()
processed = {} processed = {}
processed_folders = []
def build_library(repository=None, branch=None, namespace=None, push=False, def build_library(repository=None, branch=None, namespace=None, push=False,
@ -31,19 +32,34 @@ def build_library(repository=None, branch=None, namespace=None, push=False,
logger.info('Repository provided assumed to be a local path') logger.info('Repository provided assumed to be a local path')
dst_folder = repository dst_folder = repository
try:
client.version()
except Exception as e:
logger.error('Could not reach the docker daemon. Please make sure it '
'is running.')
logger.warning('Also make sure you have access to the docker UNIX '
'socket (use sudo)')
return
#FIXME: set destination folder and only pull latest changes instead of #FIXME: set destination folder and only pull latest changes instead of
# cloning the whole repo everytime # cloning the whole repo everytime
if not dst_folder: if not dst_folder:
logger.info('Cloning docker repo from {0}, branch: {1}'.format( logger.info('Cloning docker repo from {0}, branch: {1}'.format(
repository, branch)) repository, branch))
try: try:
dst_folder = git.clone_branch(repository, branch) rep, dst_folder = git.clone_branch(repository, branch)
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
logger.error('Source repository could not be fetched. Check ' logger.error('Source repository could not be fetched. Check '
'that the address is correct and the branch exists.') 'that the address is correct and the branch exists.')
return return
for buildfile in os.listdir(os.path.join(dst_folder, 'library')): try:
dirlist = os.listdir(os.path.join(dst_folder, 'library'))
except OSError as e:
logger.error('The path provided ({0}) could not be found or didn\'t'
'contain a library/ folder.'.format(dst_folder))
return
for buildfile in dirlist:
if buildfile == 'MAINTAINERS': if buildfile == 'MAINTAINERS':
continue continue
f = open(os.path.join(dst_folder, 'library', buildfile)) f = open(os.path.join(dst_folder, 'library', buildfile))
@ -92,20 +108,27 @@ def build_library(repository=None, branch=None, namespace=None, push=False,
f.close() f.close()
if dst_folder != repository: if dst_folder != repository:
rmtree(dst_folder, True) rmtree(dst_folder, True)
for d in processed_folders:
rmtree(d, True)
summary.print_summary(logger) summary.print_summary(logger)
def build_repo(repository, ref, docker_repo, docker_tag, namespace, push, registry): def build_repo(repository, ref, docker_repo, docker_tag, namespace, push, registry):
docker_repo = '{0}/{1}'.format(namespace or 'library', docker_repo) docker_repo = '{0}/{1}'.format(namespace or 'library', docker_repo)
img_id = None img_id = None
dst_folder = None
if '{0}@{1}'.format(repository, ref) not in processed.keys(): if '{0}@{1}'.format(repository, ref) not in processed.keys():
logger.info('Cloning {0} (ref: {1})'.format(repository, ref)) logger.info('Cloning {0} (ref: {1})'.format(repository, ref))
dst_folder = git.clone(repository, ref) if repository not in processed:
rep, dst_folder = git.clone(repository, ref)
processed[repository] = rep
processed_folders.append(dst_folder)
else:
dst_folder = git.checkout(processed[repository], ref)
if not 'Dockerfile' in os.listdir(dst_folder): if not 'Dockerfile' in os.listdir(dst_folder):
raise RuntimeError('Dockerfile not found in cloned repository') raise RuntimeError('Dockerfile not found in cloned repository')
logger.info('Building using dockerfile...') logger.info('Building using dockerfile...')
img_id, logs = client.build(path=dst_folder, quiet=True) img_id, logs = client.build(path=dst_folder, quiet=True)
rmtree(dst_folder, True)
else: else:
img_id = processed['{0}@{1}'.format(repository, ref)] img_id = processed['{0}@{1}'.format(repository, ref)]
logger.info('Committing to {0}:{1}'.format(docker_repo, logger.info('Committing to {0}:{1}'.format(docker_repo,

View File

@ -16,6 +16,21 @@ def clone_tag(repo_url, tag, folder=None):
return clone(repo_url, 'refs/tags/' + tag, folder) return clone(repo_url, 'refs/tags/' + tag, folder)
def checkout(rep, ref=None):
is_commit = False
if ref is None:
ref = 'refs/heads/master'
elif not ref.startswith('refs/'):
is_commit = True
if is_commit:
rep['HEAD'] = rep.commit(ref)
else:
rep['HEAD'] = rep.refs[ref]
indexfile = rep.index_path()
tree = rep["HEAD"].tree
index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree)
return rep.path
def clone(repo_url, ref=None, folder=None): def clone(repo_url, ref=None, folder=None):
is_commit = False is_commit = False
if ref is None: if ref is None:
@ -45,4 +60,4 @@ def clone(repo_url, ref=None, folder=None):
tree = rep["HEAD"].tree tree = rep["HEAD"].tree
index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree) index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree)
logger.debug("done") logger.debug("done")
return folder return rep, folder

View File

@ -1,2 +1,2 @@
dulwich==0.9.0 dulwich==0.9.0
docker-py==0.1.3 docker-py==0.1.4