├── .gitignore ├── .taskcluster.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── gulpfile.js ├── layout ├── followup.pug ├── footer.pug ├── head.pug ├── layout.pug ├── navbar.pug ├── pager.pug ├── reference.pug ├── schema.pug └── sidebar.pug ├── lib ├── filter.js ├── headers.js ├── make-redirects.js ├── navlinks.js ├── nginx-site.conf.ejs ├── pug.js ├── raw.js ├── render-schemas.js ├── s3.js ├── static.js ├── sts.js ├── userlist.js └── utils.js ├── package.json ├── redirects.yml ├── src ├── assets │ ├── JSONFormatter │ │ ├── JSONFormatter.css │ │ ├── JSONFormatter.js │ │ ├── Minus.png │ │ └── Plus.png │ ├── ace │ │ ├── ace.js │ │ ├── mode-javascript.js │ │ ├── mode-json.js │ │ ├── mode-markdown.js │ │ ├── mode-sh.js │ │ ├── theme-github.js │ │ ├── worker-javascript.js │ │ └── worker-json.js │ ├── anchorjs.min.js │ ├── bookworm-penguin.svg │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ │ └── bootstrap.min.js │ ├── bundle.js │ ├── ejs_production.js │ ├── favicon.ico │ ├── jquery.min.js │ ├── jsonform.js │ ├── marked.js │ ├── principles.svg │ ├── prism.css │ ├── promise.js │ ├── raphael-min.js │ ├── sequence-diagram-min.js │ ├── style.css │ ├── task-graph-inspector │ │ └── task-node.ejs │ ├── taskcluster-180.png │ ├── taskcluster-36.png │ ├── taskcluster.svg │ ├── tools-taskcluster-net-thumbnail.png │ └── underscore-min.js ├── error.md ├── index.md ├── manual │ ├── design │ │ ├── apis │ │ │ ├── errors.md │ │ │ ├── hawk │ │ │ │ ├── authn.md │ │ │ │ ├── authorized-scopes.md │ │ │ │ ├── clients.md │ │ │ │ ├── index.md │ │ │ │ ├── roles.md │ │ │ │ ├── scopes.md │ │ │ │ ├── signed-urls.md │ │ │ │ ├── temporary-credentials.md │ │ │ │ └── troubleshooting.md │ │ │ ├── index.md │ │ │ ├── pulse.md │ │ │ └── reference-format.md │ │ ├── devel │ │ │ ├── best-practices │ │ │ │ ├── commits.md │ │ │ │ ├── index.md │ │ │ │ ├── libraries.md │ │ │ │ ├── microservices.md │ │ │ │ ├── scopes.md │ │ │ │ └── testing.md │ │ │ ├── idempotency.md │ │ │ ├── index.md │ │ │ ├── principles.md │ │ │ └── rfcs.md │ │ ├── env-vars.md │ │ ├── index.md │ │ └── namespaces.md │ ├── index.md │ ├── task-execution │ │ ├── index.md │ │ ├── provisioning.md │ │ ├── queues.md │ │ ├── worker-types.md │ │ └── workers.md │ ├── tasks │ │ ├── artifacts.md │ │ ├── dependencies.md │ │ ├── index.md │ │ ├── manipulating.md │ │ ├── messages.md │ │ ├── priority.md │ │ ├── runs.md │ │ ├── scopes.md │ │ ├── taskgroupid-schedulerid.md │ │ ├── times.md │ │ └── workertypes.md │ └── using │ │ ├── actions │ │ ├── guidelines.md │ │ ├── index.md │ │ ├── spec.md │ │ └── ui.md │ │ ├── administration.md │ │ ├── artifacts.md │ │ ├── caching.md │ │ ├── github.md │ │ ├── handling-high-load.md │ │ ├── index.md │ │ ├── indexing.md │ │ ├── integration │ │ ├── backend.md │ │ ├── frontend.md │ │ ├── guidelines.md │ │ ├── index.md │ │ ├── libraries.md │ │ └── pulse.md │ │ ├── s3-uploads.md │ │ ├── scheduled-tasks.md │ │ ├── secrets.md │ │ ├── task-graph.md │ │ └── task-notifications.md ├── people.pug ├── presentations │ ├── TC-101 │ │ ├── index.html │ │ └── slides │ │ │ ├── developer_workflow │ │ │ ├── common_problems.md │ │ │ ├── decision_task.md │ │ │ ├── docker_tips.md │ │ │ ├── how_did_those_jobs.md │ │ │ ├── images │ │ │ │ ├── interactive.png │ │ │ │ ├── run_locally.png │ │ │ │ ├── task_inspector_failed_task.png │ │ │ │ ├── treeherder.png │ │ │ │ ├── treeherder1.png │ │ │ │ └── treeherder_job_details_annotation.png │ │ │ ├── run_locally.md │ │ │ ├── run_locally_environment.md │ │ │ ├── struggle_intro.md │ │ │ ├── task_failed.md │ │ │ ├── task_inspector_edit_task.md │ │ │ ├── task_interactive.md │ │ │ ├── treeherder.md │ │ │ ├── treeherder_job_details.md │ │ │ └── workflow.md │ │ │ ├── end.md │ │ │ ├── high-level-arch.md │ │ │ ├── migration-roadmap.md │ │ │ ├── tc-roadmap.md │ │ │ ├── team.md │ │ │ ├── what-is-task.md │ │ │ ├── what-is-tc.md │ │ │ └── why-tc.md │ ├── TC-102 │ │ ├── index.html │ │ └── slides │ │ │ ├── end.md │ │ │ ├── hooks │ │ │ ├── 00-frontpage.md │ │ │ ├── 01-cron.md │ │ │ ├── 02-creating.md │ │ │ └── 03-scopes.md │ │ │ ├── intree-config │ │ │ ├── 00-frontpage.md │ │ │ ├── 01-taskcluster.md │ │ │ ├── 02-overview.md │ │ │ ├── 03-scopes.md │ │ │ ├── 04-routes.md │ │ │ ├── 05-treeherder.md │ │ │ ├── 06-payload.md │ │ │ ├── 07-branch.md │ │ │ ├── 08-branch.md │ │ │ ├── 09-running.md │ │ │ └── images │ │ │ │ └── treeherder.jpg │ │ │ ├── intree-image │ │ │ ├── 00-frontpage.md │ │ │ ├── 01-docker-image.md │ │ │ ├── 02-task-image.md │ │ │ ├── 03-image-workflow.md │ │ │ ├── 04-task-definition.md │ │ │ ├── 05-dockerfile-before.md │ │ │ ├── 06-dockerfile-after.md │ │ │ ├── 07-example-push.md │ │ │ ├── 08-treeherder1.md │ │ │ ├── 09-treeherder2.md │ │ │ ├── 10-treeherder3.md │ │ │ └── images │ │ │ │ ├── decision_task.png │ │ │ │ ├── dependent_tasks.png │ │ │ │ └── image_task.png │ │ │ ├── provisioner │ │ │ ├── 00-frontpage.md │ │ │ ├── 01-overview.md │ │ │ ├── 02-provisioning-algorithm.md │ │ │ ├── 03-provisioning-bidding.md │ │ │ ├── 04-killing.md │ │ │ └── 05-breakage.md │ │ │ ├── secrets │ │ │ ├── 00-frontpage.md │ │ │ ├── 01-options.md │ │ │ └── 02-api.md │ │ │ ├── tc-clients │ │ │ ├── 00.md │ │ │ ├── 01.md │ │ │ ├── 02.md │ │ │ ├── 03.md │ │ │ ├── 04.md │ │ │ ├── 05.md │ │ │ ├── 06.md │ │ │ ├── 07.md │ │ │ ├── 08.md │ │ │ ├── 09.md │ │ │ ├── 10.md │ │ │ ├── 11.md │ │ │ ├── 12.md │ │ │ ├── 13.md │ │ │ ├── 14.md │ │ │ ├── 15.md │ │ │ ├── 16.md │ │ │ ├── 17.md │ │ │ ├── 18.md │ │ │ ├── 19.md │ │ │ ├── 20.md │ │ │ └── 21.md │ │ │ ├── tcgh │ │ │ ├── 00-frontpage.md │ │ │ ├── 01-tcgh.md │ │ │ └── 02-tcrc.md │ │ │ └── test.py │ ├── TC-201 │ │ ├── index.html │ │ └── slides │ │ │ ├── auth.md │ │ │ ├── components.md │ │ │ ├── docker-worker-artifact.md │ │ │ ├── docker-worker-interactive.md │ │ │ ├── docker-worker-livelog.md │ │ │ ├── docker-worker.md │ │ │ ├── docker.md │ │ │ ├── end.md │ │ │ ├── self-serve.md │ │ │ ├── service-design.md │ │ │ ├── star-scopes.md │ │ │ ├── worker-life-cycle.md │ │ │ └── worker-types.md │ ├── in-tree-taskgraphs │ │ ├── CHANGELOG.md │ │ ├── MIT-license.txt │ │ ├── Makefile │ │ ├── README.md │ │ ├── core │ │ │ ├── deck.core.css │ │ │ ├── deck.core.js │ │ │ ├── deck.core.scss │ │ │ ├── print.css │ │ │ └── print.scss │ │ ├── extensions │ │ │ ├── goto │ │ │ │ ├── deck.goto.css │ │ │ │ ├── deck.goto.html │ │ │ │ ├── deck.goto.js │ │ │ │ └── deck.goto.scss │ │ │ ├── menu │ │ │ │ ├── deck.menu.css │ │ │ │ ├── deck.menu.js │ │ │ │ └── deck.menu.scss │ │ │ ├── navigation │ │ │ │ ├── deck.navigation.css │ │ │ │ ├── deck.navigation.html │ │ │ │ ├── deck.navigation.js │ │ │ │ └── deck.navigation.scss │ │ │ ├── scale │ │ │ │ ├── deck.scale.css │ │ │ │ ├── deck.scale.js │ │ │ │ └── deck.scale.scss │ │ │ └── status │ │ │ │ ├── deck.status.css │ │ │ │ ├── deck.status.html │ │ │ │ ├── deck.status.js │ │ │ │ └── deck.status.scss │ │ ├── index.html │ │ ├── introduction │ │ │ └── index.html │ │ ├── jquery.min.js │ │ ├── kinds.svg │ │ ├── modernizr.custom.js │ │ ├── test │ │ │ ├── fixtures │ │ │ │ ├── empty.html │ │ │ │ ├── nesteds.html │ │ │ │ └── standard.html │ │ │ ├── index.html │ │ │ ├── lib │ │ │ │ ├── jasmine-html.js │ │ │ │ ├── jasmine-jquery.js │ │ │ │ ├── jasmine.css │ │ │ │ └── jasmine.js │ │ │ ├── settings.js │ │ │ ├── spec.core.js │ │ │ ├── spec.goto.js │ │ │ ├── spec.menu.js │ │ │ ├── spec.navigation.js │ │ │ ├── spec.scale.js │ │ │ └── spec.status.js │ │ ├── themes │ │ │ ├── style │ │ │ │ ├── _reset.scss │ │ │ │ ├── neon.css │ │ │ │ ├── neon.scss │ │ │ │ ├── swiss.css │ │ │ │ ├── swiss.scss │ │ │ │ ├── web-2.0.css │ │ │ │ └── web-2.0.scss │ │ │ └── transition │ │ │ │ ├── fade.css │ │ │ │ ├── fade.scss │ │ │ │ ├── horizontal-slide.css │ │ │ │ ├── horizontal-slide.scss │ │ │ │ ├── vertical-slide.css │ │ │ │ └── vertical-slide.scss │ │ └── try-D.png │ ├── index.md │ ├── intro-talk │ │ ├── api-setup.svg │ │ ├── artifact-upload-2.svg │ │ ├── artifact-upload.svg │ │ ├── azure-table.svg │ │ ├── bb-world.svg │ │ ├── code-focus.js │ │ ├── index.html │ │ ├── interactive.svg │ │ ├── layers.svg │ │ ├── layers1.svg │ │ ├── life-cycle-2-svg.svg │ │ ├── life-cycle-2.svg │ │ ├── life-cycle.svg │ │ ├── livelog-redirect.svg │ │ ├── livelog-redirect2.svg │ │ ├── median-pending-time.png │ │ ├── overview.svg │ │ ├── overview2.svg │ │ ├── overview3.svg │ │ ├── overview4.svg │ │ ├── scope-assignment.svg │ │ ├── scopes-client-error.svg │ │ ├── scopes-client-kleene.svg │ │ ├── scopes-client.svg │ │ ├── self-serve-use.svg │ │ ├── slides │ │ │ ├── auth.md │ │ │ ├── components.md │ │ │ ├── docker-worker-artifact.md │ │ │ ├── docker-worker-interactive.md │ │ │ ├── docker-worker-livelog.md │ │ │ ├── docker-worker.md │ │ │ ├── docker.md │ │ │ ├── end.md │ │ │ ├── self-serve.md │ │ │ ├── service-design.md │ │ │ ├── star-scopes.md │ │ │ ├── stats.md │ │ │ ├── task-graph.md │ │ │ ├── task.md │ │ │ ├── why.md │ │ │ ├── worker-life-cycle.md │ │ │ └── worker-types.md │ │ ├── task.svg │ │ ├── task2.svg │ │ └── tc-world.svg │ ├── intro │ │ ├── index.html │ │ ├── layers.svg │ │ ├── layers1.svg │ │ ├── overview.svg │ │ ├── overview2.svg │ │ ├── overview3.svg │ │ ├── overview4.svg │ │ └── task.svg │ ├── reveal │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CONTRIBUTING.md │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── css │ │ │ ├── print │ │ │ │ ├── paper.css │ │ │ │ └── pdf.css │ │ │ ├── reveal.css │ │ │ ├── reveal.scss │ │ │ └── theme │ │ │ │ ├── README.md │ │ │ │ ├── beige.css │ │ │ │ ├── black.css │ │ │ │ ├── blood.css │ │ │ │ ├── league.css │ │ │ │ ├── moon.css │ │ │ │ ├── night.css │ │ │ │ ├── serif.css │ │ │ │ ├── simple.css │ │ │ │ ├── sky.css │ │ │ │ ├── solarized.css │ │ │ │ ├── source │ │ │ │ ├── beige.scss │ │ │ │ ├── black.scss │ │ │ │ ├── blood.scss │ │ │ │ ├── league.scss │ │ │ │ ├── moon.scss │ │ │ │ ├── night.scss │ │ │ │ ├── serif.scss │ │ │ │ ├── simple.scss │ │ │ │ ├── sky.scss │ │ │ │ ├── solarized.scss │ │ │ │ └── white.scss │ │ │ │ ├── template │ │ │ │ ├── mixins.scss │ │ │ │ ├── settings.scss │ │ │ │ └── theme.scss │ │ │ │ └── white.css │ │ ├── js │ │ │ └── reveal.js │ │ ├── lib │ │ │ ├── css │ │ │ │ └── zenburn.css │ │ │ ├── font │ │ │ │ ├── league-gothic │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── league-gothic.css │ │ │ │ │ ├── league-gothic.eot │ │ │ │ │ ├── league-gothic.ttf │ │ │ │ │ └── league-gothic.woff │ │ │ │ └── source-sans-pro │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── source-sans-pro-italic.eot │ │ │ │ │ ├── source-sans-pro-italic.ttf │ │ │ │ │ ├── source-sans-pro-italic.woff │ │ │ │ │ ├── source-sans-pro-regular.eot │ │ │ │ │ ├── source-sans-pro-regular.ttf │ │ │ │ │ ├── source-sans-pro-regular.woff │ │ │ │ │ ├── source-sans-pro-semibold.eot │ │ │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ │ │ ├── source-sans-pro-semibold.woff │ │ │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ │ │ └── source-sans-pro.css │ │ │ └── js │ │ │ │ ├── classList.js │ │ │ │ ├── head.min.js │ │ │ │ └── html5shiv.js │ │ ├── plugin │ │ │ ├── highlight │ │ │ │ └── highlight.js │ │ │ ├── leap │ │ │ │ └── leap.js │ │ │ ├── markdown │ │ │ │ ├── example.html │ │ │ │ ├── example.md │ │ │ │ ├── markdown.js │ │ │ │ └── marked.js │ │ │ ├── math │ │ │ │ └── math.js │ │ │ ├── multiplex │ │ │ │ ├── client.js │ │ │ │ ├── index.js │ │ │ │ └── master.js │ │ │ ├── notes-server │ │ │ │ ├── client.js │ │ │ │ ├── index.js │ │ │ │ └── notes.html │ │ │ ├── notes │ │ │ │ ├── notes.html │ │ │ │ └── notes.js │ │ │ ├── print-pdf │ │ │ │ └── print-pdf.js │ │ │ ├── remotes │ │ │ │ └── remotes.js │ │ │ ├── search │ │ │ │ └── search.js │ │ │ └── zoom-js │ │ │ │ └── zoom.js │ │ └── test │ │ │ ├── examples │ │ │ ├── assets │ │ │ │ ├── image1.png │ │ │ │ └── image2.png │ │ │ ├── barebones.html │ │ │ ├── embedded-media.html │ │ │ ├── math.html │ │ │ └── slide-backgrounds.html │ │ │ ├── qunit-1.12.0.css │ │ │ ├── qunit-1.12.0.js │ │ │ ├── test-markdown-element-attributes.html │ │ │ ├── test-markdown-element-attributes.js │ │ │ ├── test-markdown-slide-attributes.html │ │ │ ├── test-markdown-slide-attributes.js │ │ │ ├── test-markdown.html │ │ │ ├── test-markdown.js │ │ │ ├── test-pdf.html │ │ │ ├── test-pdf.js │ │ │ ├── test.html │ │ │ └── test.js │ ├── scopes │ │ ├── createTask.png │ │ └── index.html │ ├── taskcluster-120.png │ └── try-with-taskcluster │ │ ├── images │ │ ├── decision_task.png │ │ ├── dependent_tasks.png │ │ ├── image_task.png │ │ ├── inspect-task.png │ │ ├── novnc.png │ │ ├── shell.png │ │ └── task-inspector.png │ │ ├── index.html │ │ └── slides │ │ ├── display.md │ │ ├── end.md │ │ ├── example_build.md │ │ ├── further_reading_task_images.md │ │ ├── image_dockerfile_after.md │ │ ├── image_dockerfile_before.md │ │ ├── image_workflow.md │ │ ├── interactive.md │ │ ├── shell.md │ │ ├── task_images.md │ │ ├── treeherder1.md │ │ ├── treeherder2.md │ │ └── treeherder3.md ├── reference │ ├── core │ │ └── index.md │ ├── guide.md │ ├── index.md │ ├── integrations │ │ └── index.md │ ├── libraries │ │ └── index.md │ ├── operations │ │ └── index.md │ ├── platform │ │ └── index.md │ └── workers │ │ └── index.md ├── resources.md └── tutorial │ ├── apis.md │ ├── authenticate.md │ ├── create-task-via-api.md │ ├── debug-task.md │ ├── download-task-artifacts.md │ ├── finding-tasks.md │ ├── gecko-decision-task.md │ ├── gecko-docker-images.md │ ├── gecko-new-job.md │ ├── gecko-task-graph-howto.md │ ├── gecko-task-graph.md │ ├── gecko-tasks.md │ ├── hack-tc.md │ ├── hello-world.md │ ├── index.md │ ├── monitor-task-status.md │ ├── reviews.md │ └── what-is-tc.md ├── util └── taskcluster-build.sh └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .awspublish-* 3 | user-config.yml 4 | build/ 5 | raw/ 6 | static/ 7 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Mozilla Community Participation Guidelines 2 | 3 | The most recent version of the Mozilla Community Participation Guideline can always be found here: https://www.mozilla.org/en-US/about/governance/policies/participation/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Moved to Monorepo 2 | 3 | This project has been moved into the Taskcluster "monorepo" at https://github.com/taskcluster/taskcluster. 4 | 5 | -------------------------------------------------------------------------------- /layout/followup.pug: -------------------------------------------------------------------------------- 1 | if followup 2 | div.followup 3 | hr 4 | h2 Next Steps 5 | if followup.subtext 6 | br 7 | small #{followup.subtext} 8 | ul 9 | each title, link in followup.links 10 | li 11 | a(href=link)= title 12 | -------------------------------------------------------------------------------- /layout/footer.pug: -------------------------------------------------------------------------------- 1 | footer 2 | | © #{new Date().getFullYear()} Taskcluster 3 | 4 | // jQuery and Bootstrap Javascript 5 | script(src='/docs/assets/jquery.min.js') 6 | script(src='/docs/assets/bootstrap/js/bootstrap.min.js') 7 | if !noAnchors 8 | script(src='/docs/assets/anchorjs.min.js') 9 | script. 10 | anchors.options.placement = 'left'; 11 | // always display links on touch devices; only display them via hover on cursor devices; but 12 | // anchorjs fails to detect this in the case where window.ontouchstart exists but is null 13 | if (window.ontouchstart === null) { 14 | anchors.options.visible = 'hover'; 15 | } else { 16 | anchors.options.visible = 'touch'; 17 | } 18 | anchors.add(); 19 | anchors.remove('.no-anchor'); 20 | if sequence_diagrams 21 | script(src='/docs/assets/raphael-min.js') 22 | script(src='/docs/assets/underscore-min.js') 23 | script(src='/docs/assets/sequence-diagram-min.js') 24 | script. 25 | $(".sequence-diagram-hand").sequenceDiagram({theme: 'hand'}); 26 | $(".sequence-diagram-simple").sequenceDiagram({theme: 'simple'}); 27 | if ejs 28 | script(src='/docs/assets/ejs_production.js') 29 | if marked 30 | script(src='/docs/assets/marked.js') 31 | if docref 32 | script(src='/docs/assets/docref/docref.js') 33 | if slugid 34 | script(src='/docs/assets/slugid-browserify.js') 35 | // Google Analytics 36 | script. 37 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 38 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 39 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 40 | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 41 | ga('create', 'UA-49796218-12', 'auto'); 42 | ga('send', 'pageview'); 43 | -------------------------------------------------------------------------------- /layout/head.pug: -------------------------------------------------------------------------------- 1 | head 2 | meta(charset='utf-8') 3 | meta(http-equiv="X-UA-Compatible", content="IE-edge") 4 | meta(name='viewport', content='width=device-width, initial-scale=1.0') 5 | if title 6 | title !{title} | Taskcluster Documentation 7 | else 8 | title Taskcluster Documentation 9 | link(rel='shortcut icon', href='/docs/assets/favicon.ico') 10 | // Bootstrap and Awesome Font styles 11 | link(rel='stylesheet', href='/docs/assets/bootstrap/css/bootstrap.min.css') 12 | // Custom styling 13 | link(rel='stylesheet', href='/docs/assets/style.css') 14 | -------------------------------------------------------------------------------- /layout/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang='en') 3 | include head.pug 4 | body 5 | include navbar.pug 6 | if nav 7 | #content.container-fluid 8 | .row 9 | .col-xs-12.hidden-md.hidden-lg 10 | button.btn.btn-primary(type="button", data-toggle="collapse", data-target="#sidebar") Menu 11 | hr 12 | aside#sidebar.col-md-3.col-xs-12.hidden-sm.hidden-xs 13 | include sidebar.pug 14 | section#content.col-md-9.col-xs-12 15 | if title 16 | h1 !{title} 17 | hr 18 | | !{content} 19 | include followup.pug 20 | include pager.pug 21 | else 22 | #content.container 23 | if title 24 | h1 !{title} 25 | hr 26 | | !{content} 27 | include followup.pug 28 | include pager.pug 29 | include footer.pug 30 | -------------------------------------------------------------------------------- /layout/navbar.pug: -------------------------------------------------------------------------------- 1 | nav.navbar.navbar-default 2 | .container-fluid 3 | .navbar-header 4 | button(type="button", data-toggle="collapse", data-target="#navbar", aria-expanded="false", aria-controls="navbar").navbar-toggle.collapsed 5 | span.sr-only Toggle navigation 6 | span.icon-bar 7 | span.icon-bar 8 | span.icon-bar 9 | a.navbar-brand(href="/docs") 10 | img(src="/docs/assets/taskcluster.svg") 11 | | TASKCLUSTER DOCS 12 | #navbar.collapse.navbar-collapse 13 | ul.nav.navbar-nav.navbar-right 14 | - var sections = { tutorial : 'Tutorial', manual: 'Manual', reference: 'Reference', resources: 'Resources' } 15 | for section, p in sections 16 | li(class= (p === path.split('/')[1]) && 'active') 17 | a(href="/docs/" + p)= section 18 | -------------------------------------------------------------------------------- /layout/pager.pug: -------------------------------------------------------------------------------- 1 | if nav 2 | hr 3 | ul.pager 4 | if nav.prev 5 | li.previous 6 | a(href=nav.prev) 7 | span(aria-hidden="true") ←  8 | | Previous 9 | if nav.up 10 | li.previous.up 11 | a(href=nav.up) 12 | span(aria-hidden="true") ↑  13 | | Up 14 | if nav.next 15 | li.next 16 | a(href=nav.next) 17 | | Next 18 | span(aria-hidden="true") 19 | |  → 20 | -------------------------------------------------------------------------------- /layout/sidebar.pug: -------------------------------------------------------------------------------- 1 | mixin inlineDocs(children) 2 | if children.length > 0 3 | .inline-navs 4 | |( 5 | each child, i in children 6 | if child.path == path 7 | span.active 8 | | #{child.title} 9 | else if child.link 10 | a(href=child.path) 11 | | #{child.title} 12 | if i !== children.length - 1 13 | || 14 | |) 15 | 16 | mixin sidebarList(children) 17 | each child in children 18 | - var inlineChildren = child.children.filter(function(x) {return x.inline;}); 19 | - var otherChildren = child.children.filter(function(x) {return !x.inline;}); 20 | li 21 | if child.path == path 22 | span.active #{child.title} 23 | +inlineDocs(inlineChildren) 24 | else if child.link 25 | a(href=child.path) #{child.title} 26 | +inlineDocs(inlineChildren) 27 | else 28 | span #{child.title} 29 | +inlineDocs(inlineChildren) 30 | if otherChildren.length > 0 31 | ul 32 | +sidebarList(otherChildren) 33 | 34 | if nav 35 | if nav.toc 36 | each toplevel in nav.toc 37 | h6.no-anchor 38 | if toplevel.link 39 | a(href=toplevel.path) #{toplevel.title} 40 | else 41 | span #{toplevel.title} 42 | if toplevel.children 43 | ul.main-menu.nav.nav-stacked 44 | +sidebarList(toplevel.children) 45 | -------------------------------------------------------------------------------- /lib/filter.js: -------------------------------------------------------------------------------- 1 | var through = require('through2'); 2 | var fs = require('fs'); 3 | var path = require('path'); 4 | var streamfilter = require('streamfilter'); 5 | 6 | /** 7 | * Include only Gulp files that are files (not directories, etc.) 8 | */ 9 | exports.onlyFiles = function() { 10 | return new streamfilter(function (file, enc, cb) { 11 | var stat = fs.statSync(path.relative(file.cwd, file.path)); 12 | cb(!stat.isFile()); 13 | }, { 14 | objectMode: true, 15 | }) 16 | } 17 | 18 | /** 19 | * Rename files ending in `/index.html` to drop the prefix 20 | */ 21 | exports.renameIndex = function() { 22 | return through.obj(function(file, enc, cb) { 23 | if (file.path.endsWith('/index.html')) { 24 | file.path = file.path.slice(0, -11); 25 | } 26 | cb(null, file); 27 | }, function(cb) { 28 | cb(); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /lib/headers.js: -------------------------------------------------------------------------------- 1 | var through = require('through2'); 2 | var _ = require('lodash'); 3 | var mime = require('mime'); 4 | 5 | /** 6 | * Set a header in `file.data.headers` 7 | */ 8 | exports.set = function(header, value) { 9 | return through.obj(function(file, enc, cb) { 10 | file.data = file.data || {}; 11 | if (!file.data.headers) { 12 | file.data.headers = {}; 13 | } 14 | file.data.headers[header] = value; 15 | cb(null, file); 16 | }, function(cb) { 17 | cb(); 18 | }); 19 | } 20 | 21 | /** 22 | * Set a file's content-type header based on its filename 23 | */ 24 | exports.guessContentType = function() { 25 | return through.obj(function(file, enc, cb) { 26 | file.data = file.data || {}; 27 | if (!file.data.headers) { 28 | file.data.headers = {}; 29 | } 30 | file.data.headers['Content-Type'] = mime.lookup(file.relative); 31 | cb(null, file); 32 | }, function(cb) { 33 | cb(); 34 | }); 35 | } 36 | -------------------------------------------------------------------------------- /lib/make-redirects.js: -------------------------------------------------------------------------------- 1 | var through = require('through2'); 2 | var yaml = require('js-yaml'); 3 | var fs = require('fs'); 4 | var _ = require('lodash'); 5 | var gutil = require('gulp-util'); 6 | var File = require('vinyl'); 7 | 8 | /** 9 | * Generate a stream of fake "Files" representing the redirects in the 10 | * mapping file it gets as input. 11 | */ 12 | 13 | module.exports = function() { 14 | return through.obj(function(file, enc, cb) { 15 | var mapping = yaml.safeLoad(file.contents.toString()); 16 | var self = this; 17 | 18 | // redirect /docs/ to /docs 19 | const rootRedir = new File({ 20 | base: '/', 21 | path: '/docs/', 22 | contents: new Buffer(""), 23 | }); 24 | rootRedir.data = { 25 | headers: {'website-redirect-location': '/docs'}, 26 | }; 27 | self.push(rootRedir); 28 | 29 | _.forEach(mapping, function (newPath, oldPath) { 30 | // redirect both from and docs/ 31 | _.forEach(['', '/docs'], function (prefix) { 32 | var file = new File({ 33 | base: '/', 34 | path: prefix + oldPath, 35 | contents: new Buffer(""), 36 | }); 37 | file.data = { 38 | headers: {'website-redirect-location': newPath}, 39 | }; 40 | self.push(file); 41 | }); 42 | }); 43 | cb(); 44 | }, function(cb) { 45 | cb(); 46 | }); 47 | } 48 | -------------------------------------------------------------------------------- /lib/pug.js: -------------------------------------------------------------------------------- 1 | var through = require('through2'); 2 | var _ = require('lodash'); 3 | var pug = require('pug'); 4 | 5 | /** 6 | * Embed the file contents (assumed to be HTML) into 7 | * the Pug template named by options.template. The file's data 8 | * is used as template options. 9 | */ 10 | module.exports = function(options) { 11 | var template = options.template; 12 | 13 | return through.obj(function(file, enc, cb) { 14 | var params = _.defaults({}, file.data || {}, { 15 | content: file.contents.toString(), 16 | path: '/' + file.relative, 17 | }); 18 | file.contents = new Buffer(pug.renderFile(template, params)); 19 | cb(null, file); 20 | }, function(cb) { 21 | cb(); 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /lib/sts.js: -------------------------------------------------------------------------------- 1 | var request = require('request'); 2 | var Promise = require('promise'); 3 | var taskcluster = require('taskcluster-client'); 4 | 5 | function creds(level, bucket) { 6 | return new Promise(function(accept, reject) { 7 | request.get( 8 | 'http://taskcluster/auth/v1/aws/s3/' + level + '/' + bucket + '/', 9 | function(err, res, body) { 10 | if (err) { 11 | reject(err); 12 | } else if (res.statusCode != 200) { 13 | reject(body); 14 | } else { 15 | var creds = JSON.parse(body).credentials; 16 | console.error("AWS credentials for " + bucket + " downloaded; accessKeyId is " + creds.accessKeyId); 17 | accept(creds); 18 | }; 19 | }); 20 | }); 21 | } 22 | 23 | module.exports = creds; 24 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | exports.buildSchemaId = schemaId => { 2 | if (schemaId.startsWith('/')) { 3 | if (process.env.TASKCLUSTER_ROOT_URL && process.env.TASKCLUSTER_ROOT_URL !== 'https://taskcluster.net') { 4 | return process.env.TASKCLUSTER_ROOT_URL + schemaId; 5 | } else { 6 | schemaId = schemaId.replace(/^\/schemas\//, ''); 7 | return `https://schemas.taskcluster.net/${schemaId}` 8 | } 9 | } 10 | return schemaId; 11 | }; 12 | -------------------------------------------------------------------------------- /src/assets/JSONFormatter/JSONFormatter.css: -------------------------------------------------------------------------------- 1 | .PropertyName {} 2 | .ObjectBrace, .ArrayBrace, .Comma {color: gray;} 3 | .Null {font-weight: bold;} 4 | .String {color: brown;} 5 | .Number {color: blue;} 6 | -------------------------------------------------------------------------------- /src/assets/JSONFormatter/Minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/JSONFormatter/Minus.png -------------------------------------------------------------------------------- /src/assets/JSONFormatter/Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/JSONFormatter/Plus.png -------------------------------------------------------------------------------- /src/assets/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/assets/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/assets/bundle.js: -------------------------------------------------------------------------------- 1 | console.error("Error: Cannot find module 'utf-8-validate' from '/Users/bstack/Projects/taskcluster/taskcluster-docs/node_modules/ws/lib'"); -------------------------------------------------------------------------------- /src/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/favicon.ico -------------------------------------------------------------------------------- /src/assets/task-graph-inspector/task-node.ejs: -------------------------------------------------------------------------------- 1 |
2 | <%= taskLabel %>
3 | 4 | 5 | <%= task.taskId.substr(0, 8) %>... 6 | 7 | 8 |
-------------------------------------------------------------------------------- /src/assets/taskcluster-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/taskcluster-180.png -------------------------------------------------------------------------------- /src/assets/taskcluster-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/taskcluster-36.png -------------------------------------------------------------------------------- /src/assets/tools-taskcluster-net-thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/assets/tools-taskcluster-net-thumbnail.png -------------------------------------------------------------------------------- /src/error.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Not Found (HTTP 404) 3 | noAnchors: true 4 | --- 5 | 6 | Sorry, this page of the Taskcluster documentation does not exist. 7 | 8 | Try searching using the search input above. 9 | -------------------------------------------------------------------------------- /src/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | noAnchors: true 3 | --- 4 | 5 | # Taskcluster Documentation 6 | 7 | --- 8 | 9 | Taskcluster is the task execution framework that supports Mozilla's continuous integration and release processes. 10 | 11 | --- 12 | 13 | ### Tutorial 14 | 15 | Follow the [tutorial](/docs/tutorial) to learn about Taskcluster, focusing on the parts most relevant to you. 16 | 17 | --- 18 | 19 | ### Manual 20 | 21 | [Read the manual](/docs/manual) for a more comprehensive description of Taskcluster's design and operation. 22 | 23 | --- 24 | 25 | ### Reference 26 | 27 | Refer to the [reference documentation](/docs/reference) for the technical details of each component. 28 | 29 | --- 30 | 31 | ### Resources 32 | 33 | See [resources](/docs/resources) such as presentations, external services, and useful links used by and for Taskcluster. 34 | 35 | --- 36 | 37 | ### People 38 | 39 | Find out more about the [people](/docs/people) who make Taskcluster, and get involved yourself! 40 | -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/authn.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/authn.md 3 | title: Authentication 4 | order: 21 5 | --- 6 | 7 | To access protected resources, a Taskcluster client must have credentials 8 | consisting of a `clientId` and an `accessToken` (and, if using temporary 9 | credentials, a `certificate`). 10 | 11 | These credentials are used with the [Hawk](https://github.com/hueniverse/hawk) 12 | protocol to authenticate each HTTP request. The `clientId` is passed as the 13 | `id` parameter, and `accessToken` is passed as the `key` parameter. 14 | 15 | If given, the certificate is passed as `ext.certificate` to the 16 | `Hawk.client.header` method. The `ext` value is a base64-encoded JSON string. 17 | 18 | In JavaScript: 19 | ```js 20 | var header = Hawk.client.header('https://foo.taskcluster.net', 'GET', { 21 | credentials: { 22 | clientId: clientId, 23 | accessToken: accessToken, 24 | }, 25 | ext: new Buffer(JSON.stringify({certificate: certificate})).toString('base64'), 26 | }); 27 | ``` 28 | 29 | Given this information, the Hawk protocol (as defined by its Javascript 30 | implementation) signs the HTTP request, and the resulting token is placed in 31 | the `Authorization` header. -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/authorized-scopes.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/authorized-scopes.md 3 | title: Authorized Scopes 4 | order: 25 5 | --- 6 | 7 | If you are making API requests on behalf of a less-trusted entity that you only 8 | know to possess a subset of your [scopes](scopes), you can specify the scopes a 9 | given request is authorized to rely on. If the request cannot be authorized 10 | with the restricted set of scopes you specified, it will fail, even though you 11 | may in fact have the scopes required to conduct the request. In effect, you can 12 | reduce the available scopes for each API request. 13 | 14 | **Example**, imagine that CRAN service would like to create Taskcluster tasks 15 | whenever an R project is updated in the archive. However, different R packages 16 | have different levels of trust and require different scopes. The tc-cran 17 | service runs with the superset of all scopes that might be required (perhaps 18 | `assume:project:cran:pkg:*`), and calls `queue.createTask` with 19 | `authorizedScopes` set to `['assume:project:cran:pkg:paleotree']` for paleotree 20 | tasks. The scopes available for creating that task are then limited to those 21 | assigned to the paleotree package via its role. 22 | 23 | Authorized scopes are specified in the Hawk `ext` property with the 24 | `authorizedScopes` property. The Taskcluster client packages all contain 25 | support for this functionality. 26 | 27 | ```js 28 | { 29 | authorizedScopes: ['scopeA', 'scopeC'] 30 | } 31 | ``` 32 | 33 | **Remark**, it is possible to use authorized scopes in combination with the 34 | certificate used temporary credentials. Just include both fields in the JSON 35 | object before base64 encoding into the `ext` property. 36 | 37 | **Note** the way Hawk works, the `ext` property is covered by the HMAC 38 | signature. So it's not possible to modify this property on-the-fly. -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/clients.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/clients.md 3 | title: Clients 4 | order: 23 5 | --- 6 | 7 | Taskcluster authentication begins with "clients". Each client has a name 8 | (`clientId`) and a secret access token. These can be used together to make API 9 | requests to Taskcluster services. Each client has a set of scopes associated 10 | with it, controlling what that client can do. 11 | 12 | See [the taskcluster-auth 13 | docs](/docs/reference/platform/taskcluster-auth/docs/clients) for more detailed 14 | information. 15 | 16 | The set of defined clients is visible in the [Clients 17 | tool](http://tools.taskcluster.net/auth/clients/). This interface helpfully 18 | shows both the scopes configured for the client, and the "expanded scopes" that 19 | result after all roles are expanded. Note that, in keeping with the open 20 | nature of Taskcluster, anyone can see the full list of clients. 21 | 22 | **NOTE** Taskcluster does not identify users. All API calls are made with 23 | Taskcluster credentials, which include a `clientId`, but that identifier does 24 | not necessarily relate to a specific person or "user account" of any sort. 25 | -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/index.md 3 | title: API Authentication and Authorization 4 | order: 10 5 | --- 6 | 7 | All Taskcluster components use [Hawk](https://github.com/hueniverse/hawk) over 8 | SSL for authentication and authorize access based on a set of "scopes" 9 | associated with each client. Credentials and scopes are managed by the 10 | [authentication](/docs/reference/platform/taskcluster-auth/references/api) component. 11 | 12 | The details are documented here, but note that you can use one of the fine 13 | [Taskcluster clients](/docs/manual/tools/clients) to handle all of these details for 14 | you. They are available in a variety of languages, and are kept up-to-date 15 | with the latest APIs. -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/roles.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/roles.md 3 | title: Roles 4 | order: 24 5 | --- 6 | 7 | A _role_ consists of a `roleId`, a set of scopes, and a description. Each role 8 | constitutes a simple _expansion rule_ that says if you have the scope 9 | `assume:` you get the set of scopes associated with the role named 10 | `roleId`. Roles can refer to other roles in the same way. 11 | 12 | See [the taskcluster-auth 13 | docs](/docs/reference/platform/taskcluster-auth/docs/roles) for more detailed 14 | information on roles and role expansion. 15 | 16 | ## In Practice 17 | 18 | In practice, roles are used in a few ways within Taskcluster: 19 | 20 | * As a shorthand for a commonly-used set of scopes 21 | * As a means of associating scopes with external things such as source-code repositories or users 22 | * As a way to configure scopes for Taskcluster resources like hooks or worker types 23 | * As a scope allowing the bearer to "assume" the named role. 24 | 25 | See the [namespaces](/docs/manual/design/namespaces) document for more information. 26 | 27 | The set of defined roles is visible in the [Roles 28 | tool](http://tools.taskcluster.net/auth/roles/). This interface helpfully 29 | shows both the scopes configured for the role, and the "expanded scopes" for 30 | that role. The latter value can be a little misleading for `*`-suffixed 31 | roles, so be careful and if in doubt, create a throwaway client to test your 32 | assumptions. 33 | -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/scopes.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/scopes.md 3 | title: Scopes 4 | order: 22 5 | --- 6 | 7 | All Taskcluster endpoints are guarded by [scopes](scopes). The authentication 8 | information passed with each API call is used to determine a set of scopes 9 | associated with the caller. These are compared against the scopes required by 10 | the endpoint. If they are satisfied, the request is allowed to proceed. 11 | 12 | The scopes required for each endpoint are documented in the reference section 13 | of this manual. Note that some API endpoints may have additional scope 14 | requirements that depend on the body of the request; read the endpoint 15 | documentation carefully to discover these. 16 | 17 | See [the taskcluster-auth 18 | docs](/docs/reference/platform/taskcluster-auth/docs/scopes) for more detailed 19 | information on scopes, scope satisfaction, and stars in scopes. 20 | -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/signed-urls.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/signed-urls.md 3 | title: Pre-signed URLs 4 | order: 27 5 | --- 6 | 7 | Hawk allows you to generate a _bewit_ signature for any `GET` request. Including 8 | this _bewit_ signature in your request will then authenticate and authorize the 9 | request. All Taskcluster APIs support authentication of `GET` requests using 10 | these bewit signatures. And you'll find that the official 11 | [taskcluster-client](https://github.com/taskcluster/taskcluster-client) 12 | offers an API for generating these signatures. 13 | 14 | Pre-signed URLs are allow an HTTP client which does not directly support Hawk 15 | -- such as a browser or a command-line tool -- to access Taskcluster resources. 16 | A common use-case is to provide a link to a private artifact. -------------------------------------------------------------------------------- /src/manual/design/apis/hawk/troubleshooting.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/hawk/troubleshooting.md 3 | title: Troubleshooting 4 | order: 30 5 | --- 6 | 7 | In order to avoid disclosing information to a potential hacker, a number of 8 | errors result in the rather terse "Bad Mac" error. Fundamentally, this means 9 | that the credentials supplied were invalid for some reason. Errors regarding 10 | scopes will use more informative error messages. 11 | 12 | The most common error is forgetting to include the certificate in addition to 13 | the clientId and accessToken. There is no need to interpret the certificate 14 | (please don't!); just treat it as an opaque string. Omitting the certificate 15 | when it is required will generally result in "Bad Mac" errors. -------------------------------------------------------------------------------- /src/manual/design/apis/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/apis/index.md 3 | title: Microservice APIs 4 | order: 10 5 | --- 6 | 7 | Taskcluster uses a microservices architecture, with each service exposing a 8 | small set of API endpoints. Those endpoints, and other details of the 9 | services, are documented in the [reference component](/docs/reference). 10 | We have already mentioned several services, especially the Queue service. 11 | 12 | This section describes in detail how to interact with these Microservices. -------------------------------------------------------------------------------- /src/manual/design/devel/best-practices/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/devel/best-practices/index.md 3 | title: Best Practices 4 | order: 40 5 | --- 6 | 7 | This section highlights some best practices for developing Taskcluster components and integrations. -------------------------------------------------------------------------------- /src/manual/design/devel/idempotency.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/devel/idempotency.md 3 | title: Idempotency 4 | order: 30 5 | --- 6 | 7 | All Taskcluster API operations should be idempotent. This means that repeating 8 | a request has no effect, as long as it occurs within a reasonable time. 9 | 10 | For example, calling `queue.createTask` twice with exactly the same task 11 | creates only one task. On the other hand, calling the method twice with the 12 | same task ID but different task definitions is an error. 13 | 14 | Ensuring idempotency requires some careful design, but is critical for an HTTP 15 | API, as clients may re-try a successful request if the connection fails before 16 | that success is communicated back to the client. 17 | 18 | In particular: 19 | 20 | * Identifiers should always be specified by the client, not generated by 21 | the API endpoint. Slug IDs provide a simple way to ensure 22 | (probabilistically) unique IDs without any central coordination. 23 | 24 | * Creation operations should explicitly handle the case where the given 25 | identifier is already present in the backend storage, comparing the rest of 26 | the object and only returning an error if the two differ. 27 | 28 | * Update operations, too, should treat updates that make no changes as a 29 | success condition. For example, it is not an error to resolve an 30 | already-resolved error, as long as the resolution reason is the same. 31 | 32 | * Over long durations, idempotency is not required. For example, 33 | updating a client's scopes after it has expired may fail. -------------------------------------------------------------------------------- /src/manual/design/devel/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/devel/index.md 3 | title: Development 4 | order: 20 5 | --- 6 | 7 | This section of the manual contains information useful for people working on 8 | the Taskcluster codebase. 9 | 10 | The [Taskcluster organization](https://github.com/taskcluster) on Github 11 | contains the source code for all of the microservices, a collection of 12 | supporting libraries, and more. 13 | 14 | You can find a list of [open pull 15 | requests](https://github.com/search?utf8=%E2%9C%93&q=user%3Ataskcluster+is%3Aopen&type=Issues&ref=searchresults), 16 | or the aggregated [Travis CI Status](https://travis-ci.org/taskcluster) to see 17 | how we are doing. -------------------------------------------------------------------------------- /src/manual/design/devel/principles.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/devel/principles.md 3 | title: Guiding Design Principles for Taskcluster 4 | order: 10 5 | --- 6 | 7 | At the [2016 tc-worker workweek](http://www.chesnok.com/daily/2016/03/11/workweek-tc-worker-workweek-recap/) the Taskcluster Platform team laid out our _core design principles_. The four key principles are: 8 | 9 | * Self-service 10 | * Robustness 11 | * Enable rapid change 12 | * Community friendliness 13 | 14 | These are all under an umbrella we call Getting Things Built™. None of our work matters unless __it works__! Read further for a slightly expanded list of principles! 15 | 16 | ### Getting Things Built™ 17 | 18 | #### Self-service 19 | 20 | - Task Isolation 21 | - API-driven UI Tools 22 | - Extensibility 23 | - Granular Security 24 | - Clearly-defined interfaces 25 | - Separation of concerns 26 | 27 | #### Robustness 28 | 29 | - Scalability 30 | - Correctness 31 | - [Idempotent APIs](/docs/manual/design/devel/idempotency) 32 | - Minimal Self-hosting 33 | - Use managed services, e.g. S3, Azure Storage 34 | - Don't self-host mutable services 35 | - Stateless services 36 | - 12-factor applications 37 | 38 | #### Enable Rapid Change 39 | 40 | - Agility 41 | - Clearly-defined interfaces 42 | - Microservices 43 | - Separation of concerns 44 | 45 | #### Community Friendly 46 | 47 | - Transparency 48 | - Granular Security 49 | - Public by Default 50 | - Self-Service 51 | 52 | Taskcluster Principles Diagram 53 | -------------------------------------------------------------------------------- /src/manual/design/devel/rfcs.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/devel/rfcs.md 3 | title: RFCs 4 | order: 20 5 | --- 6 | 7 | Taskcluster manages major changes to the platform through "requests for 8 | comment", known as RFCs. These provide an open, transparent decision-making 9 | process and a way to track ideas from initial proposal through decision and 10 | implementation. 11 | 12 | Taskcluster's RFCs are in the [taskcluster-rfcs repository](https://github.com/taskcluster/taskcluster-rfcs). 13 | -------------------------------------------------------------------------------- /src/manual/design/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: design/index.md 3 | title: System Design 4 | order: 30 5 | --- 6 | 7 | This chapter starts to dive deeper into Taskcluster's implementation. The 8 | information here is useful for those interacting directly with Taskcluster 9 | services, and for those taking advantage of some of the more sophisticated 10 | features available to tasks, such as scopes or routes. -------------------------------------------------------------------------------- /src/manual/task-execution/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: task-execution/index.md 3 | title: Task Execution 4 | order: 20 5 | --- 6 | 7 | We've seen how tasks are defined. Now we turn to the process of executing those 8 | tasks. -------------------------------------------------------------------------------- /src/manual/tasks/dependencies.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/dependencies.md 3 | title: Dependencies and Task Graphs 4 | order: 40 5 | --- 6 | 7 | Tasks can be linked together such that a dependent task does not start until 8 | its prerequisites are complete. This functionality enables the creation of 9 | "task graphs" containing multi-task dependency chains. For example, a task 10 | graph to build and test an application might start with a set of library build 11 | tasks (one for each platform), followed by application build tasks depending on 12 | those library builds, and culminating in test tasks that depend on the 13 | application build tasks. 14 | 15 | Dependencies are defined by listing prerequisite taskIds in the `dependencies` 16 | property of each task. When a new task is submitted to the Queue service, any 17 | tasks listed as a dependency must have already been submitted to the Queue 18 | service. The `requires` task property controls whether the dependent task 19 | should execute if any of its prerequisites fail. 20 | 21 | A task can depend on itself -- this is called a "self-dependency". Such a task 22 | will not run automatically, but can be force-scheduled as described in 23 | [Manipulating Tasks](manipulating). -------------------------------------------------------------------------------- /src/manual/tasks/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/index.md 3 | title: Tasks 4 | order: 10 5 | --- 6 | 7 | This chapter focuses on Taskcluster's core concept: tasks. 8 | 9 | At the highest level, Taskcluster executes tasks. New tasks are added to one of 10 | several queues, and workers consume tasks from those queues and execute them. 11 | In the process, services send [Pulse](/docs/manual/design/apis/pulse) messages 12 | about task status, and attach the results of the task -- including logs and 13 | output artifacts -- to the task itself. 14 | 15 | A task is described by a task definition, which is a simple data structure 16 | usually encoded in JSON or YAML. Each task has a unique `taskId`, assigned 17 | randomly by the caller when the task is created. The full schema for the task 18 | definition is given in [the reference 19 | documentation](/docs/reference/platform/taskcluster-queue/docs/task-schema), but a 20 | simple task might look like this: 21 | 22 | ```yaml 23 | provisionerId: aws-provisioner-v1 24 | workerType: tutorial 25 | created: 2020-01-04T04:18.084Z 26 | deadline: 2020-01-05T04:18.084Z 27 | metadata: 28 | name: Example Task 29 | description: Eample from TC Manual 30 | owner: nobody@taskcluster.net 31 | source: https://github.com/taskcluster/taskcluster-docs 32 | payload: 33 | image: ubuntu:16.04 34 | command: ['echo', 'hello world'] 35 | ``` 36 | 37 | You can use the [task creator](https://tools.taskcluster.net/task-creator) to 38 | experiment with creating tasks. 39 | 40 | The next few sections describe the many powerful features of tasks, while the 41 | [next chapter](/docs/manual/task-execution) covers their execution by workers. -------------------------------------------------------------------------------- /src/manual/tasks/manipulating.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/manipulating.md 3 | title: Manipulating Tasks 4 | order: 50 5 | --- 6 | 7 | For the most part, once a task is created it is left to run to its final 8 | resolution. However, there are a few API methods available to modify its 9 | behavior after creation. 10 | 11 | Permission for these methods is based on the task's `schedulerId`. 12 | 13 | ## Force Scheduling 14 | 15 | A task which has unfinished dependencies is considered "unscheduled", and not yet 16 | "pending". A scheduled task that depends on itself will remain in that state 17 | until its deadline, unless it is *force-scheduled* with the Queue service's 18 | `scheduleTask` method. 19 | 20 | ## Cancelling 21 | 22 | A task that is not yet complete can be cancelled. This is generally a 23 | best-effort operation, useful for saving resources. Task execution may continue 24 | for some time after an active task is cancelled, until the worker performing 25 | the task attempts to reclaim it. -------------------------------------------------------------------------------- /src/manual/tasks/messages.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/messages.md 3 | title: Messages 4 | order: 70 5 | --- 6 | 7 | Taskcluster publishes pulse messages when tasks change state. 8 | [Pulse](/docs/manual/design/apis/pulse) is a message bus with a publish / 9 | subscribe model. These messages are sent by default with a route containing 10 | several of the task's ID's, but can be "copied" (using the AMQP `Cc` header) to 11 | arbitrary routes listed in the task's `routes` property. 12 | 13 | This provides a powerful extension point for integrations with Taskcluster. 14 | Taskcluster itself includes a few such integrations: 15 | 16 | * The Index service listens for messages about task completion on routes 17 | beginning with `index`, storing the relevant taskIds for later retrieval. 18 | [More information..](/docs/reference/core/index) 19 | 20 | * The Notify service listens for messages beginning with `notify` and 21 | translates them into user notifications via email or irc. [More 22 | information..](/docs/reference/core/notify) -------------------------------------------------------------------------------- /src/manual/tasks/priority.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/priority.md 3 | title: Priority 4 | order: 25 5 | --- 6 | 7 | Each task has a `priority` field giving its relative priority, chosen from a 8 | small set of named priorities. When several tasks are pending in the same 9 | queue, those with the highest priority will be executed first. 10 | 11 | Note that this can result in starvation: if there are enough tasks at a given 12 | priority to keep all available workers busy, then no tasks of lower priority 13 | will run. -------------------------------------------------------------------------------- /src/manual/tasks/runs.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/runs.md 3 | title: Runs 4 | order: 30 5 | --- 6 | 7 | A task definition is, in a sense, the input to task execution. The output comes 8 | in the form of "runs" and associated "artifacts". 9 | 10 | A run is an attempt to execute a task. Most tasks have a single run, but in 11 | cases where transient errors such loss of a compute node cause a run to fail, 12 | Taskcluster automatically adds additional runs. 13 | 14 | Runs are identified by their `runId`, a small integer. While for most tasks, 15 | the single `runId` is `0`, you should always use the latest run to avoid 16 | reading information about a run that failed. 17 | 18 | Each run has properties describing the worker that claimed the run (referenced 19 | by the two-part namespace `/`), the reason the run was 20 | created, its current status, and various timestamps. 21 | 22 | A run is in one of a few states: 23 | 24 | * `pending` - ready to be claimed and executed 25 | * `running` - currently executing 26 | * `completed` - finished successfully 27 | * `failed` - finished unsuccessfully 28 | * `exception` - finished due to some reason unrelated to the outcome of task 29 | execution 30 | 31 | Exceptions for infrastructural reasons (for example, loss of a worker) will 32 | result in an automatic re-run if there are sufficient retries left for the 33 | task. Task cancellation and a few other unusual circumstances are also 34 | represented by the `exception` state, and distinguished by the `reason` field 35 | in the task status -- see the [queue API 36 | reference](/docs/reference/platform/taskcluster-queue/references/api) for details. 37 | 38 | A task's state is based on the state of its latest run, with the addition of an 39 | `unscheduled` state for a task with no runs (as is the case when the task's 40 | dependencies are not complete). -------------------------------------------------------------------------------- /src/manual/tasks/scopes.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/scopes.md 3 | title: Task Scopes 4 | order: 60 5 | --- 6 | 7 | Taskcluster permissions are represented by "scopes", covered in more detail in 8 | [the design section](/docs/manual/design/apis/hawk/scopes). For this section, it 9 | is enough to know that a scope is a permission to perform a particular action. 10 | 11 | A task has a set of scopes that determine what the task can do. These scopes 12 | are validated by the worker. For example, a worker may limit access to 13 | features based on whether the running task has a corresponding scope. It is 14 | also possible for a task to make arbitrary API calls using its scopes via an 15 | authenticating proxy. 16 | 17 | Taskcluster avoids "scope escalation", where a user might gain use of scopes 18 | they do not have, by requiring that the creator of a task have all of the 19 | scopes associated with the task. Thus a task's scopes must be satisfied by the 20 | scopes its creator has. 21 | 22 | In fact, several scope sets must be satisfieid to create a task: 23 | * Scopes to create a task for the given worker type 24 | * Scopes corresponding to some components of the task definition, such as 25 | routes, priorities, and `schedulerId`. 26 | * The task's `scopes` property 27 | -------------------------------------------------------------------------------- /src/manual/tasks/taskgroupid-schedulerid.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/taskgroupid-schedulerid.md 3 | title: The taskGroupId and schedulerId properties 4 | order: 45 5 | --- 6 | 7 | Each task is assigned to a task group by its `taskGroupId`, a random string 8 | specified at task creation. Task groups associate "related" tasks, such as 9 | those created in response to the same version-control push. In most cases, all 10 | of the tasks in a task group are linked by dependency relations, so it is 11 | common to refer to a task group as a "task graph". The Queue service provides 12 | an API method to list all tasks with a specific `taskGroupId`, and task 13 | manipulation can be limited by `taskGroupId`. 14 | 15 | Tasks also have a `schedulerId`. All tasks in a task group must have the same 16 | `schedulerId`. This is used for several purposes: 17 | 18 | * it can represent the entity that created the task; 19 | 20 | * it can limit addition of new tasks to a task group: the caller of 21 | `createTask` must have a scope related to the `schedulerId` of the task 22 | group (more about scopes later); and 23 | 24 | * it controls who can [manipulate tasks](manipulating), again by requiring 25 | `schedulerId`-related scopes. -------------------------------------------------------------------------------- /src/manual/tasks/times.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/times.md 3 | title: Times 4 | order: 10 5 | --- 6 | 7 | Each task has three associated times: 8 | * `created` is the time the task was created; 9 | * `deadline` is the time by which the task must be completed; and 10 | * `expires` is the time after which all record of the task and its runs will be deleted. 11 | 12 | The deadline exists to ensure that tasks do not remain pending forever. It is 13 | usually set to one day after `created`, on the assumption that running the task 14 | more than a day later is not useful. 15 | 16 | Task expiration ensures that tasks are not stored indefinitely, thereby 17 | controlling storage costs. Expiration is often set to one year after creation, 18 | but for common tasks, tasks which produce large artifacts, or tasks which are 19 | unlikely to be useful later, a much shorter expiration is appropriate. -------------------------------------------------------------------------------- /src/manual/tasks/workertypes.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: tasks/workertypes.md 3 | title: Worker Types 4 | order: 20 5 | --- 6 | 7 | Workers execute tasks, but there are many types of workers. A task specifies a 8 | single "worker type" by which it should be executed, using the two-part 9 | namespace `/`. The naming of the identifiers can be 10 | a bit confusing: when we refer to a worker type, it is to the combination of 11 | both identifiers. Thus `gcp-provisioner/persona-build` and 12 | `rackspace-provisioner/persona-build` are completely different worker types, 13 | despite sharing the same `workerType` identifier. 14 | 15 | Workers of the same worker type all consume tasks from a single queue, as 16 | [described later](/docs/manual/task-execution/queues), and as such are 17 | interchangeable and have identical configurations. 18 | 19 | The format of a task's `payload` property is specific to the worker that will 20 | execute it, so defining a task requires knowledge of worker type's 21 | configuration. If given a task with an inappropriate payload, a worker will 22 | resolve the task with the reason `malformed-payload`. 23 | 24 | You can explore the available worker types (after selecting a `provisionerId`) 25 | at https://tools.taskcluster.net/provisioners. 26 | -------------------------------------------------------------------------------- /src/manual/using/actions/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Defining User Actions on Existing Tasks 3 | --- 4 | 5 | This section shows how to define *actions*. Actions allow users to affect a 6 | task or task-graph after it has been submitted. Common actions are: 7 | 8 | - Retrigger a task, 9 | - Retry specific test cases many times, 10 | - Obtain a loaner machine, 11 | - Backfill missing tasks, 12 | 13 | Actions are defined in-tree, so they are specific to the software being built 14 | and can be modified through the usual review process. Taskcluster defines a 15 | convention -- documented here -- which allows user interfaces to connect users 16 | to these actions. 17 | 18 | At a very high level, the process looks like this: 19 | 20 | - A decision task produces an artifact, `public/actions.json`, 21 | indicating what actions are available. 22 | - A user interface (for example, Treeherder or the Taskcluster 23 | tools) consults `actions.json` and presents appropriate choices to 24 | the user, if necessary gathering additional data from the user, 25 | such as the number of times to re-trigger a test case. 26 | - The user interface follows the action description to carry out the 27 | action. In most cases (`action.kind == 'task'`), that entails 28 | creating an "action task", including the provided information. 29 | That action task is responsible for carrying out the named action, 30 | and may create new sub-tasks if necessary (for example, to 31 | re-trigger a task). 32 | 33 | For Gecko developers, there is [documentation](https://firefox-source-docs.mozilla.org/taskcluster/taskcluster/action-implementation.html) on how to write action tasks in-tree. 34 | -------------------------------------------------------------------------------- /src/manual/using/caching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Caching on Workers 3 | order: 65 4 | --- 5 | 6 | As discussed elsewhere, Taskcluster supports a broad array of workers, including workers you implement yourself. 7 | So it's difficult to say anything about "all" workers, but the general-purpose workers that the Taskcluster team maintains do have some common functionality, including the ability to cache data between task executions. 8 | 9 | ## Caches 10 | 11 | Caches are named directories stored on-disk on a worker. 12 | They can be "mounted" at arbitrary locations within the image of an executing task. 13 | A cache can only be used by one task at a time. 14 | 15 | Caches are typically used for shared data sources such as version-control repositories or package installer caches. 16 | Their use can result in a dramatic increase in task efficiency. 17 | 18 | Caches can be of arbitrary size (limited by the disk space available on the worker itself), but can be garbage-collected by the worker implementation between tasks, if necessary. 19 | Caching is most effective when "most" of the tasks executing on a worker use the same caches. 20 | Too great a variety of caches results in frequent garbage collection and a low hit rate. 21 | As such, caches aren't terribly useful on shared workerTypes such as `github-worker`. 22 | 23 | ## Configuration 24 | 25 | The configuration of caches differs substantially between worker implementations. 26 | 27 | Docker-worker configures caches in the [`cache` property of its payload](/docs/reference/workers/docker-worker/docs/caches). 28 | 29 | Generic-worker uses the [`mounts` property](/docs/reference/workers/generic-worker/docs/payload). 30 | Note that generic-worker has the capability to pre-fill a cache before task execution begins, and to mount such caches read-only. 31 | -------------------------------------------------------------------------------- /src/manual/using/github.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/github.md 3 | title: Integrating with Github 4 | order: 10 5 | --- 6 | 7 | Taskcluster provides a convenient integration with Github to enable starting 8 | tasks when events occur on a github repository. Setting up the integration is 9 | simple: add the integration to the Github organization and repository 10 | (this requires administrator rights on the organization), then add a file called 11 | `.taskcluster.yml` to the root of the repository. 12 | 13 | We recommend using [The quickstart 14 | tool](https://tools.taskcluster.net/quickstart/) to get started. For more 15 | in-depth documentation, [the reference 16 | pages](/docs/reference/integrations/taskcluster-github) 17 | provide detailed information. 18 | 19 | ## Task Security 20 | 21 | It is convenient for contributors to run tasks on pull requests, but those 22 | tasks then run arbitrary, un-reviewed code. If the tasks have access to 23 | resources that should not be publicly available, then a pull request can 24 | provide a route for a malicious contributor to abuse those resources. 25 | 26 | The Github integration provides per-repository configuration for building pull 27 | requests, with the configuration controlled from the default (`master`) branch. 28 | The configuration can allow tasks to be created for any author's pull requests, 29 | or limit tasks to pull requests created by repository collaborators. 30 | 31 | With a little extra care in setting up the `repo:github.com//` 32 | scopes, it is possible to provide scopes for branches (containing trusted, 33 | reviewed code) that differ from the scopes given to pull requests. 34 | -------------------------------------------------------------------------------- /src/manual/using/handling-high-load.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Handling High Load 3 | --- 4 | 5 | When worker capacity is constrained, such as in a fixed pool of hardware, the 6 | demand for work can outstrip available capacity. When this occurs, Taskcluster 7 | provides a few tools that can help. 8 | 9 | ## Priorities 10 | 11 | Task [priorities](/docs/manual/tasks/priority) are useful to ensure that the most 12 | important tasks are executed first. When the capacity issues are transient, 13 | this can be helpful. However, it can cause starvation of lower-priority tasks 14 | if higher-priority tasks consume all of the limited resources. 15 | 16 | ## Deadlines 17 | 18 | Sometimes tasks are not useful after a given time has passed. For example, the 19 | results of a test run are probably not useful more than 12 hours after the 20 | push. Setting appropriate task [deadlines](/docs/manual/tasks/times) can help to 21 | remove such useless tasks from the backlog if they are not executed earlier. 22 | 23 | ## Superseding 24 | 25 | In truth, most often tasks become less useful when some later task would 26 | provide equivalent results. For example, a test on revision 76 provides useful 27 | results about revision 75 as well: if it passes, then likely the changes in 28 | revisions 76 and 75 were both OK. In Taskcluster terms, the task for revision 29 | 76 has superseded that for revision 75. 30 | 31 | Most workers support superseding. It is implemented by calling out to an 32 | external service that determines the "supersedes" relationship between tasks. 33 | When superseding is possible, the worker marks older tasks as "supserseded" 34 | while performing the newest task. 35 | 36 | See the [queue 37 | reference](/docs/reference/platform/taskcluster-queue/docs/superseding) for the 38 | technical details of the supserseding convention. 39 | -------------------------------------------------------------------------------- /src/manual/using/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/index.md 3 | title: Using Taskcluster 4 | order: 50 5 | --- 6 | 7 | There's so much more of Taskcluster to explore! The details are all in the 8 | [reference](/docs/reference), but it's not always clear where to start to solve a 9 | particular problem. 10 | 11 | This section addresses a series of common use cases, sketching recommended 12 | solutions that will help you figure out where to begin exploring to learn more. -------------------------------------------------------------------------------- /src/manual/using/indexing.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/indexing.md 3 | title: Indexing Tasks 4 | order: 30 5 | --- 6 | 7 | Since task IDs are random, it can be difficult to find a task after it has been 8 | created without recording that task ID somewhere. The Github integration will 9 | link to tasks from pull requests and commits, and services like Treeherder 10 | gather and link to tasks for specific projects, but neither of these solutions 11 | is especially flexible. 12 | 13 | The [Index service](/docs/reference/core/index) stores references to completed tasks 14 | in a hierarchical naming structure, similar to a directory tree. Careful naming 15 | allows a more flexible approach. For example, if one of the hierarchy levels is 16 | the revision ID from version control, then it is simple to find a task given a 17 | revision ID. 18 | 19 | See the [namespaces document](/docs/manual/design/namespaces) for more detail on 20 | index path names. -------------------------------------------------------------------------------- /src/manual/using/integration/backend.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/integration/backend.md 3 | title: Backend Services 4 | order: 20 5 | --- 6 | 7 | If you are building a CI-related service, it is sensible to design it to accept 8 | Taskcluster credentials for authentication to its API methods. 9 | 10 | This is quite simple: call 11 | [`auth.authenticateHawk`](/docs/reference/platform/auth/reference/api-docs#authenticateHawk) 12 | from your backend with the appropriate parts of the HTTP request. Then verify 13 | that the returned scopes satisfy the scopes required for the operation being 14 | protected. There is no need to "register" the scopes you would like to use, 15 | but see the [namespaces document](/docs/manual/design/namespaces) for guidance on 16 | selecting appropriate names. 17 | 18 | The advantage of this approach is that it facilitates service re-use: anyone 19 | who is familiar with Taskcluster APIs can call your API, whether from a task, 20 | the command line, the browser, or another service. Furthermore, the backend 21 | never sees the credentials, just the Hawk signature. 22 | 23 | If you build a user interface around this approach, it is safe to display the 24 | clientId to the user so they can recognize the login. Just be cautious of the 25 | warning in the guidelines section regarding using `clientId`s for authentication. 26 | -------------------------------------------------------------------------------- /src/manual/using/integration/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/integration/index.md 3 | title: Integration with Other Applications 4 | order: 200 5 | --- 6 | 7 | Taskcluster is built to mix in with other applications in a larger CI 8 | environment. Aside from the platform services, no Taskcluster component is 9 | privileged and other implementations are always possible. 10 | 11 | For example, the Taskcluster tools site is built to be generally useful and to 12 | provide a clear view of the Taskcluster system, but may not be suited to 13 | providing the information your developers need. It's easy to write a new 14 | frontend that uses the Taskcluster services to generate a dashboard specific to 15 | your project, and even to authenticate users and allow them to manipulate tasks 16 | and other APIs via your site. 17 | 18 | Backend applications can create tasks and call other Taskcluster API methods. 19 | They can also listen for Taskcluster-related events via Pulse and react 20 | appropriately, perhaps recording test performance statistics into a database 21 | for later analysis. -------------------------------------------------------------------------------- /src/manual/using/integration/libraries.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/integration/libraries.md 3 | title: Client Libraries 4 | order: 50 5 | --- 6 | 7 | The Taskcluster client libraries enable you to interface with Taskcluster in your automation. 8 | 9 | ### Node.js Client Library 10 | 11 | * Package and Documentation on [npm](https://www.npmjs.com/package/taskcluster-client) 12 | * Source and Documentation on [github](https://github.com/taskcluster/taskcluster-client) 13 | 14 | ### Python Client Library 15 | 16 | * Package on [pypi](https://pypi.python.org/pypi/taskcluster) 17 | * Documentation and Source on [github](https://github.com/taskcluster/taskcluster-client.py) 18 | 19 | ### Go (golang) Client Library 20 | 21 | * Source and Usage Documentation on [github](http://taskcluster.github.io/taskcluster-client-go) 22 | * API Documentation on [godoc](https://godoc.org/github.com/taskcluster/taskcluster-client-go) 23 | 24 | _(Go checks out libraries directly from source control, so no need for a package. Yay!)_ 25 | 26 | ### Java Client Library 27 | 28 | * Package on [maven central](http://search.maven.org/#search|gav|1|g%3A%22org.mozilla.taskcluster%22%20AND%20a%3A%22taskcluster-client%22) 29 | * Source and Usage Documentation on [github](http://taskcluster.github.io/taskcluster-client-java) 30 | * API Documentation [javadocs](http://taskcluster.github.io/taskcluster-client-java/apidocs/) 31 | 32 | ### Taskcluster CLI 33 | 34 | * Package and Documentation on [npm](https://www.npmjs.com/package/taskcluster-cli) 35 | * Source and Documentation on [github](https://github.com/taskcluster/taskcluster-cli) 36 | 37 | This tool has a `taskcluster signin` which can helpfully set the [standard environment variables](/docs/manual/design/env-vars) after authenticating you with a browser. 38 | All of the other client libraries have utility functions to use those standard variables. 39 | -------------------------------------------------------------------------------- /src/manual/using/integration/pulse.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/integration/pulse.md 3 | title: Pulse Integrations 4 | order: 40 5 | --- 6 | 7 | [Pulse](/docs/manual/design/apis/pulse) provides a great arms-length integration 8 | point for connecting other services to Taskcluster. Taskcluster already sends a 9 | great many messages as tasks are executed, and the `task.routes` property 10 | allows you to add additional, custom messages. 11 | 12 | A common pattern -- used by Treeherder, for example -- is to include a custom 13 | route in tasks of interest, then add additional configuration under the 14 | `task.extra` key. 15 | 16 | For example a custom build dashboard for the amazingcats project might add the 17 | route `project.amazingcats..test` to each test task. The dashboard 18 | would listen for messages copied to this route. For each task, it would 19 | examine `task.extra.amazingcats.test-info` to find information about the tests 20 | that were run, and might also look for a test-specific artifact in the task 21 | indicating the results of those tests. All of this gets loaded into the 22 | dashboard's database and displayed to developers. 23 | 24 | At the moment, Taskcluster does not react to external pulse messages, but there 25 | are [plans](https://github.com/taskcluster/taskcluster-rfcs/issues/66) to add 26 | such support. -------------------------------------------------------------------------------- /src/manual/using/task-notifications.md: -------------------------------------------------------------------------------- 1 | --- 2 | filename: using/task-notifications.md 3 | title: Task Notifications 4 | order: 80 5 | --- 6 | 7 | There are two ways to have Taskcluster send notifications on your behalf. 8 | 9 | The first is by specifying certain routes in the task definition, for example: 10 | 11 | ```yaml 12 | routes: 13 | - notify.email.example@example.com.on-failed 14 | ``` 15 | 16 | This method is described in detail on the Taskcluster-Notify [usage 17 | page](/docs/reference/core/taskcluster-notify/docs/usage). 18 | 19 | The second method is to call the Taskcluster-Notify service directly. The API 20 | definitions are available on the [reference 21 | page](/docs/reference/core/taskcluster-notify/references/api). The API is available 22 | through the 23 | [Taskcluster-Proxy](/docs/reference/workers/docker-worker/docs/features#feature-taskclusterproxy-) 24 | if you're working from within a task. 25 | 26 | ```js 27 | import taskcluster from 'taskcluster-client'; 28 | async function notify() { 29 | # specify a baseUrl via the taskcluster proxy 30 | var notify = new taskcluster.Notify({baseUrl: 'http://taskcluster/notify/v1'}); 31 | await notify.irc({'#myproject', 'example', 'the build is still running'}) 32 | } 33 | ``` -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/common_problems.md: -------------------------------------------------------------------------------- 1 | ### Common Problems - Tips and Tricks 2 | 3 | * All Taskcluster tasks do not appear in Treeherder 4 | * Check Decision task 5 | * Talk with #taskcluster team if no decision task symbol appears 6 | * If Decision task fails, but commit didn't alter any job related problems, rebase 7 | * Only certain tasks do not appear in Treeherder 8 | * Check parent task to ensure it was scheduled and completed successfully 9 | * Are they configured to report to treeherder production? 10 | * Inspect task graph 11 | * Inspect decision task, click Task tab, click Task group ID 12 | * Scope error when scheduling job 13 | * If new task, talk with #taskcluster team to ensure branch has appropriate scopes 14 | * Tasks keep getting resolved as exception 15 | * View exception reason in the Treeherder Job Details pane or "Reason Resolved" 16 | in the task inspector. 17 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/decision_task.md: -------------------------------------------------------------------------------- 1 | ### Taskcluster Decision Task 2 | 3 | * Determines what should get run and when. 4 | ``` 5 | mach taskcluster-graph 6 | ``` 7 | * Constructs JSON payload 8 | * Worker extends the graph with this object 9 | ``` 10 | { 11 | tasks: [ 12 | { 13 | taskId: "XgvL0qtSR92cIWpcwdGKCA", 14 | requires: [], 15 | reruns: 3, 16 | task: {...} 17 | ... 18 | }, 19 | { 20 | taskId: "73GsfK62QNKAk2Hg1EEZTQ", 21 | requires: ["XgvL0qtSR92cIWpcwdGKCA"], 22 | task: { 23 | payload: {...} 24 | ... 25 | }, 26 | } 27 | ] 28 | } 29 | ``` 30 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/docker_tips.md: -------------------------------------------------------------------------------- 1 | ### Docker Tips 2 | 3 | * Volume Mount 4 | * -v : 5 | * Uses 6 | * Mount local source checkout 7 | * Keep cached copies of object directory and tc-vcs checkouts 8 | * Space issues 9 | * use '--rm' to remove container after completion 10 | * Enter running container 11 | * use 'docker exec -it /bin/bash' 12 | 13 | Example: 14 | 15 | ```bash 16 | cid=$(docker run \ 17 | -rm \ 18 | -d \ 19 | -v /Users/nobody/repos/gecko/:/gecko \ 20 | ubuntu:14.04 \ 21 | sleep 60) 22 | 23 | docker exec -it $cid /bin/bash 24 | ``` 25 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/how_did_those_jobs.md: -------------------------------------------------------------------------------- 1 | ### How did those jobs get there? 2 | 3 | * Pushlog polling (mozilla-taskcluster) 4 | * Decision Task created - in-tree task definition 5 | * All tasks defined - some tasks scheduled 6 | * Dependent tasks scheduled once required tasks successfully complete 7 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/images/interactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/developer_workflow/images/interactive.png -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/images/run_locally.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/developer_workflow/images/run_locally.png -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/images/task_inspector_failed_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/developer_workflow/images/task_inspector_failed_task.png -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/images/treeherder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/developer_workflow/images/treeherder.png -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/images/treeherder1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/developer_workflow/images/treeherder1.png -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/images/treeherder_job_details_annotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/developer_workflow/images/treeherder_job_details_annotation.png -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/run_locally.md: -------------------------------------------------------------------------------- 1 | ### Run Tasks Locally 2 | 3 | * Provides a reproducible script for running (most) tasks locally 4 | * Caveats 5 | * Only works for docker based tasks currently 6 | * Some setup needed 7 | * taskcluster docker environment 8 | * Clone docker-worker repo, run 'vagrant up' 9 | * requires virtualbox (might not be an option on some Linux installations) 10 | * Alernative setup docker,kernel modules for video and audio loopback devices 11 | * Some features such as testdroid device not available locally 12 | 13 |
14 | 18 |
19 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/run_locally_environment.md: -------------------------------------------------------------------------------- 1 | ### Taskcluster local environment 2 | 3 | * Configures similar environment that runs in production 4 | * same ubuntu version 5 | * kernel modules for loopback devices 6 | * docker version 7 | * Home directory synced 8 | 9 | ```bash 10 | git clone http://www.github.com/taskcluster/docker-worker 11 | cd docker-worker 12 | vagrant up 13 | vagrant ssh 14 | docker run -it ... 15 | ``` 16 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/struggle_intro.md: -------------------------------------------------------------------------------- 1 | ### Life (and struggle) of a Developer 2 | 3 | Outline: 4 | 5 | * Push changes -> Jobs scheduled 6 | * How did those jobs get there? 7 | * Taskcluster Decision Task 8 | * Treeherder - Job States 9 | * Treeherder - Job Details 10 | * Task Failed - Now What? 11 | * Task Inspector - Edit Task 12 | * Interactive Tasks 13 | * Run task locally 14 | * Common Problems 15 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/task_failed.md: -------------------------------------------------------------------------------- 1 | ### Task Failed - Task Inspector 2 | 3 | Log, Artifacts, Task Details
4 | 5 |
6 | 10 |
11 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/task_inspector_edit_task.md: -------------------------------------------------------------------------------- 1 | ### Edit Task 2 | 3 | * Edit Task button available within task inspector 4 | * Opens Task Creator for further editing and submission 5 | * Caveats 6 | * Dependencies not scheduled upon completion 7 | * Routes removed 8 | * Must possess scopes for scheduling task 9 |
10 | 14 |
15 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/task_interactive.md: -------------------------------------------------------------------------------- 1 | ### Interative Feature 2 | 3 | * Allows shell access to running task container 4 | * Proxied websocket to 'docker exec' 5 | * interactive.html artifact redirects to website with terminal 6 | * Must be logged in and have scopes for get the private/docker-worker/interactive.html artifact 7 | * Enabled by setting worker feature flag 8 | 9 | ```js 10 | "payload": { 11 | ... 12 | "features": { 13 | "interactive": true 14 | } 15 | } 16 | ``` 17 |
18 | 22 |
23 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/treeherder.md: -------------------------------------------------------------------------------- 1 | ### Treeherder - Job States 2 | * Result set created (mozilla-taskcluster, gaia-taskcluster) 3 | * Jobs inserted on task pending 4 | * Jobs updated on completion 5 | * Completed - Green Symbol 6 | * Failed - Orange Box 7 | * Exception - Purple Box 8 | * Rerun - Blue Symbol 9 | * Logs parsed on completion (build-4h artifact) 10 | 14 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/developer_workflow/treeherder_job_details.md: -------------------------------------------------------------------------------- 1 | ### Treeherder - Job Details 2 | 3 | * Inspect Task Link 4 | * Failure Summary 5 | * Treeheder regular expression matching 6 | * Taskcluster error prefix 7 | * Task Log 8 | 9 | 13 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/end.md: -------------------------------------------------------------------------------- 1 | ### Conclusion 2 | 3 | * We execute your tasks 4 | * Questions? 5 | 6 |

