1"use strict";(self.webpackChunkwoodpecker=self.webpackChunkwoodpecker||[]).push([["3658"],{63128(e,n,r){r.r(n),r.d(n,{metadata:()=>d,default:()=>x,frontMatter:()=>i,contentTitle:()=>l,toc:()=>h,assets:()=>t});var d=JSON.parse('{"id":"development/architecture","title":"Architecture","description":"Package architecture","source":"@site/versioned_docs/version-2.8/92-development/05-architecture.md","sourceDirName":"92-development","slug":"/development/architecture","permalink":"/docs/2.8/development/architecture","draft":false,"unlisted":false,"editUrl":"https://github.com/woodpecker-ci/woodpecker/edit/main/docs/versioned_docs/version-2.8/92-development/05-architecture.md","tags":[],"version":"2.8","sidebarPosition":5,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Documentation","permalink":"/docs/2.8/development/docs"},"next":{"title":"Conventions","permalink":"/docs/2.8/development/conventions"}}'),c=r(94686),s=r(23191);let i={},l="Architecture",t={},h=[{value:"Package architecture",id:"package-architecture",level:2},{value:"System architecture",id:"system-architecture",level:2},{value:"main package hierarchy",id:"main-package-hierarchy",level:3},{value:"Server",id:"server",level:3},{value:"Agent",id:"agent",level:3},{value:"CLI",id:"cli",level:3}];function o(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"architecture",children:"Architecture"})}),"\n",(0,c.jsx)(n.h2,{id:"package-architecture",children:"Package architecture"}),"\n",(0,c.jsx)(n.p,{children:(0,c.jsx)(n.img,{alt:"Woodpecker architecture",src:r(30334).A+"",width:"1530",height:"1110"})}),"\n",(0,c.jsx)(n.h2,{id:"system-architecture",children:"System architecture"}),"\n",(0,c.jsx)(n.h3,{id:"main-package-hierarchy",children:"main package hierarchy"}),"\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,c.jsxs)(n.table,{children:[(0,c.jsx)(n.thead,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.th,{children:"package"}),(0,c.jsx)(n.th,{children:"meaning"}),(0,c.jsx)(n.th,{children:"imports"})]})}),(0,c.jsxs)(n.tbody,{children:[(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"cmd/**"})}),(0,c.jsx)(n.td,{children:"parse command-line args & environment to stat server/cli/agent"}),(0,c.jsx)(n.td,{children:"all other"})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"agent/**"})}),(0,c.jsx)(n.td,{children:"code only agent (remote worker) will need"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"pipeline"}),", ",(0,c.jsx)(n.code,{children:"shared"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"cli/**"})}),(0,c.jsx)(n.td,{children:"code only cli tool does need"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"pipeline"}),", ",(0,c.jsx)(n.code,{children:"shared"}),", ",(0,c.jsx)(n.code,{children:"woodpecker-go"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/**"})}),(0,c.jsx)(n.td,{children:"code only server will need"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"pipeline"}),", ",(0,c.jsx)(n.code,{children:"shared"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"shared/**"})}),(0,c.jsx)(n.td,{children:"code shared for all three main tools (go help utils)"}),(0,c.jsx)(n.td,{children:"only std and external libs"})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"woodpecker-go/**"})}),(0,c.jsx)(n.td,{children:"go client for server rest api"}),(0,c.jsx)(n.td,{children:"std"})]})]})]}),"\n",(0,c.jsx)(n.h3,{id:"server",children:"Server"}),"\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\n\n\n\n\n",(0,c.jsxs)(n.table,{children:[(0,c.jsx)(n.thead,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.th,{children:"package"}),(0,c.jsx)(n.th,{children:"meaning"}),(0,c.jsx)(n.th,{children:"imports"})]})}),(0,c.jsxs)(n.tbody,{children:[(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/api/**"})}),(0,c.jsxs)(n.td,{children:["handle web requests from ",(0,c.jsx)(n.code,{children:"server/router"})]}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"pipeline"}),", ",(0,c.jsx)(n.code,{children:"../badges"}),", ",(0,c.jsx)(n.code,{children:"../ccmenue"}),", ",(0,c.jsx)(n.code,{children:"../logging"}),", ",(0,c.jsx)(n.code,{children:"../model"}),", ",(0,c.jsx)(n.code,{children:"../pubsub"}),", ",(0,c.jsx)(n.code,{children:"../queue"}),", ",(0,c.jsx)(n.code,{children:"../forge"}),", ",(0,c.jsx)(n.code,{children:"../shared"}),", ",(0,c.jsx)(n.code,{children:"../store"}),", ",(0,c.jsx)(n.code,{children:"shared"}),", (TODO: mv ",(0,c.jsx)(n.code,{children:"server/router/middleware/session"}),")"]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/badges/**"})}),(0,c.jsx)(n.td,{children:"generate svg badges for pipelines"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"../model"})})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/ccmenu/**"})}),(0,c.jsx)(n.td,{children:"generate xml ccmenu for pipelines"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"../model"})})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/grpc/**"})}),(0,c.jsx)(n.td,{children:"gRPC server agents can connect to"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"pipeline/rpc/**"}),", ",(0,c.jsx)(n.code,{children:"../logging"}),", ",(0,c.jsx)(n.code,{children:"../model"}),", ",(0,c.jsx)(n.code,{children:"../pubsub"}),", ",(0,c.jsx)(n.code,{children:"../queue"}),", ",(0,c.jsx)(n.code,{children:"../forge"}),", ",(0,c.jsx)(n.code,{children:"../pipeline"}),", ",(0,c.jsx)(n.code,{children:"../store"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/logging/**"})}),(0,c.jsx)(n.td,{children:"logging lib for gPRC server to stream logs while running"}),(0,c.jsx)(n.td,{children:"std"})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/model/**"})}),(0,c.jsx)(n.td,{children:"structs for store (db) and api (json)"}),(0,c.jsx)(n.td,{children:"std"})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/plugins/**"})}),(0,c.jsx)(n.td,{children:"plugins for server"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"../model"}),", ",(0,c.jsx)(n.code,{children:"../forge"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/pipeline/**"})}
1),(0,c.jsx)(n.td,{children:"orchestrate pipelines"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"pipeline"}),", ",(0,c.jsx)(n.code,{children:"../model"}),", ",(0,c.jsx)(n.code,{children:"../pubsub"}),", ",(0,c.jsx)(n.code,{children:"../queue"}),", ",(0,c.jsx)(n.code,{children:"../forge"}),", ",(0,c.jsx)(n.code,{children:"../store"}),", ",(0,c.jsx)(n.code,{children:"../plugins"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/pubsub/**"})}),(0,c.jsx)(n.td,{children:"pubsub lib for server to push changes to the WebUI"}),(0,c.jsx)(n.td,{children:"std"})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/queue/**"})}),(0,c.jsx)(n.td,{children:"queue lib for server where agents pull new pipelines from via gRPC"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/model"})})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/forge/**"})}),(0,c.jsx)(n.td,{children:"forge lib for server to connect and handle forge specific stuff"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"shared"}),", ",(0,c.jsx)(n.code,{children:"server/model"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/router/**"})}),(0,c.jsx)(n.td,{children:"handle requests to REST API (and all middleware) and serve UI and WebUI config"}),(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"shared"}),", ",(0,c.jsx)(n.code,{children:"../api"}),", ",(0,c.jsx)(n.code,{children:"../model"}),", ",(0,c.jsx)(n.code,{children:"../forge"}),", ",(0,c.jsx)(n.code,{children:"../store"}),", ",(0,c.jsx)(n.code,{children:"../web"})]})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/store/**"})}),(0,c.jsx)(n.td,{children:"handle database"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/model"})})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/shared/**"})}),(0,c.jsxs)(n.td,{children:["TODO: move and split ",(0,c.jsx)(n.a,{href:"https://github.com/woodpecker-ci/woodpecker/issues/974",children:"#974"})]}),(0,c.jsx)(n.td,{})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"server/web/**"})}),(0,c.jsx)(n.td,{children:"server SPA"}),(0,c.jsx)(n.td,{})]})]})]}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"../"})," = ",(0,c.jsx)(n.code,{children:"server/"})]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"agent",children:"Agent"}),"\n",(0,c.jsx)(n.p,{children:"TODO"}),"\n",(0,c.jsx)(n.h3,{id:"cli",children:"CLI"}),"\n",(0,c.jsx)(n.p,{children:"TODO"})]})}function x(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}},30334(e,n,r){r.d(n,{A:()=>d});let d=r.p+"assets/images/woodpecker-architecture-3929270c89a1fbf3a72f17aff8bd23e5.png"},23191(e,n,r){r.d(n,{R:()=>i,x:()=>l});var d=r(92990);let c={},s=d.createContext(c);function i(e){let n=d.useContext(s);return d.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(c):e.components||c:i(e.components),d.createElement(s.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.