PageSourceSearch

https://cnoe.io/assets/js/bd2d18ae.7e5508fa.js

js cnoe.io collected 2026-10-02 14:44:15 UTC 13,842 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkcnoe=self.webpackChunkcnoe||[]).push([[3330],{2117:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/my-app-repo-bb4d8740fb103272bb6fc355d14260f5.png"},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>c});var s=i(96540);const n={},a=s.createContext(n);function r(e){const t=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(a.Provider,{value:t},e.children)}},28726:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/my-app-4fd46870df4fab797e1b7f7862bebace.png"},64288:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"tutorials/idpbuilder/idpbuilder-stack","title":"Use IDPBuilder Stacks","description":"Use IDPBuilder Stacks","source":"@site/docs/tutorials/idpbuilder/idpbuilder-stack.md","sourceDirName":"tutorials/idpbuilder","slug":"/tutorials/idpbuilder/idpbuilder-stack","permalink":"/docs/tutorials/idpbuilder/idpbuilder-stack","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2.1,"frontMatter":{"sidebar_position":2.1,"description":"Use IDPBuilder Stacks","title":"Use IDPBuilder Stacks"},"sidebar":"tutorialSidebar","previous":{"title":"Customizing idpbuilder","permalink":"/docs/idpbuilder/override"},"next":{"title":"Create GO App with S3 Bucket","permalink":"/docs/tutorials/aws/app-with-aws-resources"}}');var n=i(74848),a=i(28453);const r={sidebar_position:2.1,description:"Use IDPBuilder Stacks",title:"Use IDPBuilder Stacks"},c=void 0,o={},l=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Specifiy stack",id:"specifiy-stack",level:2},{value:"CNOE IDP stacks available",id:"cnoe-idp-stacks-available",level:3},{value:"Create a basic CNOE idp stack",id:"create-a-basic-cnoe-idp-stack",level:3}];function d(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",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,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:'A Stack is a collection of packages (or open source components) that should be included in an Internal Developer Platform (IDP). We ensure that these components are installed in the IDP using Argo CD applications. It works in tandem with Idpbuilder, where the Stack specifies "what" needs to be installed while Idpbuilder handles "how" to install it. To distinguish it from general technology stacks, it\'s specifically referred to as a "CNOE IDP stack" or "IDP stack."'}),"\n",(0,n.jsx)(t.p,{children:"Each Stack can contain varying numbers of packages, where each package is associated with an Argo CD application which syncs the package on the IDP cluster. For example, one stack might include 4 packages while another might contain 10, depending on specific requirements. The stack implementation supports two primary integration mechanisms: local integration, which works with local files pushed into a Git repository using the 'kube' scheme, and remote integration, which can reference external repositories such as Helm charts."}),"\n",(0,n.jsx)(t.p,{children:"This decoupled approach provides flexibility in that anyone can create their own custom stack based on new technologies not captured in existing stacks, and these can be published in the stacks repository for others to use."}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(t.p,{children:"Ensure you have completed the following setup"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Complete the ",(0,n.jsx)(t.a,{href:"/docs/reference-implementation/local/#prerequisites",children:"idp Reference Prerequisite setup"})]}),"\n",(0,n.jsxs)(t.li,{children:["Complete the ",(0,n.jsx)(t.a,{href:"/docs/reference-implementation/local/#installation",children:"idp Reference Installation setup"})]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"specifiy-stack",children:"Specifiy stack"}),"\n",(0,n.jsxs)(t.p,{children:["Idpbuilder supports adding stack by specifying custom packages using the flag ",(0,n.jsx)(t.code,{children:"-p"})," flag. This flag expects a directory (local or remote) containing ArgoCD application files and / or ArgoCD application set files. In case of a remote directory, it must be a directory in a git repository, and the URL format must be a ",(0,n.jsx)(t.a,{href:"https://github.com/kubernetes-sigs/kustomize/blob/master/examples/remoteBuild.md",children:"kustomize remote URL format"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"cnoe-idp-stacks-available",children:"CNOE IDP stacks available"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"CNOE idp Stack"}),(0,n.jsx)(t.th,{children:"Maintainer"}),(0,n.jsx)(t.th,{children:"Repository Location"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Localstack"}),(0,n.jsx)(t.td,{children:"CNOE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/localstack-integration",children:"stacks/localstack-integration/"})}),(0,n.jsx)(t.td,{children:"Deploys an IDP reference implementation with an Argo application that adds Localstack, as well as integrating with Crossplane."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Local Backup"}),(0,n.jsx)(t.td,{children:"CNOE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/blob/main/local-backup",children:"stacks/local-backup/"})}),(0,n.jsx)(t.td,{children:"creates a configuration that allows you to back up Kubernetes objects to your local machine (or wherever you are running idpbuilder from)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Terraform Integrations"}),(0,n.jsx)(t.td,{children:"CNOE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/terraform-integrations",children:"stacks/terraform-integrations/"})}),(0,n.jsx)(t.td,{children:'The deployment automation capabilities of this stack include automated syncing of Terraform configuration from a Git repository using the FluxCD source repository controller, and a custom "tofu-controller" that manages the full lifecycle of Terraform deployments directly from the Kubernetes cluster.'})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Dapr Integrations"}),(0,n.jsx)(t.td,{children:"CNOE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/dapr-integration",children:"stacks/dapr-integration/"})}),(0,n.jsx)(t.td,{children:"provides a Dapr integration for the idpBuilder tool, allowing users to easily deploy a Dapr control plane, state store, and pub/sub components along with a Redis instance to supp
1ort them."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Crossplane Integrations"}),(0,n.jsx)(t.td,{children:"CNOE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/crossplane-integrations",children:"stacks/crossplane-integrations/"})}),(0,n.jsx)(t.td,{children:"provides a way to deploy applications with cloud resources using Backstage templates, where the cloud resources are managed and provisioned by Crossplane, a Kubernetes-native control plane for cloud services."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Istio-Ambient Stack"}),(0,n.jsx)(t.td,{children:"Community"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/istio-ambient",children:"stacks/istio-ambient/"})}),(0,n.jsx)(t.td,{children:"installs the Istio Ambient mesh and supporting observability tools to monitor traffic, metrics, and traces."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Jupyterhub Stack"}),(0,n.jsx)(t.td,{children:"Community"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/jupyterhub",children:"stacks/jupyterhub/"})}),(0,n.jsx)(t.td,{children:"deploys a JupyterHub instance that is integrated with Keycloak for single sign-on (SSO) authentication."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Kyverno Stack"}),(0,n.jsx)(t.td,{children:"Community"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/kyverno-integration",children:"stacks/kyverno-integration/"})}),(0,n.jsx)(t.td,{children:"implements Kyverno, a Kubernetes native policy management engine, to provide policy enforcement and audit capabilities for a Kubernetes platform."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"vcluster multi-env"}),(0,n.jsx)(t.td,{children:"Community"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/vcluster-multi-env",children:"stacks/vcluster-multi-env/"})}),(0,n.jsx)(t.td,{children:"creates a multi-environment emulation setup on top of CNOE, allowing you to easily manage and enroll multiple vClusters (e.g. staging and production) in your ArgoCD deployment."})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"create-a-basic-cnoe-idp-stack",children:"Create a basic CNOE idp stack"}),"\n",(0,n.jsxs)(t.p,{children:["Let's take a look at ",(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/basic",children:"this example"}),". This defines two custom package directories to deploy to the cluster."]}),"\n",(0,n.jsx)(t.p,{children:"To deploy these packages, run the following command:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./idpbuilder create \\\n  -p https://github.com/cnoe-io/stacks//basic/package1 \\\n  -p https://github.com/cnoe-io/stacks//basic/package2\n"})}),"\n",(0,n.jsx)(t.p,{children:"Alternatively, you can use the local directory format."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"# clone the stacks repository\n$ git clone https://github.com/cnoe-io/stacks.git\n$ cd stacks\n# run idpbuilder against the local directory\n$ ./idpbuilder create \\\n  -p examples/basic/package1\\\n  -p examples/basic/package2\n"})}),"\n",(0,n.jsx)(t.p,{children:"Running this command should create three additional ArgoCD applications in your cluster."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ kubectl get Applications -n argocd  -l example=basic\nNAME         SYNC STATUS   HEALTH STATUS\nguestbook    Synced        Healthy\nguestbook2   Synced        Healthy\nmy-app       Synced        Healthy\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Let's break this down. The ",(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/basic/package1",children:"first package directory"})," defines an application. This corresponds to the ",(0,n.jsx)(t.code,{children:"my-app"})," application above. In this application, we want to deploy manifests from local machine in GitOps way."]}),"\n",(0,n.jsxs)(t.p,{children:["The directory contains an ",(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/blob/main/basic/package1/app.yaml",children:"ArgoCD application file"}),".  This is a normal ArgoCD application file except for one field."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"apiVersion: argoproj.io/v1alpha1\nkind: Application\nspec:\n  source:\n    repoURL: cnoe://manifests\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"cnoe://"})," prefix in the ",(0,n.jsx)(t.code,{children:"repoURL"})," field indicates that we want to sync from a local directory.\nValues after ",(0,n.jsx)(t.code,{children:"cnoe://"})," is treated as a relative path from this file. In this example,\nwe are instructing idpbuilder to make ArgoCD sync from files in the ",(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/basic/package1/manifests",children:"manifests directory"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"As a result the following actions were taken by idpbuilder:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Create a Gitea repository."}),"\n",(0,n.jsx)(t.li,{children:"Fill the repository with contents from the manifests directory."}),"\n",(0,n.jsx)(t.li,{children:"Update the Application spec to use the newly created repository."}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["You can verify this by going to this address in your browser: ",(0,n.jsx)(t.a,{href:"https://gitea.cnoe.localtest.me:8443/giteaAdmin/idpbuilder
1-localdev-my-app-manifests",children:"https://gitea.cnoe.localtest.me:8443/giteaAdmin/idpbuilder-localdev-my-app-manifests"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"img.png",src:i(2117).A+"",width:"1003",height:"384"})}),"\n",(0,n.jsxs)(t.p,{children:["This is the repository that corresponds to the ",(0,n.jsx)(t.a,{href:"https://github.com/cnoe-io/stacks/tree/main/basic/package1/manifests",children:"manifests"})," folder.\nIt contains a file called ",(0,n.jsx)(t.code,{children:"alpine.yaml"}),", synced from the ",(0,n.jsx)(t.code,{children:"manifests"})," directory above."]}),"\n",(0,n.jsxs)(t.p,{children:["You can also view the updated Application spec by going to this address: ",(0,n.jsx)(t.a,{href:"https://argocd.cnoe.localtest.me:8443/applications/argocd/my-app",children:"https://argocd.cnoe.localtest.me:8443/applications/argocd/my-app"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"myapp",src:i(28726).A+"",width:"1065",height:"405"})}),"\n",(0,n.jsx)(t.p,{children:"The second package directory defines two normal ArgoCD applications referencing a remote repository.\nThey are applied as-is."})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}}}]);

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.