7 |
8 | 9 | - docs.taskcluster.net
10 | - #taskcluster at irc.mozilla.org 11 |
12 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/migration-roadmap.md: -------------------------------------------------------------------------------- 1 | ### Buildbot To Taskcluster Migration Roadmap 2 | 3 | Q4: 4 | 5 | * Migrate Linux builds and tests 6 | 7 | Q1: 8 | 9 | * Finish Linux migration 10 | * Turn off Linux on Buildbot 11 | * Start OS X migration 12 | 13 | Q2: 14 | 15 | * Turn off OS X on Buildbot 16 | * Start Windows migration 17 | 18 | Q3: 19 | 20 | * Wrap up? 21 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/tc-roadmap.md: -------------------------------------------------------------------------------- 1 | ### Taskcluster Roadmap 2 | 3 | Q1: 4 | 5 | * Big Graph Scheduler - enables larger task-graphs, self-dependencies 6 | * Production support for OS X on hardware 7 | * Refactor the workers 8 | 9 | Q2: 10 | 11 | * Deduplication of public artifacts 12 | * Revisit Docker for Windows 13 | * UI overhaul on tools.taskcluster.net 14 | 15 | 16 | 17 | 18 | 19 | 20 | --- 21 | 22 | ### Taskcluster Roadmap 23 | 24 | Q3: 25 | 26 | * Support a new cloud provider (e.g. GCE, Digital Ocean..) 27 | * Explore virtuous feedback for system users 28 | 29 | Q4: 30 | 31 | * Make Taskcluster redeployable by FOSS users 32 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/team.md: -------------------------------------------------------------------------------- 1 | ### Taskcluster Platform Team and friends 2 | 3 | IRC: #taskcluster, Github: http://github.com/taskcluster 4 | 5 | * garndt: docker-worker and integration 6 | * wcosta: intree config and integration 7 | * jonasfj: platform and core services dev 8 | * jhford: core services (aws provisioner, s3 copy proxy and others), taskcluster-client.py 9 | * pmoore: generic worker, tc-client-go 10 | * dustin: scopes, linux/fennec build 11 | * ted: OS X cross-compiled build 12 | * gerard-majax: some B2G device builds 13 | * mshal: index 14 | * mrrrgn: tc-github, tc-secrets 15 | * selenamarie: buildbot to taskcluster migration 16 | 17 | More on the wiki: http://wiki.mozilla.org/Taskcluster 18 | -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/what-is-task.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-101/slides/what-is-task.md -------------------------------------------------------------------------------- /src/presentations/TC-101/slides/what-is-tc.md: -------------------------------------------------------------------------------- 1 | ### What is Taskcluster? 2 | 3 | Taskcluster is a task execution platform. 4 | You can: 5 | 6 | * Run any command in a container. 7 | * Configure and install software you need. 8 | * Run the task exec environment locally. 9 | 10 | 11 | 12 | 13 | 14 | --- 15 | 16 | 17 | You can run a task right now in our task-creator: 18 | 19 | https://tools.taskcluster.net/introduction/getting-started/ 20 |
(you need to authenticate with a mozilla.com address) 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | --- 29 | 30 | 31 | 32 | 33 | 34 | 35 | ### Anatomy of a task 36 | 37 | A simple task: 38 | 39 | ``` 40 | { 41 | provisionerId: 'aws-provisioner-v1', 42 | workerType: 'tutorial', 43 | created: '2015-06-15Z12:00:00, 44 | deadline: '2015-06-22Z12:00:00, 45 | payload: { 46 | image: 'ubuntu:13.10', 47 | command: ['/bin/bash', '-c', 'echo "hello World"'], 48 | maxRunTime: 60 * 10 49 | }, 50 | metadata: { 51 | name: "Example Task", 52 | description: "Markdown description of **what** this task does", 53 | owner: "name@example.com", 54 | source: "http://tools.taskcluster.net/task-creator/" 55 | } 56 | } 57 | ``` 58 | 59 | 60 | 61 | 62 | 63 | 64 | --- 65 | 66 | 67 | ### Tasks live in tree! 68 | 69 | 70 | 71 | 72 | We made an intentional choice to move this configuration to the code: 73 | 74 | ``` 75 | testing/taskcluster/* 76 | 77 | ``` 78 | 79 | We have 41 build and 177 test tasks in-tree today. 80 | 81 | * B2G builds and tests, 82 | * Linux debug and some tests, and 83 | * OS X cross-compiled builds 84 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/end.md: -------------------------------------------------------------------------------- 1 | ### Conclusion 2 | 3 | * We execute your tasks 4 | * Questions? 5 | 6 |

