mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Deduplicate image build tasks
This commit is contained in:
parent
aa230e8ef1
commit
e50662bd80
1 changed files with 14 additions and 7 deletions
|
@ -32,12 +32,13 @@ class DecisionTask:
|
||||||
self.index_service = taskcluster.Index(options={"baseUrl": "http://taskcluster/index/v1/"})
|
self.index_service = taskcluster.Index(options={"baseUrl": "http://taskcluster/index/v1/"})
|
||||||
|
|
||||||
self.now = datetime.datetime.utcnow()
|
self.now = datetime.datetime.utcnow()
|
||||||
|
self.built_images = {}
|
||||||
|
|
||||||
def from_now_json(self, offset):
|
def from_now_json(self, offset):
|
||||||
return taskcluster.stringDate(taskcluster.fromNow(offset, dateObj=self.now))
|
return taskcluster.stringDate(taskcluster.fromNow(offset, dateObj=self.now))
|
||||||
|
|
||||||
def create_task_with_in_tree_dockerfile(self, *, dockerfile, **kwargs):
|
def create_task_with_in_tree_dockerfile(self, *, dockerfile, **kwargs):
|
||||||
image_build_task = self.build_image(dockerfile)
|
image_build_task = self.find_or_build_image(dockerfile)
|
||||||
kwargs.setdefault("dependencies", []).append(image_build_task)
|
kwargs.setdefault("dependencies", []).append(image_build_task)
|
||||||
image = {
|
image = {
|
||||||
"type": "task-image",
|
"type": "task-image",
|
||||||
|
@ -46,10 +47,17 @@ class DecisionTask:
|
||||||
}
|
}
|
||||||
return self.create_task(image=image, **kwargs)
|
return self.create_task(image=image, **kwargs)
|
||||||
|
|
||||||
def build_image(self, dockerfile):
|
def find_or_build_image(self, dockerfile):
|
||||||
|
image_build_task = self.built_images.get(dockerfile)
|
||||||
|
if image_build_task is None:
|
||||||
|
image_build_task = self._find_or_build_image(dockerfile)
|
||||||
|
self.built_images[dockerfile] = image_build_task
|
||||||
|
return image_build_task
|
||||||
|
|
||||||
|
def _find_or_build_image(self, dockerfile):
|
||||||
with open(dockerfile, "rb") as f:
|
with open(dockerfile, "rb") as f:
|
||||||
dockerfile = f.read()
|
dockerfile_contents = f.read()
|
||||||
digest = hashlib.sha256(dockerfile).hexdigest()
|
digest = hashlib.sha256(dockerfile_contents).hexdigest()
|
||||||
route = "%s.docker-image.%s" % (self.route_prefix, digest)
|
route = "%s.docker-image.%s" % (self.route_prefix, digest)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -59,14 +67,14 @@ class DecisionTask:
|
||||||
if e.status_code != 404:
|
if e.status_code != 404:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
image_build_task = self.create_task(
|
return self.create_task(
|
||||||
task_name="docker image build task for image: " + self.image_name(dockerfile),
|
task_name="docker image build task for image: " + self.image_name(dockerfile),
|
||||||
command="""
|
command="""
|
||||||
echo "$DOCKERFILE" | docker build -t taskcluster-built -
|
echo "$DOCKERFILE" | docker build -t taskcluster-built -
|
||||||
docker save taskcluster-built | lz4 > /%s
|
docker save taskcluster-built | lz4 > /%s
|
||||||
""" % self.DOCKER_IMAGE_ARTIFACT_FILENAME,
|
""" % self.DOCKER_IMAGE_ARTIFACT_FILENAME,
|
||||||
env={
|
env={
|
||||||
"DOCKERFILE": dockerfile,
|
"DOCKERFILE": dockerfile_contents,
|
||||||
},
|
},
|
||||||
artifacts=[
|
artifacts=[
|
||||||
("/" + self.DOCKER_IMAGE_ARTIFACT_FILENAME, self.docker_image_cache_expiry),
|
("/" + self.DOCKER_IMAGE_ARTIFACT_FILENAME, self.docker_image_cache_expiry),
|
||||||
|
@ -86,7 +94,6 @@ class DecisionTask:
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
return image_build_task
|
|
||||||
|
|
||||||
def image_name(self, dockerfile):
|
def image_name(self, dockerfile):
|
||||||
basename = os.path.basename(dockerfile)
|
basename = os.path.basename(dockerfile)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue