瀏覽代碼

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

Docker-brew 0.5.2 support and memory footprint reduction
Joffrey F 12 年之前
父節點
當前提交
12ffb522a6
共有 3 個文件被更改,包括 45 次插入7 次删除
  1. 28 5
      contrib/brew/brew/brew.py
  2. 16 1
      contrib/brew/brew/git.py
  3. 1 1
      contrib/brew/requirements.txt

+ 28 - 5
contrib/brew/brew/brew.py

@@ -14,6 +14,7 @@ logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
                     level='INFO')
 client = docker.Client()
 processed = {}
+processed_folders = []
 
 
 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')
         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
     # cloning the whole repo everytime
     if not dst_folder:
         logger.info('Cloning docker repo from {0}, branch: {1}'.format(
             repository, branch))
         try:
-            dst_folder = git.clone_branch(repository, branch)
+            rep, dst_folder = git.clone_branch(repository, branch)
         except Exception as e:
             logger.exception(e)
             logger.error('Source repository could not be fetched. Check '
                 'that the address is correct and the branch exists.')
             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':
             continue
         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()
     if dst_folder != repository:
         rmtree(dst_folder, True)
+    for d in processed_folders:
+        rmtree(d, True)
     summary.print_summary(logger)
 
 
 def build_repo(repository, ref, docker_repo, docker_tag, namespace, push, registry):
     docker_repo = '{0}/{1}'.format(namespace or 'library', docker_repo)
     img_id = None
+    dst_folder = None
     if '{0}@{1}'.format(repository, ref) not in processed.keys():
         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):
             raise RuntimeError('Dockerfile not found in cloned repository')
         logger.info('Building using dockerfile...')
         img_id, logs = client.build(path=dst_folder, quiet=True)
-        rmtree(dst_folder, True)
     else:
         img_id = processed['{0}@{1}'.format(repository, ref)]
     logger.info('Committing to {0}:{1}'.format(docker_repo,
@@ -159,4 +182,4 @@ class Summary(object):
         if logger:
             logger.info(s + success + details)
         else:
-            print s, success, details
+            print s, success, details

+ 16 - 1
contrib/brew/brew/git.py

@@ -16,6 +16,21 @@ def clone_tag(repo_url, tag, folder=None):
     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):
     is_commit = False
     if ref is None:
@@ -45,4 +60,4 @@ def clone(repo_url, ref=None, folder=None):
     tree = rep["HEAD"].tree
     index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree)
     logger.debug("done")
-    return folder
+    return rep, folder

+ 1 - 1
contrib/brew/requirements.txt

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