7 |
8 | 9 | - docs.taskcluster.net
10 | - #taskcluster at irc.mozilla.org 11 |
12 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/hooks/00-frontpage.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 |
Topic:Hooks
Speaker:Dustin Mitchell
6 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/hooks/01-cron.md: -------------------------------------------------------------------------------- 1 | ## Hooks 2 | 3 | >
"Cron for Tasks"
4 | 5 | ### Future: 6 | 7 | * GitHub, GitLab, etc. web hooks 8 | * Triggering tasks from pulse messages 9 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/hooks/02-creating.md: -------------------------------------------------------------------------------- 1 | ## Hooks 2 | 3 | * To create: use [the "hooks" tool](https://tools.taskcluster.net/hooks/) 4 | 5 | * hookGroupId: `project-` for your project 6 | 7 | * may need scopes added for your project 8 | 9 | * hookId: arbitrary 10 | 11 | * task payload is validated 12 | 13 | * no parameterization supported (yet) 14 | 15 | * datestamps will be automatically updated when task created 16 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/hooks/03-scopes.md: -------------------------------------------------------------------------------- 1 | ## Hooks 2 | 3 | * Hooks create tasks with `assume:hook-id:/` 4 | 5 | * You must have this role to create/modify the hook 6 | 7 | * The role must have all scopes necessary to run the task; for example, [assume:hook-id:taskcluster/tc-vcs-refresh](https://tools.taskcluster.net/auth/roles/#hook-id:taskcluster%252ftc-vcs-refresh) 8 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/00-frontpage.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 | 6 |
Topic:In-Tree Scheduling
Speaker:Wander Costa
Duration:15 mins
7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/01-taskcluster.md: -------------------------------------------------------------------------------- 1 | ### Taskcluster in-tree configuration 2 | 3 | * $gecko_dir/testing/taskcluster 4 | * In tree task files are under tasks/ 5 | * Task categorization is just a convention. 6 | * Taskcluster doesn't understand a build or test task. 7 | * Taskcluster is just a task runner. 8 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/02-overview.md: -------------------------------------------------------------------------------- 1 | ### Task file overview 2 | 3 | * Tasks are stored in yaml format 4 | * They support an "include" directive, called `$inherits` 5 | * There are some predefined variables replacement surrounded by `{{{}}}` 6 | 7 | ``` 8 | $inherits: 9 | from: 'tasks/builds/b2g_phone_base.yml' 10 | variables: 11 | build_name: 'flame-kk' 12 | build_type: 'opt' 13 | task: 14 | created: '{{now}}' 15 | deadline: '{{#from_now}}24 hours{{/from_now}}' 16 | ``` 17 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/03-scopes.md: -------------------------------------------------------------------------------- 1 | ## Scopes 2 | 3 | * **Short version:** scopes = permissions 4 | * **Long version:** http://docs.taskcluster.net/manual/apis/authorized-scopes/ 5 | 6 | ``` 7 | scopes: 8 | - docker-worker:cache:tc-vcs 9 | - docker-worker:image:taskclusterprivate/phone-builder:1.0.22 10 | ``` 11 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/04-routes.md: -------------------------------------------------------------------------------- 1 | ### Routes configuration 2 | 3 | * Version 1 is configured inside the task 4 | * Version 2 has the routes.json file 5 | * You can find the routes at https://tools.taskcluster.net/index/#gecko.v2 6 | 7 | ``` 8 | routes: 9 | - index.gecko.v1.mozilla-central.revision.linux.tip.flame-kk.opt 10 | ``` 11 | 12 | https://tools.taskcluster.net/index/#gecko.v1.mozilla-central.latest.linux.flame-kk/gecko.v1.mozilla-central.latest.linux.flame-kk.opt 13 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/05-treeherder.md: -------------------------------------------------------------------------------- 1 | ### Treeherder configuration 2 | 3 | ``` 4 | extra: 5 | treeherderEnv: 6 | - production 7 | - staging 8 | treeherder: 9 | symbol: B 10 | groupSymbol: Flame-KK 11 | groupName: Flame KitKat Device Image 12 | machine: 13 | platform: b2g-device-image 14 | ``` 15 | 16 |
17 | ![Treeherder](slides/intree-config/images/treeherder.jpg) 18 |
19 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/06-payload.md: -------------------------------------------------------------------------------- 1 | ### Payload 2 | 3 | * Payload is worker specific 4 | * Here I am using docker-worker tasks as an example 5 | 6 | ``` 7 | payload: 8 | image: taskclusterprivate/phone-builder:0.0.22 9 | maxRunTime: 3600 10 | 11 | artifacts: 12 | private/build: 13 | expires: '2016-11-26T15:00:22.195275Z' 14 | path: /home/worker/artifacts/ 15 | type: directory 16 | public/build: 17 | expires: '2016-11-26T15:00:22.195331Z' 18 | path: /home/worker/artifacts-public/ 19 | type: directory 20 | 21 | cache: 22 | tc-vcs: /home/worker/.tc-vcs 23 | 24 | env: 25 | GECKO_BASE_REPOSITORY: http://hg.mozilla.org/mozilla-central 26 | GECKO_HEAD_REV: tip 27 | ``` 28 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/07-branch.md: -------------------------------------------------------------------------------- 1 | ### Branch config 2 | 3 | * Which tasks run for each branch? 4 | * taskscluster/tasks/branches 5 | * https://github.com/taskcluster/mozilla-taskcluster/blob/master/src/config/default.yml 6 | * branches//job_flags.yml 7 | * By default the branch will use branches/base_jobs.yml 8 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/08-branch.md: -------------------------------------------------------------------------------- 1 | ### Branch config 2 | 3 | ``` 4 | builds: 5 | linux64_gecko: 6 | platforms: 7 | - b2g 8 | types: 9 | opt: 10 | task: tasks/builds/b2g_desktop_opt.yml 11 | debug: 12 | task: tasks/builds/b2g_desktop_debug.yml 13 | tests: 14 | gaia-linter: 15 | allowed_build_tasks: 16 | tasks/builds/b2g_desktop_opt.yml: 17 | task: tasks/tests/b2g_linter.yml 18 | tasks/builds/mulet_linux.yml: 19 | task: tasks/tests/mulet_linter.yml 20 | ``` 21 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/09-running.md: -------------------------------------------------------------------------------- 1 | ### Running tasks manually 2 | 3 | ``` 4 | $ sudo npm install taskcluster-cli -g 5 | $ ./mach taskcluster-build --owner=wcosta@mozilla.com \ 6 | --head-repository=https://hg.mozilla.org/mozilla-central 7 | --head-rev=tip \ 8 | tasks/builds/b2g_flame_kk_opt.yml | \ 9 | taskcluster run-task --verbose 10 | ``` 11 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-config/images/treeherder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-102/slides/intree-config/images/treeherder.jpg -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/00-frontpage.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 | 6 |
Topic:In-Tree Docker Images
Speaker:Greg Arndt
Duration:15 mins
7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/01-docker-image.md: -------------------------------------------------------------------------------- 1 | ### Docker Images 2 | 3 | * specified by typical docker naming 4 | * registry/repository:tag 5 | 6 | ```js 7 | task: { 8 | payload: { 9 | image: "quay.io/ubuntu:14.04" 10 | ... 11 | } 12 | } 13 | ``` 14 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/02-task-image.md: -------------------------------------------------------------------------------- 1 | ### Task Images 2 | 3 | * stored as task artifacts 4 | * tasks define what task ID and image path to use 5 | 6 | ```js 7 | task: { 8 | payload: { 9 | image: { 10 | type: 'task-image', 11 | taskId: ‘ABC123' 12 | path: ‘public/image.tar' 13 | }, 14 | ... 15 | } 16 | ``` 17 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/03-image-workflow.md: -------------------------------------------------------------------------------- 1 | ### In-tree Image Workflow 2 | 3 | Images defined at gecko/testing/docker/ 4 | 5 |
6 | Previously:
7 |
    8 |
  • edit image context
  • 9 |
  • bump verison
  • 10 |
  • build
  • 11 |
  • tag
  • 12 |
  • push image to registry
  • 13 |
  • commit changes and push to vcs
  • 14 |
