PageSourceSearch

https://docs.pantavisor.io/assets/js/90e5346d.a4d09fd6.js

js pantavisor.io collected 2026-10-04 00:17:35 UTC 13,786 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkpantavisor_docs=self.webpackChunkpantavisor_docs||[]).push([["12686"],{5170(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>h,frontMatter:()=>t,contentTitle:()=>l,toc:()=>c,assets:()=>i});var r=JSON.parse('{"id":"meta-pantavisor/ci/overview","title":"CI Overview","description":"The CI system builds Yocto images for all supported machines, runs integration tests, mirrors release tags, and publishes artifacts to S3. All behavior is driven from a single source of truth \u2014 .github/machines.json \u2014 from which most workflow files are generated.","source":"@site/reference_versioned_docs/version-029-rc2/meta-pantavisor/ci/overview.md","sourceDirName":"meta-pantavisor/ci","slug":"/meta-pantavisor/ci/overview","permalink":"/029-rc2/meta-pantavisor/ci/overview","draft":false,"unlisted":false,"tags":[],"version":"029-rc2","sidebarPosition":1,"frontMatter":{"sidebar_position":1}}'),d=s(74848),a=s(28453);let t={sidebar_position:1},l="CI Overview",i={},c=[{value:"Workflow Map",id:"workflow-map",level:2},{value:"Workflow Files",id:"workflow-files",level:2},{value:"Scripts",id:"scripts",level:2},{value:"Runners and Container",id:"runners-and-container",level:2},{value:"Related docs",id:"related-docs",level:2}];function o(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.header,{children:(0,d.jsx)(n.h1,{id:"ci-overview",children:"CI Overview"})}),"\n",(0,d.jsxs)(n.p,{children:["The CI system builds Yocto images for all supported machines, runs integration tests, mirrors release tags, and publishes artifacts to S3. All behavior is driven from a single source of truth \u2014 ",(0,d.jsx)(n.code,{children:".github/machines.json"})," \u2014 from which most workflow files are generated."]}),"\n",(0,d.jsx)(n.h2,{id:"workflow-map",children:"Workflow Map"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"TAG PUSH  (0*  or  *-rc*)\n  tag-scarthgap.yaml\n    \u251C\u2500\u2500 sync     \u2192 sync-pantavisor.yaml       mirror tag to pantavisor/pantavisor\n    \u2514\u2500\u2500 release  \u2192 release.yaml (after sync)\n                    \u251C\u2500\u2500 build \xd7 N machines    \u2192 buildkas-upload.yaml  (kas build + S3 upload)\n                    \u251C\u2500\u2500 pvtest-local          \u2192 call-pvtests.yaml\n                    \u251C\u2500\u2500 pvtest-remote         \u2192 call-pvtests.yaml     (after local)\n                    \u2514\u2500\u2500 summary                 upload per-machine badges to S3\n\n  tag-changelogs.yaml  (workflow_run, fires after tag-scarthgap completes)\n    \u2514\u2500\u2500 changelog       render CHANGELOG-NNN.md, update GitHub Release, open PR to master\n\n  tag-docs-scarthgap.yaml  (workflow_run, fires after tag-scarthgap completes)\n    \u2514\u2500\u2500 build-docs      kas build -c create_pantacor_docs pantavisor-starter \u2192 upload tarball to S3\n\n\nON PUSH  (master)\n  onpush-scarthgap.yaml\n    \u2514\u2500\u2500 build \xd7 onpush machines  \u2192 buildkas-target.yaml  (kas build, artifacts only)\n\n\nMANUAL  (workflow_dispatch)\n  manual-scarthgap.yaml\n    \u2514\u2500\u2500 build \xd7 all manual machines  \u2192 buildkas-target.yaml\n\n  manual-pvtests.yaml\n    \u251C\u2500\u2500 build docker-x86_64-scarthgap  \u2192 buildkas-target.yaml\n    \u2514\u2500\u2500 start-pvtest                   \u2192 call-pvtests.yaml\n\n\nSCHEDULED\n  schedule-pvtests.yaml       daily 02:00\n    \u251C\u2500\u2500 build docker-x86_64-scarthgap  \u2192 buildkas-target.yaml\n    \u251C\u2500\u2500 local                          \u2192 call-pvtests.yaml\n    \u2514\u2500\u2500 remote                         \u2192 call-pvtests.yaml  (after local)\n\n  schedule-updates.yaml       every 8 h\n    \u2514\u2500\u2500 check-and-update   bump SRCREVs via update-components.sh, open PR if changed\n\n  schedule-updatemachines.yaml  every 8 h + 15 min\n    \u2514\u2500\u2500 updaterelease      run makemachines + make
1workflows, open PR if changed\n"})}),"\n",(0,d.jsx)(n.h2,{id:"workflow-files",children:"Workflow Files"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"File"}),(0,d.jsx)(n.th,{children:"Trigger"}),(0,d.jsx)(n.th,{children:"Role"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"tag-scarthgap.yaml"})}),(0,d.jsx)(n.td,{children:"tag push"}),(0,d.jsx)(n.td,{children:"Orchestrator: sync \u2192 release"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"release.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_call"})}),(0,d.jsx)(n.td,{children:"Build matrix + pvtests + badge upload"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"tag-changelogs.yaml"})}),(0,d.jsxs)(n.td,{children:[(0,d.jsx)(n.code,{children:"workflow_run"})," after tag-scarthgap"]}),(0,d.jsx)(n.td,{children:"Changelog generation and GitHub Release"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"tag-docs-scarthgap.yaml"})}),(0,d.jsxs)(n.td,{children:[(0,d.jsx)(n.code,{children:"workflow_run"})," after tag-scarthgap"]}),(0,d.jsxs)(n.td,{children:["Build combined docs tarball via ",(0,d.jsx)(n.code,{children:"pantavisor-docs"})," class, upload to S3"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"sync-pantavisor.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_call"})}),(0,d.jsx)(n.td,{children:"Mirror tag to pantavisor/pantavisor"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"onpush-scarthgap.yaml"})}),(0,d.jsx)(n.td,{children:"push to master"}),(0,d.jsx)(n.td,{children:"Build matrix for onpush machines"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"manual-scarthgap.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_dispatch"})}),(0,d.jsx)(n.td,{children:"Build any machine on demand"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"manual-pvtests.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_dispatch"})}),(0,d.jsx)(n.td,{children:"Build + run pvtests on demand"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"schedule-pvtests.yaml"})}),(0,d.jsx)(n.td,{children:"cron daily 02:00"}),(0,d.jsx)(n.td,{children:"Nightly build + full pvtest run"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"schedule-updates.yaml"})}),(0,d.jsx)(n.td,{children:"cron every 8 h"}),(0,d.jsx)(n.td,{children:"SRCREV bump PRs"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"schedule-updatemachines.yaml"})}),(0,d.jsx)(n.td,{children:"cron every 8 h + 15 min"}),(0,d.jsx)(n.td,{children:"kas config + workflow regen PRs"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"buildkas-upload.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_call"})}),(0,d.jsx)(n.td,{children:"Reusable: build + S3 upload (tag builds)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"buildkas-target.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_call"})}),(0,d.jsx)(n.td,{children:"Reusable: build + GitHub artifacts (dev builds)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"call-pvtests.yaml"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"workflow_call"})}),(0,d.jsx)(n.td,{children:"Reusable: run pvtests suite"})]})]})]}),"\n",(0,d.jsx)(n.h2,{id:"scripts",children:"Scripts"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Script"}),(0,d.jsx)(n.th,{children:"Purpose"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"makemachines"})}),(0,d.jsxs)(n.td,{children:["Flatten KAS config fragments into ",(0,d.jsx)(n.code,{children:"kas/build-configs/release/*.yaml"})]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"makeworkflows"})}),(0,d.jsxs)(n.td,{children:["Regenerate ",(0,d.jsx)(n.code,{children:"onpush-*"}),", ",(0,d.jsx)(n.code,{children:"manual-*"}),", and ",(0,d.jsx)(n.code,{children:"release.yaml"})," from ",(0,d.jsx)(n.code,{children:"machines.json"})]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"make-tag-matrix.py"})}),(0,d.jsxs)(n.td,{children:["Generate ",(0,d.jsx)(n.code,{children:"release.yaml"})," (build matrix + pvtests + summary)"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"make-onpush-matrix.py"})}),(0,d.jsxs)(n.td,{children:["Generate ",(0,d.jsx)(n.code,{children:"onpush-scarthgap.yaml"})]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"make-manual-dispat
1ch.py"})}),(0,d.jsxs)(n.td,{children:["Generate ",(0,d.jsx)(n.code,{children:"manual-scarthgap.yaml"})]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"makecommit"})}),(0,d.jsx)(n.td,{children:"Audit layer changes and draft PR description"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"update-components.sh"})}),(0,d.jsx)(n.td,{children:"Fetch latest SRCREVs for tracked components"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"upload.sh"})}),(0,d.jsxs)(n.td,{children:["Push build artifacts and update ",(0,d.jsx)(n.code,{children:"releases.json"})," on S3 (machine ",(0,d.jsx)(n.code,{children:"devices"})," entries)"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"upload-docs.py"})}),(0,d.jsxs)(n.td,{children:["Upload docs tarball to GitHub Release (",(0,d.jsx)(n.code,{children:"upload-asset"})," sub-command); separate ",(0,d.jsx)(n.code,{children:"trigger-ingest"})," sub-command exists but the workflow notifies ",(0,d.jsx)(n.code,{children:"docs.pantavisor"})," via a direct ",(0,d.jsx)(n.code,{children:"curl"})," ",(0,d.jsx)(n.code,{children:"repository_dispatch"})," instead"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"upload-badges"})}),(0,d.jsx)(n.td,{children:"Write per-machine badge JSON to S3 after a tag build"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"sync-pantavisor-tag.sh"})}),(0,d.jsxs)(n.td,{children:["Push the tag to ",(0,d.jsx)(n.code,{children:"pantavisor/pantavisor"})," via PAT"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"make-changelog.sh"})}),(0,d.jsx)(n.td,{children:"Render a CHANGELOG section for a given tag"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"update-readme-board.py"})}),(0,d.jsxs)(n.td,{children:["Regenerate the workflow status table in ",(0,d.jsx)(n.code,{children:"docs/ci/status.md"})]})]})]})]}),"\n",(0,d.jsx)(n.h2,{id:"runners-and-container",children:"Runners and Container"}),"\n",(0,d.jsxs)(n.p,{children:["All builds run on self-hosted runners inside the ",(0,d.jsx)(n.code,{children:"ghcr.io/pantacor/kas/kas:next-v7"})," container. Shared sstate-cache and download directories are mounted at ",(0,d.jsx)(n.code,{children:"/shared/sstate"})," and ",(0,d.jsx)(n.code,{children:"/shared/dldir"})," to speed up incremental builds. Summary and badge jobs run on GitHub-hosted ",(0,d.jsx)(n.code,{children:"ubuntu-latest"}),"."]}),"\n",(0,d.jsx)(n.h2,{id:"related-docs",children:"Related docs"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"/029-rc2/meta-pantavisor/ci/machines",children:"machines.md"})," \u2014 ",(0,d.jsx)(n.code,{children:"machines.json"})," schema, adding boards, workflow generation"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"/029-rc2/meta-pantavisor/ci/builds",children:"builds.md"})," \u2014 build engines, artifact types, S3 layout, pvtests"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"/029-rc2/meta-pantavisor/ci/changelog",children:"changelog.md"})," \u2014 changelog generator and release notes"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"/029-rc2/meta-pantavisor/ci/tag-sync",children:"tag-sync.md"})," \u2014 tag mirror to pantavisor/pantavisor"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"/029-rc2/meta-pantavisor/ci/status",children:"status.md"})," \u2014 live CI status badges"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"/029-rc2/meta-pantavisor/ci/versioning",children:"versioning.md"})," \u2014 dynamic DISTRO_VERSION generation"]}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(o,{...e})}):o(e)}},28453(e,n,s){s.d(n,{R:()=>t,x:()=>l});var r=s(96540);let d={},a=r.createContext(d);function t(e){let n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.