|
@@ -1,3 +1,4 @@
|
|
|
|
|
+import hashlib
|
|
|
import logging
|
|
import logging
|
|
|
import os
|
|
import os
|
|
|
import random
|
|
import random
|
|
@@ -116,7 +117,6 @@ def build_library(repository=None, branch=None, namespace=None, push=False,
|
|
|
namespace, push, registry,
|
|
namespace, push, registry,
|
|
|
repos_folder, logger)
|
|
repos_folder, logger)
|
|
|
summary.add_success(buildfile, (linecnt, line), img, commit)
|
|
summary.add_success(buildfile, (linecnt, line), img, commit)
|
|
|
- processed['{0}@{1}'.format(url, ref)] = img
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
logger.exception(e)
|
|
logger.exception(e)
|
|
|
summary.add_exception(buildfile, (linecnt, line), e)
|
|
summary.add_exception(buildfile, (linecnt, line), e)
|
|
@@ -170,6 +170,13 @@ def _random_suffix():
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def get_repo_hash(repo_url, ref, df_location):
|
|
|
|
|
+ h = hashlib.md5(repo_url)
|
|
|
|
|
+ h.update(ref)
|
|
|
|
|
+ h.update(df_location)
|
|
|
|
|
+ return h.hexdigest()
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def build_repo(repository, ref, docker_repo, dockerfile_location,
|
|
def build_repo(repository, ref, docker_repo, dockerfile_location,
|
|
|
docker_tag, namespace, push, registry, repos_folder, logger):
|
|
docker_tag, namespace, push, registry, repos_folder, logger):
|
|
|
''' Builds one line of a library file.
|
|
''' Builds one line of a library file.
|
|
@@ -188,23 +195,23 @@ def build_repo(repository, ref, docker_repo, dockerfile_location,
|
|
|
dst_folder = None
|
|
dst_folder = None
|
|
|
img_id = None
|
|
img_id = None
|
|
|
commit_id = None
|
|
commit_id = None
|
|
|
|
|
+ repo_hash = get_repo_hash(repository, ref, dockerfile_location)
|
|
|
if repos_folder:
|
|
if repos_folder:
|
|
|
# Repositories are stored in a fixed location and can be reused
|
|
# Repositories are stored in a fixed location and can be reused
|
|
|
dst_folder = os.path.join(repos_folder, docker_repo + _random_suffix())
|
|
dst_folder = os.path.join(repos_folder, docker_repo + _random_suffix())
|
|
|
docker_repo = '{0}/{1}'.format(namespace or 'library', docker_repo)
|
|
docker_repo = '{0}/{1}'.format(namespace or 'library', docker_repo)
|
|
|
|
|
|
|
|
- if '{0}@{1}'.format(repository, ref) in processed.keys() or\
|
|
|
|
|
- '{0}@{1}'.format(repository, 'refs/tags' + ref) in processed.keys():
|
|
|
|
|
- if '{0}@{1}'.format(repository, ref) not in processed.keys():
|
|
|
|
|
- ref = 'refs/tags/' + ref
|
|
|
|
|
|
|
+ if repo_hash in processed.keys():
|
|
|
|
|
+ logger.info('[cache hit] {0}'.format(repo_hash))
|
|
|
logger.info('This ref has already been built, reusing image ID')
|
|
logger.info('This ref has already been built, reusing image ID')
|
|
|
- img_id = processed['{0}@{1}'.format(repository, ref)]
|
|
|
|
|
|
|
+ img_id = processed[repo_hash]
|
|
|
if ref.startswith('refs/'):
|
|
if ref.startswith('refs/'):
|
|
|
commit_id = processed[repository].ref(ref)
|
|
commit_id = processed[repository].ref(ref)
|
|
|
else:
|
|
else:
|
|
|
commit_id = ref
|
|
commit_id = ref
|
|
|
else:
|
|
else:
|
|
|
# Not already built
|
|
# Not already built
|
|
|
|
|
+ logger.info('[cache miss] {0}'.format(repo_hash))
|
|
|
rep = None
|
|
rep = None
|
|
|
logger.info('Cloning {0} (ref: {1})'.format(repository, ref))
|
|
logger.info('Cloning {0} (ref: {1})'.format(repository, ref))
|
|
|
if repository not in processed: # Repository not cloned yet
|
|
if repository not in processed: # Repository not cloned yet
|
|
@@ -245,6 +252,8 @@ def build_repo(repository, ref, docker_repo, dockerfile_location,
|
|
|
logger.info('Committing to {0}:{1}'.format(docker_repo,
|
|
logger.info('Committing to {0}:{1}'.format(docker_repo,
|
|
|
docker_tag or 'latest'))
|
|
docker_tag or 'latest'))
|
|
|
client.tag(img_id, docker_repo, docker_tag)
|
|
client.tag(img_id, docker_repo, docker_tag)
|
|
|
|
|
+ logger.info("Registering as processed: {0}".format(repo_hash))
|
|
|
|
|
+ processed[repo_hash] = img_id
|
|
|
if push:
|
|
if push:
|
|
|
logger.info('Pushing result to registry {0}'.format(
|
|
logger.info('Pushing result to registry {0}'.format(
|
|
|
registry or "default"))
|
|
registry or "default"))
|