15 |
16 | 17 |
18 |
19 | On-push image building:
20 |
    21 |
  • edit image context
  • 22 |
  • commit changes and push to vcs
  • 23 |
  • Decision task triggers image building task
  • 24 |
25 |
26 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/04-task-definition.md: -------------------------------------------------------------------------------- 1 | ### Task Definition 2 | 3 | Before: 4 | 5 | ``` 6 | image: '{{#docker_image}}builder{{/docker_image}}' 7 | ``` 8 | 9 | After: 10 | 11 | ``` 12 | image: 13 | type: 'task-image' 14 | path: 'public/image.tar' 15 | taskId: '{{#task_id_for_image}}builder{{/task_id_for_image}}' 16 | ``` 17 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/05-dockerfile-before.md: -------------------------------------------------------------------------------- 1 | ### Example DockerFile 2 | 3 | Location: testing/docker/builder/Dockerfile 4 | 5 | ``` 6 | FROM quay.io/mozilla/b2g-build:0.2.9 7 | MAINTAINER Dustin J. Mitchell 8 | 9 | ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH 10 | ENV TOOLTOOL_CACHE /home/worker/tools/tooltool-cache 11 | 12 | ADD https://raw.githubusercontent.com/taskcluster/buildbot-step/58a16f7370a8b4de7a4458436a4a5fad9905f5d9/buildbot_step.js /home/worker/bin/buildbot_step 13 | 14 | ... 15 | ``` 16 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/06-dockerfile-after.md: -------------------------------------------------------------------------------- 1 | ### Example Dockerfile 2 | 3 | Location: testing/docker/builder/Dockerfile 4 | 5 | ``` 6 | FROM quay.io/mozilla/b2g-build:0.2.9 7 | MAINTAINER Dustin J. Mitchell 8 | 9 | ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH 10 | ENV TOOLTOOL_CACHE /home/worker/tools/tooltool-cache 11 | 12 | ADD https://raw.githubusercontent.com/taskcluster/buildbot-step/58a16f7370a8b4de7a4458436a4a5fad9905f5d9/buildbot_step.js /home/worker/bin/buildbot_step 13 | 14 | RUN apt-get update && apt-get install -y wget 15 | 16 | ... 17 | ``` 18 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/07-example-push.md: -------------------------------------------------------------------------------- 1 | ### Example on-push build 2 | 3 | ```bash 4 | /b2g-inbound$ hg commit -m \ 5 | "Testing - add file try: -b do -p linux64_gecko -u none" 6 | /b2g-inbound$ hg push -f -r . try 7 | ….added 1 changesets... 8 | ``` 9 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/08-treeherder1.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/09-treeherder2.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/10-treeherder3.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/images/decision_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-102/slides/intree-image/images/decision_task.png -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/images/dependent_tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-102/slides/intree-image/images/dependent_tasks.png -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/intree-image/images/image_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/TC-102/slides/intree-image/images/image_task.png -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/provisioner/00-frontpage.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 | 6 |
Topic:AWS Provisioner
Speaker:John Ford
Duration:15 mins
7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/provisioner/01-overview.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | * Bids on all EC2 nodes we have 4 | * spot bids 5 | * Worker Type definitions 6 | * Capacity, utility factor and bias 7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/provisioner/02-provisioning-algorithm.md: -------------------------------------------------------------------------------- 1 | ## Determining what bids we need 2 | 3 | * List all owned Instance and SpotRequests 4 | * Sort them into buckets by state and workerType 5 | * Get the number of pending tasks 6 | * Determine difference between pending tasks and extant capacity 7 | * Min and max capacity 8 | * Submit bids 9 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/provisioner/03-provisioning-bidding.md: -------------------------------------------------------------------------------- 1 | ## Bidding! 2 | 3 | * Figure out the price of all instance types in all regions 4 | * Calculate a comparable price by multiplying the relevant values: 5 | * Actual billable SpotPrice 6 | * Capacity of instanceType 7 | * Bias based on statistics 8 | * Comparison price is used to pick instanceType, availabilityZone and region 9 | * We submit for 2x the actual billable SpotPrice 10 | * Sanity limits 11 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/provisioner/04-killing.md: -------------------------------------------------------------------------------- 1 | ## Killing and Death 2 | 3 | * Rouges: has aws-provisioner-v1 KeyPair prefix but is not known workerType 4 | * common example: delete a workerType and the rouge killer force kills instances 5 | * Zombies: instances which have been alive way too long 6 | * 96 hour hard kill from provisioner 7 | * workers should enforce a 72 hour self-kill 8 | * Instances which vanish from AWS State: stop counting them after a time 9 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/provisioner/05-breakage.md: -------------------------------------------------------------------------------- 1 | ## Breaking 2 | 3 | * When the provisioner breaks we stop being able to spin up new instance 4 | * Existing instances continue to run without trouble 5 | * Provisioner can be restarted safely with minimal data loss 6 | * API prints error messages where appropriate 7 | * Provisioner logs have sensitive data and are private 8 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/secrets/00-frontpage.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 |
Topic:Secrets
Speaker:Dustin Mitchell
6 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/secrets/01-options.md: -------------------------------------------------------------------------------- 1 | ## Secrets 2 | 3 | So you need to keep a secret? 4 | 5 | * Encrypted environment variables 6 | * But single shared key without any kind of PFS 7 | * Private docker image 8 | * But hides a lot of your process - be open! 9 | * Docker-worker feature (taskcluster proxy, balrog vpn proxy, relengapi proxy) 10 | * Must be deployed by the TC team 11 | * Secrets API 12 | * Woo! 13 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/secrets/02-api.md: -------------------------------------------------------------------------------- 1 | ## Secrets API 2 | 3 | * Key/value store - keys are strings, values are objects. 4 | * Protected by scopes over the keys 5 | * No UI right now :( 6 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/00.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 | 6 |
Topic:Taskcluster Clients
Speaker:Peter Moore
Duration:15 mins
7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/01.md: -------------------------------------------------------------------------------- 1 | ## Topics 2 |
    3 |
  • What are the Taskcluster client libraries?
  • 4 |
  • What can you do with them?
  • 5 |
  • Live examples
  • 6 |
  • Reference materials
  • 7 |
  • Extending
  • 8 |
  • Advanced Features
  • 9 |
