[{"data":1,"prerenderedAt":962},["ShallowReactive",2],{"navigation_docs":3,"-remote-deploy":144,"-remote-deploy-surround":957},[4,35,84,109,124,134,139],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Get Started","\u002Fget-started","1.get-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fget-started\u002Fintroduction","1.get-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fget-started\u002Finstallation","1.get-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick start","\u002Fget-started\u002Fquickstart","1.get-started\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Project structure","\u002Fget-started\u002Fproject-structure","1.get-started\u002F4.project-structure","i-lucide-folder-tree",{"title":30,"path":31,"stem":32,"icon":33},"Dashboard","\u002Fget-started\u002Fdashboard","1.get-started\u002F5.dashboard","i-lucide-layout-dashboard",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Concepts","\u002Fconcepts","2.concepts",[40,45,50,55,60,65,69,74,79],{"title":41,"path":42,"stem":43,"icon":44},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Machines","\u002Fconcepts\u002Fmachines","2.concepts\u002F2.machines","i-lucide-server",{"title":51,"path":52,"stem":53,"icon":54},"Colony & users","\u002Fconcepts\u002Fcolony","2.concepts\u002F3.colony","i-lucide-users",{"title":56,"path":57,"stem":58,"icon":59},"Transport","\u002Fconcepts\u002Ftransport","2.concepts\u002F4.transport","i-lucide-network",{"title":61,"path":62,"stem":63,"icon":64},"Configuration","\u002Fconcepts\u002Fconfiguration","2.concepts\u002F5.configuration","i-lucide-settings",{"title":66,"path":67,"stem":68,"icon":23},"Deploy","\u002Fconcepts\u002Fdeploy","2.concepts\u002F6.deploy",{"title":70,"path":71,"stem":72,"icon":73},"Groups","\u002Fconcepts\u002Fgroups","2.concepts\u002F7.groups","i-lucide-boxes",{"title":75,"path":76,"stem":77,"icon":78},"Templates","\u002Fconcepts\u002Ftemplates","2.concepts\u002F8.templates","i-lucide-package-plus",{"title":80,"path":81,"stem":82,"icon":83},"Existing projects","\u002Fconcepts\u002Fexisting-projects","2.concepts\u002F9.existing-projects","i-lucide-folder-open",{"title":85,"path":86,"stem":87,"children":88,"page":34},"Remote","\u002Fremote","3.remote",[89,94,99,104],{"title":90,"path":91,"stem":92,"icon":93},"Remote machines","\u002Fremote\u002Foverview","3.remote\u002F1.overview","i-lucide-cloud",{"title":95,"path":96,"stem":97,"icon":98},"Remote deploy","\u002Fremote\u002Fdeploy","3.remote\u002F2.deploy","i-lucide-send",{"title":100,"path":101,"stem":102,"icon":103},"CI","\u002Fremote\u002Fci","3.remote\u002F3.ci","i-lucide-workflow",{"title":105,"path":106,"stem":107,"icon":108},"Tunnels","\u002Fremote\u002Ftunnel","3.remote\u002F4.tunnel","i-lucide-cable",{"title":110,"path":111,"stem":112,"children":113,"page":34},"Security","\u002Fsecurity","4.security",[114,119],{"title":115,"path":116,"stem":117,"icon":118},"Security model","\u002Fsecurity\u002Fmodel","4.security\u002F1.model","i-lucide-shield",{"title":120,"path":121,"stem":122,"icon":123},"Known issues","\u002Fsecurity\u002Fknown-issues","4.security\u002F2.known-issues","i-lucide-triangle-alert",{"title":125,"path":126,"stem":127,"children":128,"page":34},"Reference","\u002Freference","5.reference",[129],{"title":130,"path":131,"stem":132,"icon":133},"CLI reference","\u002Freference\u002Fcli","5.reference\u002F1.cli","i-lucide-terminal",{"title":135,"path":136,"stem":137,"icon":138},"Changelog","\u002Fchangelog","changelog","i-lucide-history",{"title":140,"path":141,"stem":142,"icon":143},"Communities","\u002Fcommunities","communities","i-lucide-heart-handshake",{"id":145,"title":95,"body":146,"description":949,"extension":950,"links":951,"meta":952,"navigation":953,"path":96,"seo":954,"stem":97,"__hash__":956},"docs\u002F3.remote\u002F2.deploy.md",{"type":147,"value":148,"toc":936},"minimark",[149,153,187,198,214,232,237,246,343,347,443,448,485,488,500,580,601,605,770,774,815,820,833,837,853,857,869,873,883,921,932],[150,151,152],"p",{},"Point a project at a machine and deploy:",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# ant.yaml\nmachine: prod\n","yaml","",[161,162,163,172],"code",{"__ignoreMap":159},[164,165,168],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"sutJx","# ant.yaml\n",[164,173,175,179,183],{"class":166,"line":174},2,[164,176,178],{"class":177},"sQzsp","machine",[164,180,182],{"class":181},"sP7_E",":",[164,184,186],{"class":185},"s_sjI"," prod\n",[154,188,192],{"className":189,"code":190,"language":191,"meta":159,"style":159},"language-sh shiki shiki-themes material-theme-lighter github-light github-dark","ant trail deploy prod\n","sh",[161,193,194],{"__ignoreMap":159},[164,195,196],{"class":166,"line":167},[164,197,190],{},[150,199,200,201,204,205,209,210,213],{},"For a container project, the client packages the build context (a gzipped tar\nwith the context's ",[161,202,203],{},".dockerignore"," applied), uploads it over the transport, and\nthe worker builds the image ",[206,207,208],"strong",{},"on the machine"," with the same builder the local\npath uses, ",[161,211,212],{},"docker build",", nixpacks, pack, or railpack. The image never\ncrosses the wire, and the build sees the machine's architecture and cache. The\ncontainer then starts there and any domains route through the machine's Caddy.",[150,215,216,219,220,223,224,227,228,231],{},[161,217,218],{},"ant trail deploy --machine M --image REF"," remains the low-level form for running\na pre-built image; ",[161,221,222],{},"--from-tar"," transfers a ",[161,225,226],{},"docker save"," archive, ",[161,229,230],{},"--pull","\nfetches from a registry.",[233,234,236],"h2",{"id":235},"where-the-context-fits","Where the context fits",[150,238,239,242,243,245],{},[161,240,241],{},"internal\u002Fdocker\u002Fcontext"," is the seam that answers \"where do build and run\nexecute?\". Opening a context for the target and calling ",[161,244,66],{}," hides the\nlocal\u002Fremote split:",[247,248,249,260,295,312],"ul",{},[250,251,252,255,256,259],"li",{},[206,253,254],{},"Local context"," (",[161,257,258],{},"dockerctx.Local()","): build and run shell out to the local\ndocker CLI, exactly as they always have.",[250,261,262,255,265,268,269,272,273,276,277,279,280,283,284,283,287,290,291,294],{},[206,263,264],{},"Remote context",[161,266,267],{},"dockerctx.Open(machine)","): ",[161,270,271],{},"Build"," packages the build\ncontext and calls the worker's ",[161,274,275],{},"build.run","; ",[161,278,66],{}," translates the resolved\nrequest into ",[161,281,282],{},"deploy.run",", ",[161,285,286],{},"compose.apply",[161,288,289],{},"stack.apply",", and ",[161,292,293],{},"route.apply",",\nand surfaces settings the target cannot apply as warnings.",[250,296,297,300,301,304,305,307,308,311],{},[206,298,299],{},"Pre-built images",": a ",[161,302,303],{},"deploy.build: none"," request skips ",[161,306,271],{}," entirely:\nthe remote context runs the image and the machine pulls it (or receives it via\n",[161,309,310],{},"ant trail deploy --image --from-tar",").",[250,313,314,317,318,322,323,326,327,330,331,334,335,338,339,342],{},[206,315,316],{},"Registry",": a registry is not a context; it is the distribution channel\n",[319,320,321],"em",{},"between"," contexts. With ",[161,324,325],{},"deploy.registry"," set, a source-built remote deploy\nbuilds on the ",[206,328,329],{},"local"," context, tags and pushes the image\n(",[161,332,333],{},"\u003Chost>\u002F\u003Crepository>\u002F\u003Capp>:\u003Crelease>","), then runs on the ",[206,336,337],{},"remote"," context\nwith the machine pulling it. The password comes from\n",[161,340,341],{},"ANT_REGISTRY_PASSWORD"," and travels with the deploy as a short-lived\nworker-side credential, so a private image pulls without its own login on\nthe machine; without the environment variable (or for a machine that already\nlogged in) nothing changes.",[233,344,346],{"id":345},"two-deploy-shapes","Two deploy shapes",[348,349,350,365],"table",{},[351,352,353],"thead",{},[354,355,356,362],"tr",{},[357,358,359],"th",{},[161,360,361],{},"run:",[357,363,364],{},"What happens",[366,367,368,379,401],"tbody",{},[354,369,370,376],{},[371,372,373],"td",{},[161,374,375],{},"container",[371,377,378],{},"The context is uploaded, built on the machine, and run. The common case.",[354,380,381,386],{},[371,382,383],{},[161,384,385],{},"compose",[371,387,388,389,392,393,396,397,400],{},"The client resolves the compose file (",[161,390,391],{},"docker compose config","), builds every service that declares ",[161,394,395],{},"build:"," on the machine (rewriting it to the produced image), and ships the file; the worker runs ",[161,398,399],{},"docker compose up -d",". Image-only services pull as before.",[354,402,403,408],{},[371,404,405],{},[161,406,407],{},"stack",[371,409,410,411,414,415,283,418,290,421,424,425,427,428,430,431,434,435,438,439,442],{},"The client reads the stack file and the worker runs ",[161,412,413],{},"docker stack deploy --with-registry-auth"," on a Swarm manager, then routes domains at each service's published port. Tasks carry ant's managed\u002Fapp labels, so ",[161,416,417],{},"nest containers list",[161,419,420],{},"trail status",[161,422,423],{},"trail logs \u003Cdeployment> [service]"," see them. Services need pullable images (build here and push with ",[161,426,325],{},", or reference a registry image); ",[161,429,395],{}," services and ",[161,432,433],{},"deploy.files"," layering are refused, ",[161,436,437],{},"zero_downtime"," maps to a Swarm start-first rolling update, and ",[161,440,441],{},"rollback"," is refused (pin the previous image and redeploy).",[444,445,447],"h3",{"id":446},"build-context-packaging","Build context packaging",[247,449,450,464,467,478],{},[250,451,452,453,456,457,459,460,463],{},"The context is the resolved ",[161,454,455],{},"build.context"," directory; the ",[161,458,203],{},"\nthere is applied before upload, so ",[161,461,462],{},"node_modules"," and friends do not travel.",[250,465,466],{},"The Dockerfile may live inside the context (sent by path, always included\neven when ignored) or outside it (read and shipped as content).",[250,468,469,470,473,474,477],{},"The machine needs the chosen builder installed (",[161,471,472],{},"ant nest tools --machine M","\nchecks). A ",[161,475,476],{},"dockerfile"," build needs only Docker.",[250,479,480,481,484],{},"Contexts are unpacked into a temporary directory on the worker and removed\nafter the build. Absolute paths, ",[161,482,483],{},".."," traversal, hard links, and symlinks that\nleave the context are rejected.",[444,486,487],{"id":385},"Compose",[150,489,490,491,494,495,499],{},"Every service is handled: one that references an ",[206,492,493],{},"image"," pulls it on the\nmachine; one that declares ",[206,496,497],{},[161,498,395],{}," has its context uploaded and built on\nthe machine, then the resolved file is rewritten to the produced image. The\ncompose file's own log rotation, resource limits, env, and restart policy are\npreserved; ant's defaults are added where the file is silent.",[154,501,503],{"className":156,"code":502,"language":158,"meta":159,"style":159},"services:\n  api:\n    build: .                        # built on the machine\n    ports: [\"8080:8080\"]\n  redis:\n    image: redis:7                  # pulled on the machine\n",[161,504,505,513,520,535,558,566],{"__ignoreMap":159},[164,506,507,510],{"class":166,"line":167},[164,508,509],{"class":177},"services",[164,511,512],{"class":181},":\n",[164,514,515,518],{"class":166,"line":174},[164,516,517],{"class":177},"  api",[164,519,512],{"class":181},[164,521,523,526,528,532],{"class":166,"line":522},3,[164,524,525],{"class":177},"    build",[164,527,182],{"class":181},[164,529,531],{"class":530},"srdBf"," .",[164,533,534],{"class":170},"                        # built on the machine\n",[164,536,538,541,543,546,550,553,555],{"class":166,"line":537},4,[164,539,540],{"class":177},"    ports",[164,542,182],{"class":181},[164,544,545],{"class":181}," [",[164,547,549],{"class":548},"sjJ54","\"",[164,551,552],{"class":185},"8080:8080",[164,554,549],{"class":548},[164,556,557],{"class":181},"]\n",[164,559,561,564],{"class":166,"line":560},5,[164,562,563],{"class":177},"  redis",[164,565,512],{"class":181},[164,567,569,572,574,577],{"class":166,"line":568},6,[164,570,571],{"class":177},"    image",[164,573,182],{"class":181},[164,575,576],{"class":185}," redis:7",[164,578,579],{"class":170},"                  # pulled on the machine\n",[150,581,582,583,586,587,283,590,593,594,290,597,600],{},"Remote compose build features that ant cannot reproduce yet are ",[206,584,585],{},"refused with a\nclear message"," rather than silently ignored: ",[161,588,589],{},"build.target",[161,591,592],{},"build.secrets",",\n",[161,595,596],{},"build.ssh",[161,598,599],{},"build.additional_contexts",".",[233,602,604],{"id":603},"reliability-on-a-server","Reliability on a server",[247,606,607,621,630,636,646,656,670,676,701,723,737,757],{},[250,608,609,612,613,616,617,620],{},[206,610,611],{},"Staged replacement."," When a container with the same name is already\nrunning, the new image, env, ports, and entrypoint are validated in a staging\ncontainer first (on ephemeral host ports, with the deploy's ",[206,614,615],{},"read-only","\nmounts). A bad image or crash loop leaves the running container serving. The\nstaged container is removed and the canonical one replaced only after it is\nhealthy. A deploy with a ",[206,618,619],{},"writable"," mount (a live data volume, or a bind the\napp needs to boot) cannot be staged safely and is replaced in place instead,\nthen checked for exiting immediately.",[250,622,623,626,627,629],{},[206,624,625],{},"Zero-downtime rollouts."," For a container deploy with at least one domain,\n",[161,628,437],{}," starts the new container beside the running one on an\nephemeral port, health-gates it, moves Caddy to that port, and only then\nreplaces the old container, so no request hits a stopped upstream. It needs\na read-only (or no) mount set; a writable mount falls back to the staged swap.\nA stack deploy instead gets a Swarm start-first rolling update (stop-first\nwith a warning when services publish host-mode ports). Remote compose still\nuses the staged swap.",[250,631,632,635],{},[206,633,634],{},"Serialized deploys."," The worker runs one container\u002Fcompose mutation at a\ntime, so two deploys of the same app cannot fight over the staging name and\nthe swap.",[250,637,638,641,642,645],{},[206,639,640],{},"Health gate."," A configured ",[161,643,644],{},"health_check"," is probed over HTTP against the\nstaging container before the swap.",[250,647,648,651,652,655],{},[206,649,650],{},"Rollback."," ",[161,653,654],{},"ant trail rollback \u003Cdeployment> [--to RELEASE] [--steps N]","\nredeploys a previously released image without rebuilding (compose projects are\nrefused). The image tag must still exist on the machine.",[250,657,658,661,662,665,666,669],{},[206,659,660],{},"Restart policy."," Remote deploys default to ",[161,663,664],{},"restart: unless-stopped","\n(",[161,667,668],{},"ant trail deploy --image --restart"," overrides it), and compose services that do not\ndeclare a policy get the same, so a reboot brings the app back.",[250,671,672,675],{},[206,673,674],{},"Smart defaults."," Log rotation (10m × 3) and resource limits apply on the\nmachine even when the project does not set them.",[250,677,678,681,682,685,686,651,689,692,693,696,697,700],{},[206,679,680],{},"Mount guard."," A deploy that reaches the worker's identity\u002Fstate directory,\nthe docker socket, or the host root is refused, on the client and the worker.\nFor compose this includes ",[161,683,684],{},"secrets:","\u002F",[161,687,688],{},"configs:",[161,690,691],{},"file:"," sources, and\n",[161,694,695],{},"privileged: true"," and host ",[161,698,699],{},"devices:"," are rejected outright.",[250,702,703,706,707,710,711,714,715,718,719,722],{},[206,704,705],{},"Loopback ports."," A published port binds ",[161,708,709],{},"127.0.0.1"," by default\n(",[161,712,713],{},"deploy.publish: loopback","), so a deployed service is reachable through the\nmachine's Caddy and on the machine itself but not from the network. Set\n",[161,716,717],{},"deploy.publish: all"," for a source deploy (or ",[161,720,721],{},"ant trail deploy --image --publish-all"," for the image path) when a service must be reached directly and\nbrings its own TLS.",[250,724,725,728,729,732,733,736],{},[206,726,727],{},"Image retention."," After a source build, the machine's superseded image tags\nare pruned to ",[161,730,731],{},"deploy.keep_images"," (falling back to ",[161,734,735],{},"rollback.keep_releases",",\nthen 10).",[250,738,739,651,742,745,746,283,749,752,753,756],{},[206,740,741],{},"Logs.",[161,743,744],{},"ant trail logs \u003Cdeployment>"," fetches the tail from the machine\n(",[161,747,748],{},"--tail N",[161,750,751],{},"all","); streaming (",[161,754,755],{},"-f",") is local-only for now.",[250,758,759,651,762,765,766,769],{},[206,760,761],{},"Inspecting.",[161,763,764],{},"ant nest containers list --machine M"," and ",[161,767,768],{},"ant nest volume list --machine M"," show what is running and what is stored on the machine.",[233,771,773],{"id":772},"what-is-not-supported-yet","What is not supported yet",[247,775,776,792],{},[250,777,778,781,782,283,784,283,786,788,789,791],{},[206,779,780],{},"Compose build extras",": ",[161,783,589],{},[161,785,592],{},[161,787,596],{},", and\n",[161,790,599],{}," are refused; prebuild the image and reference it.",[250,793,794,781,799,430,801,803,804,807,808,811,812,600],{},[206,795,796],{},[161,797,798],{},"run: stack",[161,800,395],{},[161,802,441],{}," are refused; the machine\nmust be a Swarm manager (",[161,805,806],{},"ant nest swarm init --machine M","). Routing,\nzero-downtime rolling updates, and ",[161,809,810],{},"ant trail destroy"," are implemented. See\n",[813,814,120],"a",{"href":121},[150,816,817,818,600],{},"All of this is tracked in ",[813,819,120],{"href":121},[150,821,822,823,300,825,828,829,832],{},"Running deploys from a CI pipeline? See ",[813,824,100],{"href":101},[161,826,827],{},"ci","-role account,\na credential-bundle secret, and ",[161,830,831],{},"ANT_MACHINE"," are all a job needs.",[233,834,836],{"id":835},"workaround","Workaround",[150,838,839,840,593,842,844,845,848,849,852],{},"For a compose build feature ant cannot reproduce yet (",[161,841,589],{},[161,843,592],{},"), prebuild the image and reference it with ",[161,846,847],{},"image:",", or use a\n",[161,850,851],{},"run: container"," project.",[233,854,856],{"id":855},"routes","Routes",[150,858,859,860,862,863,866,867,600],{},"The worker applies route changes (",[161,861,293],{},") so the deploy is reachable once\nit lands, through the machine's ",[206,864,865],{},"Caddy",", which is required on a remote nest.\nIf Caddy is not reachable the deploy is refused before anything starts. Route and\ncompose operations are authorized against the machine's roster like every other\ngated RPC; see ",[813,868,115],{"href":116},[444,870,872],{"id":871},"caddy-and-swarm","Caddy and Swarm",[150,874,875,876,878,879,882],{},"For ",[161,877,798],{},", Caddy stays what it is everywhere else: a host process on the\nmachine that runs the worker; for stacks, a Swarm ",[206,880,881],{},"manager",". Routes target\neach service's published host port on that machine, resolved at deploy time:",[247,884,885,895,905],{},[250,886,887,890,891,894],{},[206,888,889],{},"Ingress mode (default)"," works at any node count: the routing mesh serves a\npublished port on every node, so ",[161,892,893],{},"127.0.0.1:\u003Cport>"," on the manager reaches the\ntask wherever it runs. Point the domains' DNS at the manager.",[250,896,897,904],{},[206,898,899,900,903],{},"Host mode (",[161,901,902],{},"mode: host",")"," binds the port only on the node running the task.\nOn a single-node swarm that is still the manager; on a multi-node swarm the\nroute can point at nothing, ant warns during the deploy when a routed\nservice does this. Prefer ingress mode for routed services, or run Caddy on\nthe node(s) hosting the task.",[250,906,907,651,910,912,913,916,917,920],{},[206,908,909],{},"Worker nodes need only Docker.",[161,911,806],{}," makes the\nmachine a manager; other nodes join with the token from\n",[161,914,915],{},"ant nest swarm join-token --machine M",". ",[161,918,919],{},"ant-worker"," and Caddy live on the\nmanager.",[150,922,923,924,927,928,931],{},"The ",[161,925,926],{},"--handover"," bundle's Caddyfile snippet carries the same upstreams. If you\nre-home Caddy onto the app's overlay network (as a Swarm service), switch the\nupstreams to ",[161,929,930],{},"tasks.\u003Cproject>_\u003Cservice>:\u003Ccontainer-port>",", task DNS names\nresolve inside the overlay.",[933,934,935],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":159,"searchDepth":174,"depth":174,"links":937},[938,939,943,944,945,946],{"id":235,"depth":174,"text":236},{"id":345,"depth":174,"text":346,"children":940},[941,942],{"id":446,"depth":522,"text":447},{"id":385,"depth":522,"text":487},{"id":603,"depth":174,"text":604},{"id":772,"depth":174,"text":773},{"id":835,"depth":174,"text":836},{"id":855,"depth":174,"text":856,"children":947},[948],{"id":871,"depth":522,"text":872},"Build and run a project on a registered machine.","md",null,{},{"icon":98},{"title":95,"description":955},"Target a machine with `machine:` in ant.yaml, and understand what the worker can build and run today.","kLgg2Qy5kKBuOVgL_6728OwaJXjddV2mW-BVL1hwjis",[958,960],{"title":90,"path":91,"stem":92,"description":959,"icon":93,"children":-1},"Register a machine, provision the worker, and authenticate.",{"title":100,"path":101,"stem":102,"description":961,"icon":103,"children":-1},"Deploy to a machine from a CI pipeline.",1791494556932]