This commit is contained in:
Simon Sapin 2018-09-13 16:07:45 +02:00
parent 6a011f0e30
commit e566906bef
2 changed files with 119 additions and 116 deletions

View file

@ -1,10 +1,12 @@
# coding: utf8 # coding: utf8
from decisionlib import * from decisionlib import DecisionTask
def main(): def main():
build_task = create_task_with_in_tree_dockerfile( decision = DecisionTask()
build_task = decision.create_task_with_in_tree_dockerfile(
task_name="build task", task_name="build task",
command="./build-task.sh", command="./build-task.sh",
image="servo-x86_64-linux", image="servo-x86_64-linux",
@ -25,7 +27,7 @@ def main():
}, },
) )
create_task( decision.create_task(
task_name="run task", task_name="run task",
command="./run-task.sh", command="./run-task.sh",
image="buildpack-deps:bionic-scm", image="buildpack-deps:bionic-scm",

View file

@ -33,127 +33,128 @@ DOCKER_IMAGE_ARTIFACT_FILENAME = "image.tar.lz4"
REPO = os.path.dirname(__file__) REPO = os.path.dirname(__file__)
def create_task_with_in_tree_dockerfile(*, image, **kwargs): class DecisionTask:
image_build_task = build_image(image) def create_task_with_in_tree_dockerfile(self, *, image, **kwargs):
kwargs.setdefault("dependencies", []).append(image_build_task) image_build_task = self.build_image(image)
image = { kwargs.setdefault("dependencies", []).append(image_build_task)
"type": "task-image", image = {
"taskId": image_build_task, "type": "task-image",
"path": "public/" + DOCKER_IMAGE_ARTIFACT_FILENAME, "taskId": image_build_task,
} "path": "public/" + DOCKER_IMAGE_ARTIFACT_FILENAME,
return create_task(image=image, **kwargs) }
return self.create_task(image=image, **kwargs)
def build_image(image_name): def build_image(self, image_name):
with open(os.path.join(REPO, image_name + ".dockerfile"), "rb") as f: with open(os.path.join(REPO, image_name + ".dockerfile"), "rb") as f:
dockerfile = f.read() dockerfile = f.read()
digest = hashlib.sha256(dockerfile).hexdigest() digest = hashlib.sha256(dockerfile).hexdigest()
route = "project.servo.servo-taskcluster-experiments.docker-image." + digest route = "project.servo.servo-taskcluster-experiments.docker-image." + digest
try: try:
result = INDEX.findTask(route) result = INDEX.findTask(route)
return result["taskId"] return result["taskId"]
except taskcluster.TaskclusterRestFailure as e: except taskcluster.TaskclusterRestFailure as e:
if e.status_code != 404: if e.status_code != 404:
raise raise
image_build_task = create_task( image_build_task = self.create_task(
task_name="docker image build task for image: " + image_name, task_name="docker image build task for image: " + image_name,
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
""" % DOCKER_IMAGE_ARTIFACT_FILENAME, """ % DOCKER_IMAGE_ARTIFACT_FILENAME,
env={ env={
"DOCKERFILE": dockerfile, "DOCKERFILE": dockerfile,
},
artifacts=[
(
DOCKER_IMAGE_ARTIFACT_FILENAME,
"/" + DOCKER_IMAGE_ARTIFACT_FILENAME,
DOCKER_IMAGE_CACHE_EXPIRY
),
],
max_run_time_minutes=20,
image=DOCKER_IMAGE_BUILDER_IMAGE,
features={
"dind": True, # docker-in-docker
},
with_repo=False,
routes=[
"index." + route,
],
extra={
"index": {
"expires": taskcluster.fromNowJSON(DOCKER_IMAGE_CACHE_EXPIRY),
}, },
}, artifacts=[
) (
return image_build_task DOCKER_IMAGE_ARTIFACT_FILENAME,
"/" + DOCKER_IMAGE_ARTIFACT_FILENAME,
DOCKER_IMAGE_CACHE_EXPIRY
def create_task(*, task_name, command, image, max_run_time_minutes, ),
artifacts=None, dependencies=None, env=None, cache=None, scopes=None,
routes=None, extra=None, features=None,
with_repo=True):
env = env or {}
if with_repo:
for k in ["GITHUB_EVENT_CLONE_URL", "GITHUB_EVENT_COMMIT_SHA"]:
env.setdefault(k, os.environ[k])
command = """
git clone $GITHUB_EVENT_CLONE_URL repo
cd repo
git checkout $GITHUB_EVENT_COMMIT_SHA
""" + command
payload = {
"taskGroupId": DECISION_TASK_ID,
"dependencies": [DECISION_TASK_ID] + (dependencies or []),
"schedulerId": "taskcluster-github",
"provisionerId": "aws-provisioner-v1",
"workerType": "servo-docker-worker",
"created": taskcluster.fromNowJSON(""),
"deadline": taskcluster.fromNowJSON("1 day"),
"metadata": {
"name": "%s: %s" % (PROJECT_NAME, task_name),
"description": "",
"owner": os.environ["GITHUB_EVENT_OWNER"],
"source": os.environ["GITHUB_EVENT_SOURCE"],
},
"scopes": scopes or [],
"routes": routes or [],
"extra": extra or {},
"payload": {
"cache": cache or {},
"maxRunTime": max_run_time_minutes * 60,
"image": image,
"command": [
"/bin/bash",
"--login",
"-x",
"-e",
"-c",
deindent(command)
], ],
"env": env, max_run_time_minutes=20,
"artifacts": { image=DOCKER_IMAGE_BUILDER_IMAGE,
"public/" + artifact_name: { features={
"type": "file", "dind": True, # docker-in-docker
"path": path,
"expires": taskcluster.fromNowJSON(expires),
}
for artifact_name, path, expires in artifacts or []
}, },
"features": features or {}, with_repo=False,
}, routes=[
} "index." + route,
],
extra={
"index": {
"expires": taskcluster.fromNowJSON(DOCKER_IMAGE_CACHE_EXPIRY),
},
},
)
return image_build_task
task_id = taskcluster.slugId().decode("utf8")
QUEUE.createTask(task_id, payload) def create_task(self, *, task_name, command, image, max_run_time_minutes,
print("Scheduled %s: %s" % (task_name, task_id)) artifacts=None, dependencies=None, env=None, cache=None, scopes=None,
return task_id routes=None, extra=None, features=None,
with_repo=True):
env = env or {}
if with_repo:
for k in ["GITHUB_EVENT_CLONE_URL", "GITHUB_EVENT_COMMIT_SHA"]:
env.setdefault(k, os.environ[k])
command = """
git clone $GITHUB_EVENT_CLONE_URL repo
cd repo
git checkout $GITHUB_EVENT_COMMIT_SHA
""" + command
payload = {
"taskGroupId": DECISION_TASK_ID,
"dependencies": [DECISION_TASK_ID] + (dependencies or []),
"schedulerId": "taskcluster-github",
"provisionerId": "aws-provisioner-v1",
"workerType": "servo-docker-worker",
"created": taskcluster.fromNowJSON(""),
"deadline": taskcluster.fromNowJSON("1 day"),
"metadata": {
"name": "%s: %s" % (PROJECT_NAME, task_name),
"description": "",
"owner": os.environ["GITHUB_EVENT_OWNER"],
"source": os.environ["GITHUB_EVENT_SOURCE"],
},
"scopes": scopes or [],
"routes": routes or [],
"extra": extra or {},
"payload": {
"cache": cache or {},
"maxRunTime": max_run_time_minutes * 60,
"image": image,
"command": [
"/bin/bash",
"--login",
"-x",
"-e",
"-c",
deindent(command)
],
"env": env,
"artifacts": {
"public/" + artifact_name: {
"type": "file",
"path": path,
"expires": taskcluster.fromNowJSON(expires),
}
for artifact_name, path, expires in artifacts or []
},
"features": features or {},
},
}
task_id = taskcluster.slugId().decode("utf8")
QUEUE.createTask(task_id, payload)
print("Scheduled %s: %s" % (task_name, task_id))
return task_id
def deindent(string): def deindent(string):