10 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/02.md: -------------------------------------------------------------------------------- 1 | ## Interfaces to Taskcluster 2 | 3 |
    4 |
  • [Treeherder](https://treeherder.mozilla.org/)
  • 5 |
  • [Web Tools](https://tools.taskcluster.net/)
  • 6 |
  • [Client Libraries](#/5/17)
  • 7 |
8 | 9 |

__Anything__ you can via one of these web interfaces, you can also script.

10 | 11 |

You can also do much, much more.

12 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/03.md: -------------------------------------------------------------------------------- 1 | ## Libraries to access Taskcluster APIs 2 | 3 | HTTP Examples: 4 | 5 |
    6 |
  • Create a Task
  • 7 |
  • Purge a Cache
  • 8 |
  • Modify a Role
  • 9 |
  • Get a WorkerType
  • 10 |
11 | 12 | AMQP Examples: 13 | 14 |
    15 |
  • Listen for task failures
  • 16 |
  • Listen for purge cache events
  • 17 |
  • Listen for worker shutdowns
  • 18 |
  • Listen for completed task graphs
  • 19 |
20 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/04.md: -------------------------------------------------------------------------------- 1 | ## HTTP APIs: 2 | 3 | This is the current list of HTTP APIs: 4 | 5 |
    6 |
  • Queue
  • 7 |
  • Index
  • 8 |
  • Auth
  • 9 |
  • AWS Provisioner
  • 10 |
  • Secrets
  • 11 |
  • Scheduler
  • 12 |
  • Hooks
  • 13 |
  • Purge Cache
  • 14 |
15 | 16 | Note, each API maps to a Taskcluster component. 17 | 18 | More about this later... 19 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/05.md: -------------------------------------------------------------------------------- 1 | ## AMQP APIs (Pulse): 2 | 3 | This is the current list of AMQP (Pulse) APIs: 4 | 5 |
    6 |
  • Queue Events
  • 7 |
  • Scheduler Events
  • 8 |
  • Purge Cache Events
  • 9 |
  • AWS Provisioner Events
  • 10 |
11 | 12 | Note, again, each API maps to a Taskcluster Component (but not all components expose an AMQP API). 13 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/06.md: -------------------------------------------------------------------------------- 1 | ## Anatomy 2 | 3 |
    4 |
  • Four libraries: 5 |
      6 |
    • node.js
    • 7 |
    • python
    • 8 |
    • go
    • 9 |
    • java
    • 10 |
  • 11 |
  • Access to HTTP APIs
  • 12 |
  • Access to AMQP (Pulse) APIs
  • 13 |
  • Additional Utility functions (more about this later...)
  • 14 |
15 | 16 | See [Tools -> Client Libraries](/docs/manual/tools/clients/) 17 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/07.md: -------------------------------------------------------------------------------- 1 | ## Example - Go Client 2 | 3 | ```go 4 | import "github.com/taskcluster/taskcluster-client-go/queue" 5 | ... 6 | myQueue := queue.New(clientId, accessToken) 7 | myQueue.Certificate = certificate 8 | 9 | taskId, taskGroupId := slugid.Nice(), slugid.Nice() 10 | 11 | td := &queue.TaskDefinitionRequest{ 12 | Created: queue.Time(time.Now()), 13 | Deadline: queue.Time(time.Now().AddDate(0, 0, 1)), 14 | Expires: queue.Time(time.Now().AddDate(0, 1, 0)), 15 | Payload: json.RawMessage(`{ 16 | "command": [ ... ], 17 | "maxRunTime": 7200, 18 | }`), 19 | Retries: 1, 20 | ... 21 | } 22 | result, callSummary, err := myQueue.CreateTask(taskId, td) 23 | if err != nil { // handle error } 24 | ``` 25 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/08.md: -------------------------------------------------------------------------------- 1 | ## Example - Node.js Client 2 | 3 | ```node 4 | let taskcluster = require('taskcluster-client'); 5 | 6 | let task = { 7 | provisionerId: 'aws-provisioner-v1', 8 | workerType: 'tutorial', 9 | created: (new Date()).toJSON(), 10 | deadline: taskcluster.fromNowJSON('2 days 3 hours'), 11 | metadata: { ... } 12 | payload: {}, // worker specific payload 13 | 14 | // Further properties would go here 15 | }; 16 | 17 | let taskId = taskcluster.slugid(); 18 | 19 | // Create a Queue client object w. temporary credentials 20 | let queue = new taskcluster.Queue({ 21 | credentials: myCredentials 22 | }); 23 | 24 | // Create task 25 | let result = await queue.createTask(taskId, task); 26 | ``` 27 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/09.md: -------------------------------------------------------------------------------- 1 | ## Example - Python Client 2 | 3 | This is left as an exercise for the reader. 4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/10.md: -------------------------------------------------------------------------------- 1 | ## Example - Java Client 2 | 3 | This is left as an exercise for the reader. 4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/11.md: -------------------------------------------------------------------------------- 1 | ## Review of typical use cases: 2 | 3 |
    4 |
  • Schedule a task
  • 5 |
  • Schedule a group of tasks
  • 6 |
  • Find a task run
  • 7 |
  • Download an artifact
  • 8 |
  • Cancel a task
  • 9 |
  • Create a new client
  • 10 |
  • Adjust a role
  • 11 |
  • List roles
  • 12 |
  • Create a new client
  • 13 |
  • Retrieve a secret
  • 14 |
  • Perform an action in response to an event
  • 15 |
16 | 17 | See http://godoc.org/github.com/taskcluster/taskcluster-client-go 18 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/12.md: -------------------------------------------------------------------------------- 1 | ## HTTP APIs 2 | 3 |
    4 |
  • Each component _declares_ HTTP APIs
  • 5 |
  • Example: aws-provisioner/lib/routes/v1.js
  • 6 |
  • APIs require scopes
  • 7 |
  • APIs have input and output schemas
  • 8 |
  • Example: aws-provisioner/schemas/get-secret-response.yml
  • 9 |
  • After deploying provisioner, automatic updates to:
  • 10 |
      11 |
    • http://schemas.taskcluster.net/aws-provisioner/v1/get-secret-response.json
    • 12 |
    • http://references.taskcluster.net/aws-provisioner/v1/api.json
    • 13 |
    14 |
15 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/13.md: -------------------------------------------------------------------------------- 1 | ## References and Schemas 2 | 3 |
    4 |
  • Formal declarations of all Taskcluster API endpoints
  • 5 |
  • All APIs protected by scopes
  • 6 |
  • To add APIs, create a new Taskcluster component
  • 7 |
  • Input/Output can be validated via json schema
  • 8 |
9 | 10 |   11 | 12 | ### Catalogue of APIs 13 | 14 |
    15 |
  • http://references.taskcluster.net/manifest.json
  • 16 |
17 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/14.md: -------------------------------------------------------------------------------- 1 | # Clients are dumb 2 | 3 |
    4 |
  • References and schemas define syntax
  • 5 |
  • Clients are agnostic to the services they connect to
  • 6 |
7 | 8 |   9 | 10 | ## Adding new APIs 11 | 12 |
    13 |
  • Create a new reference in your Taskcluster component
  • 14 |
  • Add it to http://references.taskcluster.net/manifest.json
  • 15 |
  • The python and node clients are routinely republished
  • 16 |
  • The go and java clients will be updated within an hour
  • 17 |
18 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/15.md: -------------------------------------------------------------------------------- 1 | ## Client specialties 2 | 3 | ### Node.js 4 | The Node.js client can run directly in your browser via browserify. This is how the tools.taskcluster.net tools work. 5 | 6 | ### Go and Java 7 | Both these clients provide compile time guarantees that your data structures are valid. No more editing code, running a job for two hours, only to discover you spelt a property name wrong. 8 | 9 | ### Python 10 | For easy integration with the majority of tools at mozilla. 11 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/16.md: -------------------------------------------------------------------------------- 1 | ## Caveats 2 | 3 | The Java client does not support AMQP APIs. 4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/17.md: -------------------------------------------------------------------------------- 1 | ## Online Support 2 | 3 |
    4 |
  • Remember the [client libraries page](/docs/manual/tools/clients/)
  • 5 |
  • See our [node.js client tutorials](/docs/learn/async-javascript/)
  • 6 |
  • See the API docs:
  • 7 |
      8 |
    • [Queue](/docs/services/platform/queue/api-docs/)
    • 9 |
    • [Scheduler](/docs/services/platform/scheduler/api-docs/)
    • 10 |
    • [Auth](/docs/services/platform/auth/api-docs/)
    • 11 |
    • [AWS Provisioner](/docs/services/core/aws-provisioner/api-docs/)
    • 12 |
    • [Index](/docs/services/core/index/api-docs/)
    • 13 |
    • [Purge Cache](/docs/services/purge-cache/)
    • 14 |
    • [GitHub](/docs/manual/vcs/github/)
    • 15 |
    • [Secrets](/docs/services/core/secrets/api-docs/)
    • 16 |
    • [Hooks](/docs/services/hooks/)
    • 17 |
    18 |
  • Read the [go docs](http://godoc.org/github.com/taskcluster/taskcluster-client-go)
  • 19 |
  • Look after for new APIs as we all develop new components
  • 20 |
21 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/18.md: -------------------------------------------------------------------------------- 1 | ## Putting It All Together 2 | 3 |
    4 |
  • [Generic Worker integration tests](https://github.com/taskcluster/generic-worker/blob/41a6cc30fe61d3bd44a94800e11b92d900ddbc69/artifacts_test.go#L228)
  • 5 |
6 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/19.md: -------------------------------------------------------------------------------- 1 | ## Advanced features 2 | 3 |
    4 | * Issuing temporary credentials 5 | * Issuing signed URLs 6 |
7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/20.md: -------------------------------------------------------------------------------- 1 | ## Obtaining credentials 2 | 3 | Contact us in #taskcluster channel on IRC 4 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tc-clients/21.md: -------------------------------------------------------------------------------- 1 | ## Getting Involved 2 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tcgh/00-frontpage.md: -------------------------------------------------------------------------------- 1 |

 Taskcluster

2 | 3 | 4 | 5 | 6 |
Topic:Taskcluster Github
Speaker:Morgan Phillips
Duration:15 mins
7 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tcgh/01-tcgh.md: -------------------------------------------------------------------------------- 1 | ## Taskcluster-Github 2 | 3 | Got a Github repo and some pull requests? 4 | If it's a github.com/mozilla repo, just add .taskclusterrc! 5 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/tcgh/02-tcrc.md: -------------------------------------------------------------------------------- 1 | ## .taskclusterrc 2 | 3 | version: 0 4 | metadata: 5 | ... 6 | tasks: 7 | - provisionerId: "{{ taskcluster.docker.provisionerId }}" 8 | workerType: "{{ taskcluster.docker.workerType }}" 9 | extra: 10 | github: 11 | env: true 12 | events: 13 | - pull_request.opened 14 | - pull_request.synchronize 15 | - pull_request.reopened 16 | payload: 17 | maxRunTime: 3600 # Job timeout, in seconds 18 | image: "quay.io/mrrrgn/ubuntu-ci:0.0.1" # Our docker container (if using docker) 19 | command: ["/bin/bash", "-c", "echo hi"] # A command to run, list entries are arguments 20 | metadata: 21 | ... 22 | -------------------------------------------------------------------------------- /src/presentations/TC-102/slides/test.py: -------------------------------------------------------------------------------- 1 | import os 2 | import taskcluster 3 | 4 | queue = taskcluster.Queue({"credentials": { 5 | "clientId": os.environ["TASKCLUSTER_CLIENT_ID"], 6 | "accessToken": os.environ["TASKCLUSTER_ACCESS_TOKEN"], 7 | }}) 8 | 9 | taskId, taskGroupId = taskcluster.slugId(), taskcluster.slugId() 10 | 11 | task = queue.createTask({ 12 | "created": queue.Time(time.Now()), 13 | "deadline": queue.Time(time.Now().AddDate(0, 0, 1)), 14 | "expires": queue.Time(time.Now().AddDate(0, 1, 0)), 15 | "payload": { 16 | "command": [ ... ], 17 | "maxRunTime": 7200, 18 | }, 19 | "retries": 1, 20 | ... 21 | }, taskId=taskId) 22 | -------------------------------------------------------------------------------- /src/presentations/TC-201/slides/docker-worker.md: -------------------------------------------------------------------------------- 1 | ### Payload for docker-worker 2 | 3 | ```js 4 | task.payload = { 5 | image: "taskcluster/builder:0.5.6", 6 | command: ["/usr/local/bin/build-script.sh"], 7 | env: { 8 | "REPOSITORY": "https://hg.mozilla.org/", 9 | "REVISION": "0ecdc08f4f0a..." 10 | }, 11 | maxRunTime: 3600, 12 | cache: { // Cache folders to mount in container 13 | "obj-dir": "/home/worker/obj-dir", 14 | "hg-clone": "/home/worker/source" 15 | }, 16 | artifacts: { // Artifacts to copy out of container 17 | "binary.zip": "/home/worker/binary.zip" 18 | }, 19 | features: { // Worker plugins/features to activate 20 | livelog: true, 21 | interactive: true 22 | }, 23 | } 24 | ``` 25 | 26 | 27 | --- 28 | 29 | ### Local Reproducibility 30 | 31 | ```bash 32 | # Pull down the image 33 | docker pull taskcluster/builder:0.5.6 34 | 35 | # Run task command in container, with env vars and caches 36 | docker run \ 37 | -name task-container \ # container name 38 | -e REPOSITORY="https://hg.mozilla.org/" \ # env variable 39 | -e REVISION="0ecdc08f4f0a..." \ 40 | -v /mnt/obj-dir:/home/worker/obj-dir \ # cache 41 | -v /mnt/hg-clone:/home/worker/source \ 42 | taskcluster/builder:0.5.6 \ # image 43 | /usr/local/bin/build-script.sh # command 44 | 45 | # Copy artifacts from container 46 | docker cp task-container:/home/worker/binary.zip binary.zip 47 | 48 | # Clean up the container 49 | docker rm task-container; 50 | ``` 51 | -------------------------------------------------------------------------------- /src/presentations/TC-201/slides/docker.md: -------------------------------------------------------------------------------- 1 | ### docker (highlights only) 2 | 3 | Docker is a container technology (like LXC). 4 | 5 | Which gives you "virtual"/isolated: 6 | 7 |
    8 |
  • File-system (copy-on-write)
  • 9 |
  • Process tree
  • 10 |
  • Users
  • 11 |
  • Network
  • 12 |
  • Memory and CPU...
  • 13 |
14 | 15 | Under the same Linux instance. 16 |
17 | 18 | ----- 19 | 20 |
21 | Think light-weight virtual machine 22 |
23 | or, a very powerful chroot... 24 |
25 | -------------------------------------------------------------------------------- /src/presentations/TC-201/slides/end.md: -------------------------------------------------------------------------------- 1 | ### Conclusion 2 | 3 | * We execute your tasks 4 | * Questions? 5 | 6 |

7 |
8 | 9 | - docs.taskcluster.net
10 | - #taskcluster at irc.mozilla.org 11 |
12 | -------------------------------------------------------------------------------- /src/presentations/TC-201/slides/worker-types.md: -------------------------------------------------------------------------------- 1 | ### Multiple Worker Types 2 | 3 | All tasks have a 4 | $$ 5 | \left.\begin{align} 6 | &\text{provisionerId}\\\\ 7 | &\text{workerType} 8 | \end{align}\right\\}\text{Identifies a pool of workers} 9 | $$ 10 | 11 |
12 |
13 | Multiple **worker implementations**: 14 | 15 |
    16 |
  • docker-worker (node)
  • 17 |
  • generic-worker (go)
  • 18 |
  • buildbot-bridge (python)
  • 19 |
20 | 21 |
22 | 23 |
24 |
25 | More benefits:
26 |
    27 |
  • Gradual migration of tasks
  • 28 |
  • Isolation for security
  • 29 |
  • Separate build/test tasks
  • 30 |
31 |
32 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v1.1.0 4 | 5 | - Expand `beforeInit` event to allow halting of init event. 6 | - Create alternative init signature with single options object using new `options.selectors.slides` option. 7 | - Added methods `getTopLevelSlides` and `getNestedSlides`. 8 | - Integrated hash plugin into core. 9 | - Allow for touch swiping to be axis specific or disabled. 10 | - Include ARIA attribute considerations in core and extensions. 11 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/MIT-license.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2011-2014 Caleb Troughton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/Makefile: -------------------------------------------------------------------------------- 1 | SASSOPTS=--scss --style expanded 2 | 3 | default: generate 4 | 5 | generate: 6 | sass --update ${SASSOPTS} . 7 | 8 | force: 9 | sass --update ${SASSOPTS} --force . 10 | 11 | watch: 12 | sass --watch ${SASSOPTS} . 13 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/core/deck.core.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | height: 100%; 3 | padding: 0; 4 | margin: 0; 5 | } 6 | 7 | .deck-container { 8 | position: relative; 9 | min-height: 100%; 10 | margin: 0 auto; 11 | overflow: hidden; 12 | overflow-y: auto; 13 | } 14 | .js .deck-container { 15 | visibility: hidden; 16 | } 17 | .ready .deck-container { 18 | visibility: visible; 19 | } 20 | .touch .deck-container { 21 | -webkit-text-size-adjust: none; 22 | -moz-text-size-adjust: none; 23 | } 24 | 25 | .deck-loading { 26 | display: none; 27 | } 28 | 29 | .slide { 30 | width: auto; 31 | min-height: 100%; 32 | position: relative; 33 | } 34 | 35 | .deck-before, .deck-previous, .deck-next, .deck-after { 36 | position: absolute; 37 | left: -999em; 38 | top: -999em; 39 | } 40 | 41 | .deck-current { 42 | z-index: 2; 43 | } 44 | 45 | .slide .slide { 46 | visibility: hidden; 47 | position: static; 48 | min-height: 0; 49 | } 50 | 51 | .deck-child-current { 52 | position: static; 53 | z-index: 2; 54 | } 55 | .deck-child-current .slide { 56 | visibility: hidden; 57 | } 58 | .deck-child-current .deck-previous, .deck-child-current .deck-before, .deck-child-current .deck-current { 59 | visibility: visible; 60 | } 61 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/core/deck.core.scss: -------------------------------------------------------------------------------- 1 | html, body { 2 | height:100%; 3 | padding:0; 4 | margin:0; 5 | } 6 | 7 | .deck-container { 8 | position:relative; 9 | min-height:100%; 10 | margin:0 auto; 11 | overflow:hidden; 12 | overflow-y:auto; 13 | 14 | .js & { 15 | visibility:hidden; 16 | } 17 | 18 | .ready & { 19 | visibility:visible; 20 | } 21 | 22 | .touch & { 23 | -webkit-text-size-adjust:none; 24 | -moz-text-size-adjust:none; 25 | } 26 | } 27 | 28 | .deck-loading { 29 | display:none; 30 | } 31 | 32 | .slide { 33 | width:auto; 34 | min-height:100%; 35 | position:relative; 36 | } 37 | 38 | .deck-before, .deck-previous, .deck-next, .deck-after { 39 | position:absolute; 40 | left:-999em; 41 | top:-999em; 42 | } 43 | 44 | .deck-current { 45 | z-index:2; 46 | } 47 | 48 | .slide .slide { 49 | visibility:hidden; 50 | position:static; 51 | min-height:0; 52 | } 53 | 54 | .deck-child-current { 55 | position:static; 56 | z-index:2; 57 | 58 | .slide { 59 | visibility:hidden; 60 | } 61 | 62 | .deck-previous, .deck-before, .deck-current { 63 | visibility:visible; 64 | } 65 | } -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/core/print.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 18pt; 3 | } 4 | 5 | h1 { 6 | font-size: 48pt; 7 | } 8 | 9 | h2 { 10 | font-size: 36pt; 11 | } 12 | 13 | h3 { 14 | font-size: 28pt; 15 | } 16 | 17 | pre { 18 | border: 1px solid #000; 19 | padding: 10px; 20 | white-space: pre-wrap; 21 | } 22 | 23 | .deck-container > .slide { 24 | page-break-after: always; 25 | } 26 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/core/print.scss: -------------------------------------------------------------------------------- 1 | body { font-size:18pt; } 2 | h1 { font-size:48pt; } 3 | h2 { font-size:36pt; } 4 | h3 { font-size:28pt; } 5 | 6 | pre { 7 | border:1px solid #000; 8 | padding:10px; 9 | white-space:pre-wrap; 10 | } 11 | 12 | .deck-container > .slide { 13 | page-break-after: always; 14 | } 15 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/goto/deck.goto.css: -------------------------------------------------------------------------------- 1 | .goto-form { 2 | position: absolute; 3 | z-index: 3; 4 | bottom: 10px; 5 | left: 50%; 6 | height: 1.75em; 7 | margin: 0 0 0 -9.125em; 8 | line-height: 1.75em; 9 | padding: 0.625em; 10 | display: none; 11 | background: #ccc; 12 | overflow: hidden; 13 | border-radius: 10px; 14 | } 15 | .goto-form label { 16 | font-weight: bold; 17 | } 18 | .goto-form label, .goto-form input { 19 | display: inline-block; 20 | font-family: inherit; 21 | } 22 | .deck-goto .goto-form { 23 | display: block; 24 | } 25 | 26 | #goto-slide { 27 | width: 8.375em; 28 | margin: 0 0.625em; 29 | height: 1.4375em; 30 | } 31 | 32 | @media print { 33 | .goto-form, #goto-slide { 34 | display: none; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/goto/deck.goto.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | 7 |
-------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/goto/deck.goto.scss: -------------------------------------------------------------------------------- 1 | .goto-form { 2 | position:absolute; 3 | z-index:3; 4 | bottom:10px; 5 | left:50%; 6 | height:1.75em; 7 | margin:0 0 0 -9.125em; 8 | line-height:1.75em; 9 | padding:0.625em; 10 | display:none; 11 | background:#ccc; 12 | overflow:hidden; 13 | border-radius:10px; 14 | 15 | label { 16 | font-weight:bold; 17 | } 18 | 19 | label, input { 20 | display:inline-block; 21 | font-family:inherit; 22 | } 23 | 24 | .deck-goto & { 25 | display:block; 26 | } 27 | } 28 | 29 | #goto-slide { 30 | width:8.375em; 31 | margin:0 0.625em; 32 | height:1.4375em; 33 | } 34 | 35 | @media print { 36 | .goto-form, #goto-slide { 37 | display:none; 38 | } 39 | } -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/menu/deck.menu.css: -------------------------------------------------------------------------------- 1 | .deck-menu { 2 | overflow: auto; 3 | } 4 | .deck-menu .slide { 5 | background: #eee; 6 | position: relative; 7 | left: 0; 8 | top: 0; 9 | visibility: visible; 10 | cursor: pointer; 11 | } 12 | .no-csstransforms .deck-menu > .slide { 13 | float: left; 14 | width: 22%; 15 | height: 22%; 16 | min-height: 0; 17 | margin: 1%; 18 | font-size: 0.22em; 19 | overflow: hidden; 20 | padding: 0 0.5%; 21 | } 22 | .csstransforms .deck-menu > .slide { 23 | -webkit-transform: scale(0.22) !important; 24 | -ms-transform: scale(0.22) !important; 25 | transform: scale(0.22) !important; 26 | -webkit-transform-origin: 0 0; 27 | -ms-transform-origin: 0 0; 28 | transform-origin: 0 0; 29 | -moz-box-sizing: border-box; 30 | box-sizing: border-box; 31 | width: 100%; 32 | height: 100%; 33 | overflow: hidden; 34 | padding: 0 48px; 35 | margin: 12px; 36 | } 37 | .deck-menu iframe, .deck-menu img, .deck-menu video { 38 | max-width: 100%; 39 | } 40 | .deck-menu .deck-current, .no-touch .deck-menu .slide:hover { 41 | background: #ddf; 42 | } 43 | .deck-menu.deck-container:hover .deck-prev-link, .deck-menu.deck-container:hover .deck-next-link { 44 | display: none; 45 | } 46 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/menu/deck.menu.scss: -------------------------------------------------------------------------------- 1 | .deck-menu { 2 | overflow:auto; 3 | 4 | .slide { 5 | background:#eee; 6 | position:relative; 7 | left:0; 8 | top:0; 9 | visibility:visible; 10 | cursor:pointer; 11 | } 12 | 13 | > .slide { 14 | .no-csstransforms & { 15 | float:left; 16 | width:22%; 17 | height:22%; 18 | min-height:0; 19 | margin:1%; 20 | font-size:0.22em; 21 | overflow:hidden; 22 | padding:0 0.5%; 23 | } 24 | 25 | .csstransforms & { 26 | -webkit-transform:scale(.22) !important; 27 | -ms-transform:scale(.22) !important; 28 | transform:scale(.22) !important; 29 | -webkit-transform-origin:0 0; 30 | -ms-transform-origin:0 0; 31 | transform-origin:0 0; 32 | -moz-box-sizing: border-box; 33 | box-sizing: border-box; 34 | width:100%; 35 | height:100%; 36 | overflow:hidden; 37 | padding:0 48px; 38 | margin:12px; 39 | } 40 | } 41 | 42 | iframe, img, video { 43 | max-width:100%; 44 | } 45 | 46 | .deck-current, .no-touch & .slide:hover { 47 | background:#ddf; 48 | } 49 | 50 | &.deck-container:hover { 51 | .deck-prev-link, .deck-next-link { 52 | display:none; 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/navigation/deck.navigation.css: -------------------------------------------------------------------------------- 1 | .deck-prev-link, .deck-next-link { 2 | display: none; 3 | position: absolute; 4 | z-index: 3; 5 | top: 50%; 6 | width: 32px; 7 | height: 32px; 8 | margin-top: -16px; 9 | font-size: 20px; 10 | font-weight: bold; 11 | line-height: 32px; 12 | vertical-align: middle; 13 | text-align: center; 14 | text-decoration: none; 15 | color: #fff; 16 | background: #888; 17 | border-radius: 16px; 18 | } 19 | .deck-prev-link:hover, .deck-prev-link:focus, .deck-prev-link:active, .deck-prev-link:visited, .deck-next-link:hover, .deck-next-link:focus, .deck-next-link:active, .deck-next-link:visited { 20 | color: #fff; 21 | } 22 | 23 | .deck-prev-link { 24 | left: 8px; 25 | } 26 | 27 | .deck-next-link { 28 | right: 8px; 29 | } 30 | 31 | .deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link { 32 | display: block; 33 | } 34 | .deck-container:hover .deck-prev-link.deck-nav-disabled, .touch .deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link.deck-nav-disabled, .touch .deck-container:hover .deck-next-link { 35 | display: none; 36 | } 37 | 38 | @media print { 39 | .deck-prev-link, .deck-next-link { 40 | display: none !important; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/navigation/deck.navigation.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/navigation/deck.navigation.scss: -------------------------------------------------------------------------------- 1 | .deck-prev-link, .deck-next-link { 2 | display:none; 3 | position:absolute; 4 | z-index:3; 5 | top:50%; 6 | width:32px; 7 | height:32px; 8 | margin-top:-16px; 9 | font-size:20px; 10 | font-weight:bold; 11 | line-height:32px; 12 | vertical-align:middle; 13 | text-align:center; 14 | text-decoration:none; 15 | color:#fff; 16 | background:#888; 17 | border-radius:16px; 18 | 19 | &:hover, &:focus, &:active, &:visited { 20 | color:#fff; 21 | } 22 | } 23 | 24 | .deck-prev-link { 25 | left:8px; 26 | } 27 | 28 | .deck-next-link { 29 | right:8px; 30 | } 31 | 32 | .deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link { 33 | display:block; 34 | 35 | &.deck-nav-disabled, .touch & { 36 | display:none; 37 | } 38 | } 39 | 40 | @media print { 41 | .deck-prev-link, .deck-next-link { 42 | display:none !important; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/scale/deck.scale.css: -------------------------------------------------------------------------------- 1 | .csstransforms .deck-container.deck-scale:not(.deck-menu) { 2 | overflow: hidden; 3 | } 4 | .csstransforms .deck-container.deck-scale:not(.deck-menu) > .slide { 5 | -moz-box-sizing: padding-box; 6 | box-sizing: padding-box; 7 | width: 100%; 8 | padding-bottom: 20px; 9 | } 10 | .csstransforms .deck-container.deck-scale:not(.deck-menu) > .slide > .deck-slide-scaler { 11 | -webkit-transform-origin: 50% 0; 12 | -ms-transform-origin: 50% 0; 13 | transform-origin: 50% 0; 14 | } 15 | 16 | .csstransforms .deck-container.deck-menu .deck-slide-scaler { 17 | -webkit-transform: none !important; 18 | -ms-transform: none !important; 19 | transform: none !important; 20 | } 21 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/scale/deck.scale.scss: -------------------------------------------------------------------------------- 1 | .csstransforms .deck-container.deck-scale:not(.deck-menu) { 2 | overflow:hidden; 3 | 4 | > .slide { 5 | -moz-box-sizing: padding-box; 6 | box-sizing: padding-box; 7 | width:100%; 8 | padding-bottom:20px; 9 | 10 | > .deck-slide-scaler { 11 | -webkit-transform-origin: 50% 0; 12 | -ms-transform-origin: 50% 0; 13 | transform-origin: 50% 0; 14 | } 15 | } 16 | } 17 | 18 | .csstransforms .deck-container.deck-menu .deck-slide-scaler { 19 | -webkit-transform:none !important; 20 | -ms-transform:none !important; 21 | transform:none !important; 22 | } -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/status/deck.status.css: -------------------------------------------------------------------------------- 1 | .deck-status { 2 | position: absolute; 3 | bottom: 10px; 4 | right: 5px; 5 | color: #888; 6 | z-index: 3; 7 | margin: 0; 8 | } 9 | 10 | body > .deck-container .deck-status { 11 | position: fixed; 12 | } 13 | 14 | @media print { 15 | .deck-status { 16 | display: none; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/status/deck.status.html: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | / 5 | 6 |

7 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/extensions/status/deck.status.scss: -------------------------------------------------------------------------------- 1 | .deck-status { 2 | position:absolute; 3 | bottom:10px; 4 | right:5px; 5 | color:#888; 6 | z-index:3; 7 | margin:0; 8 | } 9 | 10 | body > .deck-container .deck-status { 11 | position:fixed; 12 | } 13 | 14 | @media print { 15 | .deck-status { 16 | display:none; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/test/fixtures/empty.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Previous 4 | Next 5 |
6 | 7 |

8 | 9 | / 10 | 11 |

12 | 13 |
14 | 15 | 16 | 17 |
18 | 19 | # 20 | Internal Test Link 21 |
22 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/test/fixtures/nesteds.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 | 8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 | 22 |
23 |
24 | 25 |

26 | 27 | / 28 | 29 |

30 | 31 |
32 | 33 | 34 | 35 |
36 |
37 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/test/fixtures/standard.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 | 8 |
9 | 10 |
11 | 12 |
13 | Previous 14 | Next 15 |
16 | 17 |

18 | 19 | / 20 | 21 |

22 | 23 |
24 | 25 | 26 | 27 | 28 |
29 | 30 | # 31 | Internal Test Link 32 |
33 | 34 |
35 |
36 | 37 |
38 | 39 |
40 | 41 |
42 | 43 |
44 |
45 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/test/index.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | deck.js - Jasmine Test Runner 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/test/settings.js: -------------------------------------------------------------------------------- 1 | // SETTINGS, VARS, UTILITY FUNCTIONS 2 | jasmine.getFixtures().fixturesPath = 'fixtures'; 3 | var defaults = $.deck.defaults; 4 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/themes/transition/fade.css: -------------------------------------------------------------------------------- 1 | .csstransitions.csstransforms .deck-container .slide { 2 | -webkit-transition: opacity 500ms ease-in-out 0ms; 3 | transition: opacity 500ms ease-in-out 0ms; 4 | } 5 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide { 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | } 10 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .slide { 11 | position: relative; 12 | left: 0; 13 | top: 0; 14 | } 15 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-after { 16 | opacity: 0; 17 | } 18 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-current { 19 | opacity: 1; 20 | } 21 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-after { 22 | opacity: 0; 23 | pointer-events: none; 24 | } 25 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before .slide, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous .slide { 26 | visibility: visible; 27 | } 28 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current { 29 | opacity: 1; 30 | visibility: visible; 31 | pointer-events: auto; 32 | } 33 | .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current .deck-after { 34 | visibility: hidden; 35 | } 36 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/themes/transition/fade.scss: -------------------------------------------------------------------------------- 1 | @mixin translate($x: 0, $y: 0, $z: 0) { 2 | -webkit-transform:translate3d($x, $y, $z); 3 | -ms-transform:translate($x, $y); 4 | transform:translate3d($x, $y, $z); 5 | } 6 | 7 | @mixin transition($prop, $duration, $easing: ease-in-out, $delay: 0ms) { 8 | -webkit-transition:$prop $duration $easing $delay; 9 | transition:$prop $duration $easing $delay; 10 | } 11 | 12 | .csstransitions.csstransforms { 13 | .deck-container .slide { 14 | @include transition(opacity, 500ms); 15 | } 16 | 17 | .deck-container:not(.deck-menu) { 18 | > .slide { 19 | position:absolute; 20 | top:0; 21 | left:0; 22 | 23 | .slide { 24 | position:relative; 25 | left:0; 26 | top:0; 27 | } 28 | 29 | .deck-next, .deck-after { 30 | opacity:0; 31 | } 32 | 33 | .deck-current { 34 | opacity:1; 35 | } 36 | } 37 | 38 | > .deck-previous, > .deck-before, > .deck-next, > .deck-after { 39 | opacity:0; 40 | pointer-events:none; 41 | } 42 | 43 | > .deck-before, > .deck-previous { 44 | .slide { 45 | visibility:visible; 46 | } 47 | } 48 | 49 | > .deck-child-current { 50 | opacity:1; 51 | visibility:visible; 52 | pointer-events:auto; 53 | 54 | .deck-next, .deck-after { 55 | visibility:hidden; 56 | } 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/themes/transition/horizontal-slide.scss: -------------------------------------------------------------------------------- 1 | @mixin translate($x: 0, $y: 0, $z: 0) { 2 | -webkit-transform:translate3d($x, $y, $z); 3 | -ms-transform:translate($x, $y); 4 | transform:translate3d($x, $y, $z); 5 | } 6 | 7 | @mixin transition($prop, $duration, $easing: ease-in-out, $delay: 0ms) { 8 | -webkit-transition:$prop $duration $easing $delay; 9 | transition:$prop $duration $easing $delay; 10 | } 11 | 12 | @mixin transform($val) { 13 | -webkit-transform:$val; 14 | -ms-transform:$val; 15 | transform:$val; 16 | } 17 | 18 | .csstransitions.csstransforms { 19 | overflow-x:hidden; 20 | 21 | .deck-container > .slide { 22 | -webkit-transition:-webkit-transform 500ms ease-in-out; 23 | transition:transform 500ms ease-in-out; 24 | } 25 | 26 | .deck-container:not(.deck-menu) { 27 | > .slide { 28 | position:absolute; 29 | top:0; 30 | left:0; 31 | 32 | .slide { 33 | position:relative; 34 | left:0; 35 | top:0; 36 | -webkit-transition:-webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out; 37 | transition:transform 500ms ease-in-out, opacity 500ms ease-in-out; 38 | } 39 | 40 | .deck-next, .deck-after { 41 | visibility:visible; 42 | @include translate(200%); 43 | } 44 | } 45 | 46 | > .deck-previous { 47 | @include translate(-200%); 48 | } 49 | 50 | > .deck-before { 51 | @include translate(-400%); 52 | } 53 | 54 | > .deck-next { 55 | @include translate(200%); 56 | } 57 | 58 | > .deck-after { 59 | @include translate(400%); 60 | } 61 | 62 | > .deck-before, > .deck-previous { 63 | .slide { 64 | visibility:visible; 65 | } 66 | } 67 | 68 | > .deck-child-current { 69 | @include transform(none); 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /src/presentations/in-tree-taskgraphs/try-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/in-tree-taskgraphs/try-D.png -------------------------------------------------------------------------------- /src/presentations/intro-talk/median-pending-time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/intro-talk/median-pending-time.png -------------------------------------------------------------------------------- /src/presentations/intro-talk/slides/docker-worker.md: -------------------------------------------------------------------------------- 1 | ### Payload for docker-worker 2 | 3 | ```js 4 | task.payload = { 5 | image: "taskcluster/builder:0.5.6", 6 | command: ["/usr/local/bin/build-script.sh"], 7 | env: { 8 | "REPOSITORY": "https://hg.mozilla.org/", 9 | "REVISION": "0ecdc08f4f0a..." 10 | }, 11 | maxRunTime: 3600, 12 | cache: { // Cache folders to mount in container 13 | "obj-dir": "/home/worker/obj-dir", 14 | "hg-clone": "/home/worker/source" 15 | }, 16 | artifacts: { // Artifacts to copy out of container 17 | "binary.zip": "/home/worker/binary.zip" 18 | }, 19 | features: { // Worker plugins/features to activate 20 | livelog: true, 21 | interactive: true 22 | }, 23 | } 24 | ``` 25 | 26 | 27 | --- 28 | 29 | ### Local Reproducibility 30 | 31 | ```bash 32 | # Pull down the image 33 | docker pull taskcluster/builder:0.5.6 34 | 35 | # Run task command in container, with env vars and caches 36 | docker run \ 37 | -name task-container \ # container name 38 | -e REPOSITORY="https://hg.mozilla.org/" \ # env variable 39 | -e REVISION="0ecdc08f4f0a..." \ 40 | -v /mnt/obj-dir:/home/worker/obj-dir \ # cache 41 | -v /mnt/hg-clone:/home/worker/source \ 42 | taskcluster/builder:0.5.6 \ # image 43 | /usr/local/bin/build-script.sh # command 44 | 45 | # Copy artifacts from container 46 | docker cp task-container:/home/worker/binary.zip binary.zip 47 | 48 | # Clean up the container 49 | docker rm task-container; 50 | ``` 51 | -------------------------------------------------------------------------------- /src/presentations/intro-talk/slides/docker.md: -------------------------------------------------------------------------------- 1 | ### docker (highlights only) 2 | 3 | Docker is a container technology (like LXC). 4 | 5 | Which gives you "virtual"/isolated: 6 | 7 |
    8 |
  • File-system (copy-on-write)
  • 9 |
  • Process tree
  • 10 |
  • Users
  • 11 |
  • Network
  • 12 |
  • Memory and CPU...
  • 13 |
14 | 15 | Under the same Linux instance. 16 |
17 | 18 | ----- 19 | 20 |
21 | Think light-weight virtual machine 22 |
23 | or, a very powerful chroot... 24 |
25 | 26 | --- 27 | 28 | ### Example `Dockerfile` 29 | 30 | ```bash 31 | FROM centos:centos6 32 | MAINTAINER Jonas Finnemann Jensen 33 | 34 | RUN yum group install "Development Tools" 35 | 36 | # Copy in install script and run it 37 | ADD system-setup.sh /tmp/system-setup.sh 38 | RUN /tmp/system-setup.sh 39 | 40 | ENV HOME /home/worker 41 | ENV SHELL /bin/bash 42 | ENV USER worker 43 | ``` 44 | 45 | * Image contains all system libraries 46 | * Images are layered 47 | -------------------------------------------------------------------------------- /src/presentations/intro-talk/slides/stats.md: -------------------------------------------------------------------------------- 1 | ### Taskcluster in Numbers 2 | 3 | _Task pending time last 3 days for `b2gtest` (a common workerType)._ 4 | 5 |
6 | 7 |
8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 26 | 27 | 28 | 29 | 32 | 33 | 34 |
12 | Max Pending Time 13 | 11 minutes
18 | Avg. Pending Time 19 | ~23s
24 | Number of Tasks 25 | 65,683
30 | Execution Time 31 | 1.68 Years
35 | -------------------------------------------------------------------------------- /src/presentations/intro-talk/slides/worker-types.md: -------------------------------------------------------------------------------- 1 | ### Multiple Worker Types 2 | 3 | All tasks have a 4 | $$ 5 | \left.\begin{align} 6 | &\text{provisionerId}\\\\ 7 | &\text{workerType} 8 | \end{align}\right\\}\text{Identifies a pool of workers} 9 | $$ 10 | 11 |
12 |
13 | Multiple **worker implementations**: 14 | 15 |
    16 |
  • docker-worker (node)
  • 17 |
  • generic-worker (go)
  • 18 |
  • buildbot-bridge (python)
  • 19 |
20 | 21 |
22 | 23 |
24 |
25 | More benefits:
26 |
    27 |
  • Gradual migration of tasks
  • 28 |
  • Isolation for security
  • 29 |
  • Separate build/test tasks
  • 30 |
31 |
32 | -------------------------------------------------------------------------------- /src/presentations/reveal/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .svn 3 | log/*.log 4 | tmp/** 5 | node_modules/ 6 | .sass-cache 7 | css/reveal.min.css 8 | js/reveal.min.js 9 | -------------------------------------------------------------------------------- /src/presentations/reveal/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.10 4 | before_script: 5 | - npm install -g grunt-cli -------------------------------------------------------------------------------- /src/presentations/reveal/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. 4 | 5 | 6 | ### Personal Support 7 | If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). 8 | 9 | 10 | ### Bug Reports 11 | When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. 12 | 13 | 14 | ### Pull Requests 15 | - Should follow the coding style of the file you work in, most importantly: 16 | - Tabs to indent 17 | - Single-quoted strings 18 | - Should be made towards the **dev branch** 19 | - Should be submitted from a feature/topic branch (not your master) 20 | -------------------------------------------------------------------------------- /src/presentations/reveal/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2015 Hakim El Hattab, http://hakim.se 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/README.md: -------------------------------------------------------------------------------- 1 | ## Dependencies 2 | 3 | Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup 4 | 5 | You also need to install Ruby and then Sass (with `gem install sass`). 6 | 7 | ## Creating a Theme 8 | 9 | To create your own theme, start by duplicating any ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source) and adding it to the compilation list in the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js). 10 | 11 | Each theme file does four things in the following order: 12 | 13 | 1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** 14 | Shared utility functions. 15 | 16 | 2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** 17 | Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. 18 | 19 | 3. **Override** 20 | This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding full selectors with hardcoded styles. 21 | 22 | 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** 23 | The template theme file which will generate final CSS output based on the currently defined variables. 24 | 25 | When you are done, run `grunt themes` to compile the Sass file to CSS and you are ready to use your new theme. 26 | -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/beige.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Beige theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | 15 | // Include theme-specific fonts 16 | @import url(../../lib/font/league-gothic/league-gothic.css); 17 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 18 | 19 | 20 | // Override theme settings (see ../template/settings.scss) 21 | $mainColor: #333; 22 | $headingColor: #333; 23 | $headingTextShadow: none; 24 | $backgroundColor: #f7f3de; 25 | $linkColor: #8b743d; 26 | $linkColorHover: lighten( $linkColor, 20% ); 27 | $selectionBackgroundColor: rgba(79, 64, 28, 0.99); 28 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 29 | 30 | // Background generator 31 | @mixin bodyBackground() { 32 | @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); 33 | } 34 | 35 | 36 | 37 | // Theme template ------------------------------ 38 | @import "../template/theme"; 39 | // --------------------------------------------- -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/black.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. This is the opposite of the 'white' theme. 3 | * 4 | * Copyright (C) 2015 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css); 16 | 17 | 18 | // Override theme settings (see ../template/settings.scss) 19 | $backgroundColor: #222; 20 | 21 | $mainColor: #fff; 22 | $headingColor: #fff; 23 | 24 | $mainFontSize: 38px; 25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif; 26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif; 27 | $headingTextShadow: none; 28 | $headingLetterSpacing: normal; 29 | $headingTextTransform: uppercase; 30 | $headingFontWeight: 600; 31 | $linkColor: #42affa; 32 | $linkColorHover: lighten( $linkColor, 15% ); 33 | $selectionBackgroundColor: lighten( $linkColor, 25% ); 34 | 35 | $heading1Size: 2.5em; 36 | $heading2Size: 1.6em; 37 | $heading3Size: 1.3em; 38 | $heading4Size: 1.0em; 39 | 40 | section.has-light-background { 41 | &, h1, h2, h3, h4, h5, h6 { 42 | color: #222; 43 | } 44 | } 45 | 46 | 47 | // Theme template ------------------------------ 48 | @import "../template/theme"; 49 | // --------------------------------------------- -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/league.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * League theme for reveal.js. 3 | * 4 | * This was the default theme pre-3.0.0. 5 | * 6 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | 9 | 10 | // Default mixins and settings ----------------- 11 | @import "../template/mixins"; 12 | @import "../template/settings"; 13 | // --------------------------------------------- 14 | 15 | 16 | 17 | // Include theme-specific fonts 18 | @import url(../../lib/font/league-gothic/league-gothic.css); 19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 20 | 21 | // Override theme settings (see ../template/settings.scss) 22 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); 23 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 24 | 25 | // Background generator 26 | @mixin bodyBackground() { 27 | @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); 28 | } 29 | 30 | 31 | 32 | // Theme template ------------------------------ 33 | @import "../template/theme"; 34 | // --------------------------------------------- -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/moon.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Solarized Dark theme for reveal.js. 3 | * Author: Achim Staebler 4 | */ 5 | 6 | 7 | // Default mixins and settings ----------------- 8 | @import "../template/mixins"; 9 | @import "../template/settings"; 10 | // --------------------------------------------- 11 | 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/league-gothic/league-gothic.css); 16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 17 | 18 | /** 19 | * Solarized colors by Ethan Schoonover 20 | */ 21 | html * { 22 | color-profile: sRGB; 23 | rendering-intent: auto; 24 | } 25 | 26 | // Solarized colors 27 | $base03: #002b36; 28 | $base02: #073642; 29 | $base01: #586e75; 30 | $base00: #657b83; 31 | $base0: #839496; 32 | $base1: #93a1a1; 33 | $base2: #eee8d5; 34 | $base3: #fdf6e3; 35 | $yellow: #b58900; 36 | $orange: #cb4b16; 37 | $red: #dc322f; 38 | $magenta: #d33682; 39 | $violet: #6c71c4; 40 | $blue: #268bd2; 41 | $cyan: #2aa198; 42 | $green: #859900; 43 | 44 | // Override theme settings (see ../template/settings.scss) 45 | $mainColor: $base1; 46 | $headingColor: $base2; 47 | $headingTextShadow: none; 48 | $backgroundColor: $base03; 49 | $linkColor: $blue; 50 | $linkColorHover: lighten( $linkColor, 20% ); 51 | $selectionBackgroundColor: $magenta; 52 | 53 | 54 | 55 | // Theme template ------------------------------ 56 | @import "../template/theme"; 57 | // --------------------------------------------- 58 | -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/night.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700); 16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); 17 | 18 | 19 | // Override theme settings (see ../template/settings.scss) 20 | $backgroundColor: #111; 21 | 22 | $mainFont: 'Open Sans', sans-serif; 23 | $linkColor: #e7ad52; 24 | $linkColorHover: lighten( $linkColor, 20% ); 25 | $headingFont: 'Montserrat', Impact, sans-serif; 26 | $headingTextShadow: none; 27 | $headingLetterSpacing: -0.03em; 28 | $headingTextTransform: none; 29 | $selectionBackgroundColor: #e7ad52; 30 | $mainFontSize: 30px; 31 | 32 | 33 | // Theme template ------------------------------ 34 | @import "../template/theme"; 35 | // --------------------------------------------- -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/serif.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple theme for reveal.js presentations, similar 3 | * to the default theme. The accent color is brown. 4 | * 5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. 6 | */ 7 | 8 | 9 | // Default mixins and settings ----------------- 10 | @import "../template/mixins"; 11 | @import "../template/settings"; 12 | // --------------------------------------------- 13 | 14 | 15 | 16 | // Override theme settings (see ../template/settings.scss) 17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; 18 | $mainColor: #000; 19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; 20 | $headingColor: #383D3D; 21 | $headingTextShadow: none; 22 | $headingTextTransform: none; 23 | $backgroundColor: #F0F1EB; 24 | $linkColor: #51483D; 25 | $linkColorHover: lighten( $linkColor, 20% ); 26 | $selectionBackgroundColor: #26351C; 27 | 28 | .reveal a { 29 | line-height: 1.3em; 30 | } 31 | 32 | 33 | // Theme template ------------------------------ 34 | @import "../template/theme"; 35 | // --------------------------------------------- 36 | -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/simple.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple theme for reveal.js presentations, similar 3 | * to the default theme. The accent color is darkblue. 4 | * 5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. 6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | 9 | 10 | // Default mixins and settings ----------------- 11 | @import "../template/mixins"; 12 | @import "../template/settings"; 13 | // --------------------------------------------- 14 | 15 | 16 | 17 | // Include theme-specific fonts 18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); 19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 20 | 21 | 22 | // Override theme settings (see ../template/settings.scss) 23 | $mainFont: 'Lato', sans-serif; 24 | $mainColor: #000; 25 | $headingFont: 'News Cycle', Impact, sans-serif; 26 | $headingColor: #000; 27 | $headingTextShadow: none; 28 | $headingTextTransform: none; 29 | $backgroundColor: #fff; 30 | $linkColor: #00008B; 31 | $linkColorHover: lighten( $linkColor, 20% ); 32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99); 33 | 34 | 35 | 36 | // Theme template ------------------------------ 37 | @import "../template/theme"; 38 | // --------------------------------------------- -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/sky.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Sky theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | 15 | // Include theme-specific fonts 16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); 17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); 18 | 19 | 20 | // Override theme settings (see ../template/settings.scss) 21 | $mainFont: 'Open Sans', sans-serif; 22 | $mainColor: #333; 23 | $headingFont: 'Quicksand', sans-serif; 24 | $headingColor: #333; 25 | $headingLetterSpacing: -0.08em; 26 | $headingTextShadow: none; 27 | $backgroundColor: #f7fbfc; 28 | $linkColor: #3b759e; 29 | $linkColorHover: lighten( $linkColor, 20% ); 30 | $selectionBackgroundColor: #134674; 31 | 32 | // Fix links so they are not cut off 33 | .reveal a { 34 | line-height: 1.3em; 35 | } 36 | 37 | // Background generator 38 | @mixin bodyBackground() { 39 | @include radial-gradient( #add9e4, #f7fbfc ); 40 | } 41 | 42 | 43 | 44 | // Theme template ------------------------------ 45 | @import "../template/theme"; 46 | // --------------------------------------------- 47 | -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/solarized.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Solarized Light theme for reveal.js. 3 | * Author: Achim Staebler 4 | */ 5 | 6 | 7 | // Default mixins and settings ----------------- 8 | @import "../template/mixins"; 9 | @import "../template/settings"; 10 | // --------------------------------------------- 11 | 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/league-gothic/league-gothic.css); 16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 17 | 18 | 19 | /** 20 | * Solarized colors by Ethan Schoonover 21 | */ 22 | html * { 23 | color-profile: sRGB; 24 | rendering-intent: auto; 25 | } 26 | 27 | // Solarized colors 28 | $base03: #002b36; 29 | $base02: #073642; 30 | $base01: #586e75; 31 | $base00: #657b83; 32 | $base0: #839496; 33 | $base1: #93a1a1; 34 | $base2: #eee8d5; 35 | $base3: #fdf6e3; 36 | $yellow: #b58900; 37 | $orange: #cb4b16; 38 | $red: #dc322f; 39 | $magenta: #d33682; 40 | $violet: #6c71c4; 41 | $blue: #268bd2; 42 | $cyan: #2aa198; 43 | $green: #859900; 44 | 45 | // Override theme settings (see ../template/settings.scss) 46 | $mainColor: $base00; 47 | $headingColor: $base01; 48 | $headingTextShadow: none; 49 | $backgroundColor: $base3; 50 | $linkColor: $blue; 51 | $linkColorHover: lighten( $linkColor, 20% ); 52 | $selectionBackgroundColor: $magenta; 53 | 54 | // Background generator 55 | // @mixin bodyBackground() { 56 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); 57 | // } 58 | 59 | 60 | 61 | // Theme template ------------------------------ 62 | @import "../template/theme"; 63 | // --------------------------------------------- 64 | -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/source/white.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * White theme for reveal.js. This is the opposite of the 'black' theme. 3 | * 4 | * Copyright (C) 2015 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css); 16 | 17 | 18 | // Override theme settings (see ../template/settings.scss) 19 | $backgroundColor: #fff; 20 | 21 | $mainColor: #222; 22 | $headingColor: #222; 23 | 24 | $mainFontSize: 38px; 25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif; 26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif; 27 | $headingTextShadow: none; 28 | $headingLetterSpacing: normal; 29 | $headingTextTransform: uppercase; 30 | $headingFontWeight: 600; 31 | $linkColor: #2a76dd; 32 | $linkColorHover: lighten( $linkColor, 15% ); 33 | $selectionBackgroundColor: lighten( $linkColor, 25% ); 34 | 35 | $heading1Size: 2.5em; 36 | $heading2Size: 1.6em; 37 | $heading3Size: 1.3em; 38 | $heading4Size: 1.0em; 39 | 40 | section.has-dark-background { 41 | &, h1, h2, h3, h4, h5, h6 { 42 | color: #fff; 43 | } 44 | } 45 | 46 | 47 | // Theme template ------------------------------ 48 | @import "../template/theme"; 49 | // --------------------------------------------- -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/template/mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin vertical-gradient( $top, $bottom ) { 2 | background: $top; 3 | background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); 4 | background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); 5 | background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); 6 | background: -o-linear-gradient( top, $top 0%, $bottom 100% ); 7 | background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); 8 | background: linear-gradient( top, $top 0%, $bottom 100% ); 9 | } 10 | 11 | @mixin horizontal-gradient( $top, $bottom ) { 12 | background: $top; 13 | background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); 14 | background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); 15 | background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); 16 | background: -o-linear-gradient( left, $top 0%, $bottom 100% ); 17 | background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); 18 | background: linear-gradient( left, $top 0%, $bottom 100% ); 19 | } 20 | 21 | @mixin radial-gradient( $outer, $inner, $type: circle ) { 22 | background: $outer; 23 | background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 24 | background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); 25 | background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 26 | background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 27 | background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 28 | background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 29 | } -------------------------------------------------------------------------------- /src/presentations/reveal/css/theme/template/settings.scss: -------------------------------------------------------------------------------- 1 | // Base settings for all themes that can optionally be 2 | // overridden by the super-theme 3 | 4 | // Background of the presentation 5 | $backgroundColor: #2b2b2b; 6 | 7 | // Primary/body text 8 | $mainFont: 'Lato', sans-serif; 9 | $mainFontSize: 36px; 10 | $mainColor: #eee; 11 | 12 | // Vertical spacing between blocks of text 13 | $blockMargin: 20px; 14 | 15 | // Headings 16 | $headingMargin: 0 0 $blockMargin 0; 17 | $headingFont: 'League Gothic', Impact, sans-serif; 18 | $headingColor: #eee; 19 | $headingLineHeight: 1.2; 20 | $headingLetterSpacing: normal; 21 | $headingTextTransform: uppercase; 22 | $headingTextShadow: none; 23 | $headingFontWeight: normal; 24 | $heading1TextShadow: $headingTextShadow; 25 | 26 | $heading1Size: 3.77em; 27 | $heading2Size: 2.11em; 28 | $heading3Size: 1.55em; 29 | $heading4Size: 1.00em; 30 | 31 | // Links and actions 32 | $linkColor: #13DAEC; 33 | $linkColorHover: lighten( $linkColor, 20% ); 34 | 35 | // Text selection 36 | $selectionBackgroundColor: #FF5E99; 37 | $selectionColor: #fff; 38 | 39 | // Generates the presentation background, can be overridden 40 | // to return a background image or gradient 41 | @mixin bodyBackground() { 42 | background: $backgroundColor; 43 | } -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('league-gothic.eot'); 4 | src: url('league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('league-gothic.woff') format('woff'), 6 | url('league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /src/presentations/reveal/lib/font/source-sans-pro/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | src: url('source-sans-pro-regular.eot'); 4 | src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), 5 | url('source-sans-pro-regular.woff') format('woff'), 6 | url('source-sans-pro-regular.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Source Sans Pro'; 13 | src: url('source-sans-pro-italic.eot'); 14 | src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), 15 | url('source-sans-pro-italic.woff') format('woff'), 16 | url('source-sans-pro-italic.ttf') format('truetype'); 17 | font-weight: normal; 18 | font-style: italic; 19 | } 20 | 21 | @font-face { 22 | font-family: 'Source Sans Pro'; 23 | src: url('source-sans-pro-semibold.eot'); 24 | src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), 25 | url('source-sans-pro-semibold.woff') format('woff'), 26 | url('source-sans-pro-semibold.ttf') format('truetype'); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: 'Source Sans Pro'; 33 | src: url('source-sans-pro-semibolditalic.eot'); 34 | src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), 35 | url('source-sans-pro-semibolditalic.woff') format('woff'), 36 | url('source-sans-pro-semibolditalic.ttf') format('truetype'); 37 | font-weight: 600; 38 | font-style: italic; 39 | } -------------------------------------------------------------------------------- /src/presentations/reveal/lib/js/classList.js: -------------------------------------------------------------------------------- 1 | /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ 2 | if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p 2 | 3 | 4 | 5 | 6 | 7 | reveal.js - Barebones 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 |
17 | 18 |
19 |

Barebones Presentation

20 |

This example contains the bare minimum includes and markup required to run a reveal.js presentation.

21 |
22 | 23 |
24 |

No Theme

25 |

There's no theme included, so it will fall back on browser defaults.

26 |
27 | 28 |
29 | 30 |
31 | 32 | 33 | 34 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/presentations/reveal/test/examples/embedded-media.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | reveal.js - Embedded Media 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 |
22 |

Embedded Media Test

23 |
24 | 25 |
26 | 27 |
28 | 29 |
30 |

Empty Slide

31 |
32 | 33 |
34 | 35 |
36 | 37 | 38 | 39 | 40 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/presentations/reveal/test/test-markdown.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | reveal.js - Test Markdown 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 | 18 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/presentations/reveal/test/test-markdown.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | Reveal.addEventListener( 'ready', function() { 4 | 5 | QUnit.module( 'Markdown' ); 6 | 7 | test( 'Vertical separator', function() { 8 | strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); 9 | }); 10 | 11 | 12 | } ); 13 | 14 | Reveal.initialize(); 15 | -------------------------------------------------------------------------------- /src/presentations/reveal/test/test-pdf.js: -------------------------------------------------------------------------------- 1 | 2 | Reveal.addEventListener( 'ready', function() { 3 | 4 | // Only one test for now, we're mainly ensuring that there 5 | // are no execution errors when running PDF mode 6 | 7 | test( 'Reveal.isReady', function() { 8 | strictEqual( Reveal.isReady(), true, 'returns true' ); 9 | }); 10 | 11 | 12 | } ); 13 | 14 | Reveal.initialize({ pdf: true }); 15 | -------------------------------------------------------------------------------- /src/presentations/scopes/createTask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/scopes/createTask.png -------------------------------------------------------------------------------- /src/presentations/taskcluster-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/taskcluster-120.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/decision_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/decision_task.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/dependent_tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/dependent_tasks.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/image_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/image_task.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/inspect-task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/inspect-task.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/novnc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/novnc.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/shell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/shell.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/images/task-inspector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/taskcluster/taskcluster-docs/7727437057178bba0772c609aeea09ab195fe2c6/src/presentations/try-with-taskcluster/images/task-inspector.png -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/display.md: -------------------------------------------------------------------------------- 1 | ### VNC Sessions 2 | 3 |
4 |
5 |
6 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/end.md: -------------------------------------------------------------------------------- 1 | ### Conclusion 2 | 3 | * Interaction sessions on-demand 4 | * Change test images on-push: 5 | * https://dxr.mozilla.org/mozilla-central/rev/tip/testing/docker/README.md 6 | * Questions? (ask us afterwards) 7 | * This is still rolling out (experimental)... 8 | 9 |

10 |
11 | 12 | - docs.taskcluster.net
13 | - #taskcluster at irc.mozilla.org 14 |
15 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/example_build.md: -------------------------------------------------------------------------------- 1 | ### Example on-push build 2 | 3 | ```bash 4 | /b2g-inbound$ hg commit -m \ 5 | "Testing - add file try: -b do -p linux64_gecko -u none" 6 | /b2g-inbound$ hg push -f -r . try 7 | ….added 1 changesets... 8 | ``` 9 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/further_reading_task_images.md: -------------------------------------------------------------------------------- 1 | ### Further Reading 2 | 3 | https://dxr.mozilla.org/mozilla-central/rev/tip/testing/docker/README.md 4 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/image_dockerfile_after.md: -------------------------------------------------------------------------------- 1 | ### Example Dockerfile 2 | 3 | Location: testing/docker/builder/Dockerfile 4 | 5 | ``` 6 | FROM quay.io/mozilla/b2g-build:0.2.9 7 | MAINTAINER Dustin J. Mitchell 8 | 9 | ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH 10 | ENV TOOLTOOL_CACHE /home/worker/tools/tooltool-cache 11 | 12 | ADD https://raw.githubusercontent.com/taskcluster/buildbot-step/58a16f7370a8b4de7a4458436a4a5fad9905f5d9/buildbot_step.js /home/worker/bin/buildbot_step 13 | 14 | # Let's install wget 15 | RUN apt-get update && apt-get install -y wget 16 | 17 | ... 18 | ``` 19 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/image_dockerfile_before.md: -------------------------------------------------------------------------------- 1 | ### Example DockerFile 2 | 3 | Location: testing/docker/builder/Dockerfile 4 | 5 | ``` 6 | FROM quay.io/mozilla/b2g-build:0.2.9 7 | MAINTAINER Dustin J. Mitchell 8 | 9 | ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH 10 | ENV TOOLTOOL_CACHE /home/worker/tools/tooltool-cache 11 | 12 | ADD https://raw.githubusercontent.com/taskcluster/buildbot-step/58a16f7370a8b4de7a4458436a4a5fad9905f5d9/buildbot_step.js /home/worker/bin/buildbot_step 13 | 14 | ... 15 | ``` 16 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/image_workflow.md: -------------------------------------------------------------------------------- 1 | ### In-tree Image Workflow 2 | 3 | On-push image building: 4 | 5 | * Edit image context 6 | * Commit changes and push to vcs 7 | * Decision task triggers image building task 8 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/interactive.md: -------------------------------------------------------------------------------- 1 | ### Interactive Tasks 2 | _(`try: --interactive` is still experimental)_ 3 | 4 | ```bash 5 | try: -b d -p all -u all --interactive 6 | ``` 7 |
8 |
9 |
10 |
11 | 12 | (Let's attempt a live demo) -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/shell.md: -------------------------------------------------------------------------------- 1 | ### Terminal Sessions 2 | 3 |
4 |
5 |
6 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/task_images.md: -------------------------------------------------------------------------------- 1 | ### Docker Task Definition 2 | 3 | * `docker` image (contains binaries, libc, vim, gcc, ...) 4 | * Command 5 | * Env, artifacts, caches, ... 6 | 7 | ```js 8 | task: { // Image from docker hub 9 | payload: { 10 | image: "garndt/custom-ubuntu:latest" 11 | ... 12 | } 13 | } 14 | 15 | task: { // Image as artifact (from another task) 16 | payload: { 17 | image: { 18 | type: 'task-image', 19 | taskId: ‘ABC123' 20 | path: ‘public/image.tar' 21 | }, 22 | ... 23 | } 24 | } 25 | ``` 26 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/treeherder1.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/treeherder2.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /src/presentations/try-with-taskcluster/slides/treeherder3.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /src/reference/core/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Core Services 3 | order: 3 4 | --- 5 | 6 | Taskcluster core services are those which we provide for our users, but which are not fundamental to the operation of the service. 7 | For example, a deployment of Taskcluster that is not used to build source code would not need the github service. 8 | -------------------------------------------------------------------------------- /src/reference/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Taskcluster Reference 3 | --- 4 | 5 | This portion of the Taskcluster documentation contains reference material. 6 | Consult the [manual](/docs/manual) for the background to this information. 7 | 8 | For each service or library, the main page is based on the project's README, 9 | with additional pages describing the project in more detail. 10 | 11 | Most of this material here is automatically generated when services are 12 | deployed in production or when new revisions are pushed to libraries, so it is 13 | generally completely up to date. 14 | -------------------------------------------------------------------------------- /src/reference/integrations/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Integrations 3 | order: 5 4 | --- 5 | 6 | Integrations include services that interact with the world outside Taskcluster. 7 | 8 | Some of the integrations are Mozilla-specific, but many are general and could 9 | be useful elsewhere. 10 | -------------------------------------------------------------------------------- /src/reference/libraries/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Libraries 3 | order: 10 4 | --- 5 | 6 | Taskcluster develops a collection of libraries that support the services we 7 | deploy. Some are purpose-specific, while others are very general-purpose and 8 | can be used in non-Taskcluster projects. 9 | -------------------------------------------------------------------------------- /src/reference/operations/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Operations 3 | order: 8 4 | --- 5 | 6 | The services in this section exist to support Taskcluster operations. They do 7 | not provide a service directly to Taskcluster users, and are mostly useful for 8 | the Taskcluster team. 9 | -------------------------------------------------------------------------------- /src/reference/platform/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Taskcluster Platform 3 | order: 2 4 | --- 5 | 6 | The Taskcluster Platform encompasses the services required to execute tasks. 7 | Any deployment of Taskcluster must include these services. 8 | -------------------------------------------------------------------------------- /src/reference/workers/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Workers 3 | order: 9 4 | --- 5 | 6 | Taskcluster develops several worker implementations, documented here. 7 | 8 | Anyone can develop a worker implementation using the [Queue API](/docs/reference/platform/queue/references/api), and several such implementations exist that are not developed by the Taskcluster team. 9 | -------------------------------------------------------------------------------- /src/resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Resources 3 | noAnchors: true 4 | --- 5 | 6 | ### [ Presentations](/docs/presentations) 7 | 8 | View videos, screencasts, and slides given about Taskcluster. 9 | 10 | --- 11 | 12 | ### [ Codetribute](https://codetribute.mozilla.org/projects/taskcluster) 13 | 14 | Codetribute collects bugs and issues that are good for newcomers to work on. If you want to get started contributing to Taskcluster, this tool can help. 15 | 16 | --- 17 | 18 | ### [ Bugzilla](https://bugzilla.mozilla.org/enter_bug.cgi?product=Taskcluster) 19 | 20 | Taskcluster uses Mozilla's Bugzilla to manage bugs and feature development. If you've found a bug, file it here. 21 | 22 | --- 23 | 24 | ### [ GitHub](https://github.com/taskcluster) 25 | 26 | Taskcluster's code and repositories. If you are looking for Taskcluster's code, this is where you will find it. 27 | 28 | --- 29 | 30 | ### [ Travis CI](https://travis-ci.org/taskcluster) 31 | 32 | Travis is the continuous-integration system that builds much of the code on GitHub. Look here for information and statuses 33 | of building Taskcluster code repositories. 34 | -------------------------------------------------------------------------------- /src/tutorial/apis.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API Tutorial 3 | layout: default 4 | class: markdown 5 | followup: 6 | links: 7 | authenticate: Authenticate to the API 8 | --- 9 | 10 | This section shows you how to access Taskcluster APIs programmatically. The 11 | examples use JavaScript (ES6) using the JavaScript [taskcluster 12 | client](https://github.com/taskcluster/taskcluster-client) but apply to [other 13 | supported 14 | languages](/docs/manual/using/integration/libraries). 15 | 16 | Note: the graphical Taskcluster tools on `tools.taskcluster.net` are all 17 | written in client-side JavaScript using 18 | [taskcluster-client-web](https://github.com/taskcluster/taskcluster-client-web), 19 | the client library designed for use in browser frontends. 20 | -------------------------------------------------------------------------------- /src/tutorial/finding-tasks.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Finding Tasks 3 | --- 4 | 5 | The "table of contents" for Taskcluster tasks is the 6 | [Index](https://tools.taskcluster.net/index/). When a task completes 7 | successfully, it is added to the index at an "index route" given by any 8 | `task.routes` entries that begin with `index.`. (Actually, the Queue just 9 | [sends pulse messages to well-known exchanges](/docs/reference/platform/queue/exchanges). 10 | The Index listens to `index.*` for task completion, and indexes the tasks appropriately). 11 | 12 | What that means is, you can use the [Index Browser](https://tools.taskcluster.net/index/) 13 | to find tasks. The precise format of the index paths is partially defined in the 14 | [namespaces](/docs/manual/devel/namespaces) document. 15 | 16 | --- 17 | 18 | ## Gecko Hacker? 19 | 20 | If you're looking for Gecko tasks, or tasks for another project that reports to 21 | TreeHerder, you can use TreeHerder to find tasks. Click on the job in 22 | treeherder, then click "Inspect Task". 23 | -------------------------------------------------------------------------------- /src/tutorial/gecko-decision-task.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Gecko Decision Task 3 | followup: 4 | links: 5 | gecko-task-graph: How is the task-graph generated? 6 | --- 7 | 8 | Upon detecting a push to a supported Mercurial repository, Taskcluster reads [`.taskcluster.yml`](https://dxr.mozilla.org/mozilla-central/source/.taskcluster.yml) from the root directory of the repository, in the revision just pushed. 9 | It parses this file, substituting a number of variables based on the push, and submits the resulting task to the [Taskcluster queue](/docs/manual/tasks/queue). 10 | This task is the "decision task", which will in turn create all of the tasks for the push. 11 | 12 | The scopes available to the decision task are limited by the repository's role. 13 | For example, the Cypress branch's decision task has only the scopes in [repo:hg.mozilla.org/projects/cypress:*](https://tools.taskcluster.net/auth/roles/#repo:hg.mozilla.org%252fprojects%252fcypress:*). 14 | 15 | This pattern occurs even for a try push. 16 | That means you can modify how the decision task is invoked, or even what the decision task does, in a try push! 17 | 18 | You can find a link to the latest mozilla-central decision task in [the Taskcluster index](https://tools.taskcluster.net/index/#gecko.v2.mozilla-central.latest.firefox/gecko.v2.mozilla-central.latest.firefox.decision). 19 | -------------------------------------------------------------------------------- /src/tutorial/gecko-docker-images.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Docker Image Generation 3 | followup: 4 | links: 5 | gecko-decision-task: How is the decision task defined? 6 | gecko-task-graph: How is the task-graph generated? 7 | --- 8 | 9 | The docker images used to run Gecko tasks on Linux are defined in [taskcluster/docker](https://dxr.mozilla.org/mozilla-central/source/taskcluster/docker/). 10 | Each directory represents a different image, and contains a `Dockerfile` describing the image itself. 11 | These Dockerfiles are a bit more flexible than usual -- see [the Gecko documentation](https://firefox-source-docs.mozilla.org/taskcluster/taskcluster/docker-images.html) for details. 12 | 13 | ## Modifying Docker Images 14 | 15 | When a Docker image description, or any file on which it depends, is modified, the [decision task](gecko-decision-task) detects this and schedules a docker-image build task, denoted with an "I" in treeherder. 16 | All tasks using the resulting image are configured to depend on this docker-image task, and to use an artifact of that task as the docker image in which they will run. 17 | 18 | The result is that anyone with try access can create new docker images and run tasks in those images with a single try push! 19 | -------------------------------------------------------------------------------- /src/tutorial/gecko-new-job.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Adding a new job 3 | marked: true 4 | ejs: true 5 | --- 6 | 7 | Taskcluster runs tasks. 8 | It's just as happy to run your new tasks as any of the already-defined tasks! 9 | All you need to do is add some configuration for your new tasks, then test it out in try. 10 | The documentation for that process is kept [in-tree](https://firefox-source-docs.mozilla.org/taskcluster/taskcluster/how-tos.html), where it can co-evolve with the task-graph generation system. 11 | 12 | --- 13 | 14 | ## TreeHerder Reporting 15 | 16 | If a tree is built in the forest, and nobody is around to herd it, did it really happen? 17 | 18 | If your new job isn't in TreeHerder, it's like it never happened. 19 | Gecko tasks carry a number of fields in `task.extra.treeherder` that describe how the task should be represented in TreeHerder. 20 | The schema for this information is as follows: 21 | 22 |
23 | 24 | --- 25 | 26 | ## New Worker Type 27 | 28 | If your new job requires compute resources that are not already available via Taskcluster, then some additional work may be required. 29 | This will entail defining a new worker type for those compute resources, and then creating those new resources. 30 | 31 | For EC2 instances, this is fairly easy: we can specify instance characteristics such as instance type and worker implementation within the AWS provisioner. 32 | Other cloud providers are not currently supported, although doing so is not impossible. 33 | If your tasks need physical hardware, though, then things can be considerably more difficult. 34 | You should begin by discussing your hardware options with the relevant systems operations group. 35 | -------------------------------------------------------------------------------- /src/tutorial/gecko-task-graph-howto.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Changing the Task Graph 3 | --- 4 | 5 | We know that task-graph configuration is not an area of expertise for most Firefox developers. 6 | So the task-graph generation machinery is designed to make common changes easy. 7 | 8 | Please see the [Gecko Documentation » Taskcluster Task-Graph Generation » How Tos](https://firefox-source-docs.mozilla.org/taskcluster/taskcluster/how-tos.html) for some general help on modifying the task graph and, more importantly, recipes for some of the more common modifications. 9 | 10 | The Taskcluster team also stands ready to help, if you need additional assistance. 11 | -------------------------------------------------------------------------------- /src/tutorial/gecko-task-graph.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Gecko Task Graph Creation 3 | followup: 4 | links: 5 | gecko-new-job: I want to add a new job 6 | gecko-task-graph-howto: I want to change something else 7 | --- 8 | 9 | The decision task is responsible for creating the "task graph". 10 | This is the collection of all tasks required in response to the push, connected by dependencies. 11 | For example, a test task will depend on the build task producing the browser installer it should test. 12 | 13 | Task-graph generation occurs entirely "in-tree", in the sense that both the configuration and code are contained in the Gecko source tree. 14 | This means that it can evolve along with Gecko, and in fact may work differently on different branches! 15 | 16 | The task-graph generation process is well-documented in the [Gecko Documentation](https://firefox-source-docs.mozilla.org/taskcluster/taskcluster/index.html). 17 | 18 | --- 19 | 20 | ## Try Pushes 21 | 22 | Try pushes are handled the same way. 23 | The in-tree task-graph generation code parses the try commit message and uses the result to determine which tasks, out of the full task graph that might be run on an integration branch, should be performed for the try push. 24 | This means that you can easily [add entirely new tasks](gecko-new-job) (a new test suite, a new platform, etc.) to the tree and test them with a try push. 25 | -------------------------------------------------------------------------------- /src/tutorial/gecko-tasks.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Gecko and Taskcluster 3 | followup: 4 | links: 5 | gecko-decision-task: How is the decision task defined? 6 | gecko-task-graph: How is the task-graph generated? 7 | gecko-docker-images: How are the docker images created? 8 | --- 9 | 10 | When a developer pushes to a Gecko repository, a long chain of events begins: 11 | 12 | * A "decision task" is created to decide what to do with the push. 13 | * The decision task creates a lot of additional tasks. 14 | These tasks include build and test tasks, along with lots of other kinds of tasks to build docker images, build toolchains, perform analyses, check syntax, and so on. 15 | * These tasks are arranged in a "task graph", with some tasks (e.g., tests) depending on others (builds). 16 | Once its prerequisite tasks complete, a dependent task begins. 17 | * The result of each task is sent to [TreeHerder](https://treeherder.mozilla.org) where developers and sheriffs can track the status of the push. 18 | * The outputs from each task -- log files, Firefox installers, and so on -- appear attached to each task (viewable in the [Task Inspector](https://tools.taskcluster.net/task-inspector/)) when it completes. 19 | 20 | Due to its "self-service" design, very little of this process is actually part of Taskcluster, so we provide only a brief overview and some pointers. 21 | 22 | Taskcluster provides a small bit of glue ([mozilla-taskcluster](/docs/manual/vcs/mozilla-taskcluster)) to create the decision task and some more ([taskcluster-treeherder](/docs/reference/core/treeherder)) to communicate with treeherder, but the task graph itself is defined entirely in-tree. 23 | -------------------------------------------------------------------------------- /src/tutorial/hack-tc.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Hacking on Taskcluster 3 | followup: 4 | links: 5 | reviews: Submitting changes of Taskcluster itself for review 6 | --- 7 | 8 | Hacking on Taskcluster is really easy. Head over to the [Taskcluster GitHub 9 | page](https://github.com/taskcluster) and dive right in. Fork a project you 10 | want to contribute to and feel free to make pull requests. 11 | 12 | The code base uses ES2015+ syntax and features like Promises and Async Functions. 13 | Jump over to [async JavaScript](async-javascript) if you need to learn more. 14 | -------------------------------------------------------------------------------- /src/tutorial/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | followup: 3 | subtext: How do you want to use Taskcluster? 4 | links: 5 | tutorial/what-is-tc: I'm not sure - what is it? 6 | tutorial/hello-world: I want to run a task manually in Taskcluster. 7 | tutorial/gecko-tasks: I'm a Firefox/Gecko developer and I want to change builds or tests. 8 | tutorial/debug-task: A task is failing and I want to debug it. 9 | tutorial/apis: I want to work with the Taskcluster APIs. 10 | tutorial/hack-tc: I want to hack on Taskcluster itself. 11 | --- 12 | 13 | # Welcome to Taskcluster! 14 | 15 | --- 16 | 17 | This tutorial is designed to help you learn what you need to know about 18 | Taskcluster to accomplish your goals. You can navigate it by answering the 19 | question at the bottom of each page, which will bring you to the most helpful 20 | information. 21 | 22 | If you want a more comprehensive description of Taskcluster's design and 23 | operation, see the manual portion of this documentation. 24 | 25 | ## Patches Welcome! 26 | 27 | As you learn more, please feel welcome to [contribute](https://github.com/taskcluster/taskcluster-docs) more choices and pathways to this tutorial. 28 | Especially if you did not find the information you were seeking, you are best able to decide where to add a new choice! 29 | -------------------------------------------------------------------------------- /util/taskcluster-build.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | set -ex 4 | 5 | yarn global add node-gyp 6 | yarn install --no-progress 7 | 8 | yarn download 9 | 10 | if [ "$1" = "pull-request" ]; then 11 | yarn run check 12 | # [C] here avoids matching itself 13 | if git grep Task[C]luster; then 14 | echo "Pull Request contains incorrect capitalization of Taskcluster; see above" 15 | exit 1 16 | fi 17 | elif [ "$1" = "push" ] || [ $1 = "hook" ]; then 18 | export PUBLISH_BUCKET=docs-taskcluster-net 19 | export PUBLISH_REGION=us-west-2 20 | # for pushes, force update, since subtle things may have changed.. 21 | [ $1 = "push" ] && export PUBLISH_FORCE=yes 22 | export MOZILLIANS_SECRET=project/taskcluster/tc-docs/mozillians 23 | yarn deploy 24 | fi 25 | --------------------------------------------------------------------------------