[{"data":1,"prerenderedAt":1311},["ShallowReactive",2],{"/blog/gko-on-ocp":3,"navigation-en-us":524,"banner-en-us":951,"footer-en-us":961,"blog-post-authors-en-us-Cesar Saavedra":1206,"blog-related-posts-en-us-gko-on-ocp":1221,"blog-promotions-en-us":1247,"next-steps-en-us":1301},{"id":4,"title":5,"authors":6,"body":8,"category":502,"date":503,"description":504,"extension":505,"externalUrl":506,"faq":506,"featured":507,"heroImage":508,"meta":509,"navigation":510,"path":511,"seo":512,"slug":516,"stem":517,"tags":518,"template":522,"updatedDate":506,"__hash__":523},"blogPosts/en-us/blog/gko-on-ocp.md","How to install and use the GitLab Kubernetes Operator",[7],"Cesar Saavedra",{"type":9,"value":10,"toc":494},"minimark",[11,15,20,23,27,30,38,41,48,51,58,61,68,75,78,85,88,95,98,175,178,185,188,195,198,202,205,359,362,369,372,379,382,388,391,398,401,408,413,417,420,425,428,435,438,442,452,456,490],[12,13,14],"p",{},"The GitLab Kubernetes Operator was released on October 12, 2021.",[16,17,19],"h2",{"id":18},"what-is-the-gitlab-kubernetes-operator","What is the GitLab Kubernetes Operator?",[12,21,22],{},"The GitLab Operator allows you to install and run an instance of GitLab in a vanilla Kubernetes or OpenShift cluster. Kubernetes operators increase the reliability and availability of your applications by automating Day 2 operations such as upgrading components, management of data integrity, application reconfiguration, automatic recovery from a failure, and autoscaling.",[16,24,26],{"id":25},"installing-the-gitlab-kubernetes-operator-on-an-openshift-container-platform-cluster","Installing the GitLab Kubernetes Operator on an OpenShift Container Platform cluster",[12,28,29],{},"In this short post, we show you how to install and run the GitLab Operator to create a GitLab instance on an OpenShift Container Platform cluster, which we have already preinstalled:",[12,31,32,37],{},[33,34],"img",{"alt":35,"src":36},"OCP console","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398448/blog/Content%20Images/gko-on-ocp/0-ocp-console.png","\nThe OpenShift Container Platform console",[12,39,40],{},"Inspecting the running pods of the OpenShift cluster, we see that Prometheus is already being used as the metrics server, which is a prerequisite for the installation of the GitLab Operator:",[12,42,43,47],{},[33,44],{"alt":45,"src":46},"Prometheus up and running","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398448/blog/Content%20Images/gko-on-ocp/1-prometheus-up.png","\nPrometheus up and running on cluster",[12,49,50],{},"Also, we verify that the gitlab-system namespace does not yet exist:",[12,52,53,57],{},[33,54],{"alt":55,"src":56},"gitlab namespace not present","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398449/blog/Content%20Images/gko-on-ocp/2-no-gitlab-sys-namespace.png","\ngitlab-system namespace non-existent",[12,59,60],{},"Another prerequisite is cert-manager, which automates the management and issuance of TLS certificates. Let’s use the OpenShift OperatorHub to install and instantiate an instance of cert-manager. We first verify that one is not running. Then we head to the OperatorHub and install the cert-manager Operator:",[12,62,63,67],{},[33,64],{"alt":65,"src":66},"cert-manager in OperatorHub","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398449/blog/Content%20Images/gko-on-ocp/3-cert-mgr-in-operatorhub.png","\nInstalling cert-manager using its operator in OperatorHub",[12,69,70,74],{},[71,72,73],"strong",{},"NOTE:"," Once the GitLab Kubernetes Operator is certified with OpenShift, it will have its own tile in the OperatorHub.",[12,76,77],{},"Then we create an instance of cert-manager by using its newly installed operator:",[12,79,80,84],{},[33,81],{"alt":82,"src":83},"cert-manager instance creation","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398450/blog/Content%20Images/gko-on-ocp/4-create-instance-cert-mgr.png","\nCreating an instance of cert-manager using its operator",[12,86,87],{},"In preparation of the GitLab Operator installation, we create the namespace gitlab-system, under which all of the GitLab resources will be:",[12,89,90,94],{},[33,91],{"alt":92,"src":93},"gitlab-system namespace creation","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398451/blog/Content%20Images/gko-on-ocp/5-create-gitlab-sys-namespace.png","\nCreating the gitlab-system namespace",[12,96,97],{},"To install the GitLab Operator, we define two environment variables: one is to set the version of the GitLab Operator we want to use and the other one is to set the platform for which we are targeting the Operator. In this case, it is OpenShift. We then apply the GitLab Operator Custom Resource Definition or CRD to the cluster, which creates the operator, by entering the following command:",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-shell shiki shiki-themes github-light","export GL_OPERATOR_VERSION=\"0.1.0\"\nexport PLATFORM=\"openshift\"\nkubectl apply -f https://gitlab.com/api/v4/projects/18899486/packages/generic/gitlab-operator/${GL_OPERATOR_VERSION}/gitlab-operator-${PLATFORM}-${GL_OPERATOR_VERSION}.yaml\n","shell","",[106,107,108,128,141],"code",{"__ignoreMap":104},[109,110,113,117,121,124],"span",{"class":111,"line":112},"line",1,[109,114,116],{"class":115},"sD7c4","export",[109,118,120],{"class":119},"sgsFI"," GL_OPERATOR_VERSION",[109,122,123],{"class":115},"=",[109,125,127],{"class":126},"sYBdl","\"0.1.0\"\n",[109,129,131,133,136,138],{"class":111,"line":130},2,[109,132,116],{"class":115},[109,134,135],{"class":119}," PLATFORM",[109,137,123],{"class":115},[109,139,140],{"class":126},"\"openshift\"\n",[109,142,144,148,151,155,158,161,164,167,170,172],{"class":111,"line":143},3,[109,145,147],{"class":146},"s7eDp","kubectl",[109,149,150],{"class":126}," apply",[109,152,154],{"class":153},"sYu0t"," -f",[109,156,157],{"class":126}," https://gitlab.com/api/v4/projects/18899486/packages/generic/gitlab-operator/",[109,159,160],{"class":119},"${GL_OPERATOR_VERSION}",[109,162,163],{"class":126},"/gitlab-operator-",[109,165,166],{"class":119},"${PLATFORM}",[109,168,169],{"class":126},"-",[109,171,160],{"class":119},[109,173,174],{"class":126},".yaml\n",[12,176,177],{},"And here's is an example screenshot of what the output of this command would be like:",[12,179,180,184],{},[33,181],{"alt":182,"src":183},"application of the CRD to the cluster","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398451/blog/Content%20Images/gko-on-ocp/6-applying-the-crd.png","\nApplying the GitLab Kubernetes Operator to the OpenShift cluster",[12,186,187],{},"As we watch the pods in the gitlab-system namespace, we see the creation of two pods for the gitlab-controller-manager:",[12,189,190,194],{},[33,191],{"alt":192,"src":193},"operator pods","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398451/blog/Content%20Images/gko-on-ocp/7-watching-operator-pods-creation.png","\nGitLab Kubernetes Operator pods being created on the OpenShift cluster",[12,196,197],{},"The GitLab Kubernetes Operator is now installed on the OpenShift Container Platform cluster. Next, we need to use this newly installed operator to create an instance of GitLab.",[16,199,201],{"id":200},"creating-a-gitlab-instance-on-the-cluster-using-the-gitlab-kubernetes-operator","Creating a GitLab instance on the cluster using the GitLab Kubernetes Operator",[12,203,204],{},"To create an instance of GitLab, we create a Custom Resource file called mygitlab.yaml to provide information, such as domain name and certmanager issuer email, for the GitLab Operator to use during the creation of the GitLab instance. Here is a parameterized example of the contents for this file:",[99,206,210],{"className":207,"code":208,"language":209,"meta":104,"style":104},"language-yaml shiki shiki-themes github-light","apiVersion: apps.gitlab.com/v1beta1\nkind: GitLab\nmetadata:\n  name: gitlab\nspec:\n  chart:\n    version: \"[REPLACE WITH THE CHART VERSION]\"\n    values:\n      global:\n        hosts:\n          domain: [REPLACE WITH YOUR DOMAIN NAME]\n        ingress:\n          configureCertmanager: true\n      certmanager-issuer:\n        email: [REPLACE WITH YOUR EMAIL]\n\n","yaml",[106,211,212,224,234,242,253,261,269,280,288,296,304,319,327,338,346],{"__ignoreMap":104},[109,213,214,218,221],{"class":111,"line":112},[109,215,217],{"class":216},"shJU0","apiVersion",[109,219,220],{"class":119},": ",[109,222,223],{"class":126},"apps.gitlab.com/v1beta1\n",[109,225,226,229,231],{"class":111,"line":130},[109,227,228],{"class":216},"kind",[109,230,220],{"class":119},[109,232,233],{"class":126},"GitLab\n",[109,235,236,239],{"class":111,"line":143},[109,237,238],{"class":216},"metadata",[109,240,241],{"class":119},":\n",[109,243,245,248,250],{"class":111,"line":244},4,[109,246,247],{"class":216},"  name",[109,249,220],{"class":119},[109,251,252],{"class":126},"gitlab\n",[109,254,256,259],{"class":111,"line":255},5,[109,257,258],{"class":216},"spec",[109,260,241],{"class":119},[109,262,264,267],{"class":111,"line":263},6,[109,265,266],{"class":216},"  chart",[109,268,241],{"class":119},[109,270,272,275,277],{"class":111,"line":271},7,[109,273,274],{"class":216},"    version",[109,276,220],{"class":119},[109,278,279],{"class":126},"\"[REPLACE WITH THE CHART VERSION]\"\n",[109,281,283,286],{"class":111,"line":282},8,[109,284,285],{"class":216},"    values",[109,287,241],{"class":119},[109,289,291,294],{"class":111,"line":290},9,[109,292,293],{"class":216},"      global",[109,295,241],{"class":119},[109,297,299,302],{"class":111,"line":298},10,[109,300,301],{"class":216},"        hosts",[109,303,241],{"class":119},[109,305,307,310,313,316],{"class":111,"line":306},11,[109,308,309],{"class":216},"          domain",[109,311,312],{"class":119},": [",[109,314,315],{"class":126},"REPLACE WITH YOUR DOMAIN NAME",[109,317,318],{"class":119},"]\n",[109,320,322,325],{"class":111,"line":321},12,[109,323,324],{"class":216},"        ingress",[109,326,241],{"class":119},[109,328,330,333,335],{"class":111,"line":329},13,[109,331,332],{"class":216},"          configureCertmanager",[109,334,220],{"class":119},[109,336,337],{"class":153},"true\n",[109,339,341,344],{"class":111,"line":340},14,[109,342,343],{"class":216},"      certmanager-issuer",[109,345,241],{"class":119},[109,347,349,352,354,357],{"class":111,"line":348},15,[109,350,351],{"class":216},"        email",[109,353,312],{"class":119},[109,355,356],{"class":126},"REPLACE WITH YOUR EMAIL",[109,358,318],{"class":119},[12,360,361],{},"And here is an example screenshot of what this file would look like with actual values for the parameters:",[12,363,364,368],{},[33,365],{"alt":366,"src":367},"creating-gitlab-yaml-file","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398452/blog/Content%20Images/gko-on-ocp/8-creating-mygitlab-yaml.png","\nCreating mygitlab.yaml, the custom resource file",[12,370,371],{},"We then apply the Custom Resource to the cluster. This action will kickstart the creation of all the pods needed for the instantiation of a GitLab instance on the cluster:",[12,373,374,378],{},[33,375],{"alt":376,"src":377},"applying the custom resource to the cluster","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398452/blog/Content%20Images/gko-on-ocp/9-applying-the-cr.png","\nApplying the custom resource file to the cluster",[12,380,381],{},"After a few minutes, when the GitLab instance is up and running, we obtain its external IP address from the nginx ingress controller installed by the GitLab Operator by entering the following command:",[383,384,385],"blockquote",{},[12,386,387],{},"kubectl -n gitlab-system get services -o wide gitlab-nginx-ingress-controller",[12,389,390],{},"Here's an example screenshot of its output:",[12,392,393,397],{},[33,394],{"alt":395,"src":396},"getting the external ip","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398448/blog/Content%20Images/gko-on-ocp/10-get-external-ip.png","\nObtaining the external IP address for our newly created GitLab instance",[12,399,400],{},"We use this IP address to create DNS A records to map the DNS names of three (minio, registry, and gitlab) of the GitLab instance subsystems to it. Here is a snapshot for the gitlab one (you need to do the same for the minio and registry subsystems):",[12,402,403,407],{},[33,404],{"alt":405,"src":406},"creating dns record","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398448/blog/Content%20Images/gko-on-ocp/11-creating-dns-record.png","\nCreating DNS A record for the gitlab subsystem",[12,409,410,412],{},[71,411,73],{}," I owned the domain ocpgitlab.com. You would use a domain that you own.",[16,414,416],{"id":415},"logging-in-to-the-newly-created-instance-running-on-the-openshift-container-platform-cluster","Logging in to the newly created instance running on the OpenShift Container Platform cluster",[12,418,419],{},"Before logging in to our newly created GitLab instance running on OpenShift Container Platform, we need to obtain the initial root password, which is a secret stored under the gitlab-system namespace. You obtain the initial root password for the newly created GitLab instance by entering the following command:",[383,421,422],{},[12,423,424],{},"kubectl -n gitlab-system get secret gitlab-gitlab-initial-root-password -ojsonpath='{.data.password}' | base64 --decode ; echo",[12,426,427],{},"At this moment, we can point our browser to our newly created GitLab instance on OpenShift and login as root:",[12,429,430,434],{},[33,431],{"alt":432,"src":433},"logging in to GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398448/blog/Content%20Images/gko-on-ocp/13-log-in-to-gitlab.png","\nLogging in to the newly created GitLab instance running on the OpenShift Container Platform cluster",[12,436,437],{},"That’s it!",[16,439,441],{"id":440},"conclusion","Conclusion",[12,443,444,445,451],{},"We have shown you how to install and run the GitLab Operator to create a GitLab instance on an OpenShift Container Platform cluster. View ",[446,447,450],"a",{"href":448,"rel":449},"https://youtu.be/sEBnuhzYD2I",[],"this demo"," to see how this feature works.",[16,453,455],{"id":454},"read-more-on-kubernetes","Read more on Kubernetes",[457,458,459,466,472,478,484],"ul",{},[460,461,462],"li",{},[446,463,465],{"href":464},"/blog/threat-modeling-kubernetes-agent/","Threat modeling the Kubernetes Agent: from MVC to continuous improvement",[460,467,468],{},[446,469,471],{"href":470},"/blog/setting-up-the-k-agent/","How to deploy the GitLab Agent for Kubernetes with limited permissions",[460,473,474],{},[446,475,477],{"href":476},"/blog/gitlab-kubernetes-agent-on-gitlab-com/","A new era of Kubernetes integrations on GitLab.com",[460,479,480],{},[446,481,483],{"href":482},"/blog/kubernetes-terminology/","Understand Kubernetes terminology from namespaces to pods",[460,485,486],{},[446,487,489],{"href":488},"/blog/year-of-kubernetes/","What we learned after a year of GitLab.com on Kubernetes",[491,492,493],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":104,"searchDepth":130,"depth":130,"links":495},[496,497,498,499,500,501],{"id":18,"depth":130,"text":19},{"id":25,"depth":130,"text":26},{"id":200,"depth":130,"text":201},{"id":415,"depth":130,"text":416},{"id":440,"depth":130,"text":441},{"id":454,"depth":130,"text":455},"engineering","2021-11-16","Follow these step-by-step instructions to set up the GitLab Kubernetes Operator on a Kubernetes cluster.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682191/Blog/Hero%20Images/GKO-Thumbnail.png",{},true,"/en-us/blog/gko-on-ocp",{"title":5,"description":504,"ogTitle":5,"ogDescription":504,"noIndex":507,"ogImage":508,"ogUrl":513,"ogSiteName":514,"ogType":515,"canonicalUrls":513},"https://about.gitlab.com/blog/gko-on-ocp","https://about.gitlab.com","article","gko-on-ocp","en-us/blog/gko-on-ocp",[519,520,521],"kubernetes","features","integrations","BlogPost","5N_wxM6bMFMzmbVFrc6Lguud_BmzS5NX-I5weHH_U5U",{"logo":525,"freeTrial":530,"sales":535,"login":540,"items":545,"search":871,"minimal":902,"duo":921,"switchNav":930,"pricingDeployment":941},{"config":526},{"href":527,"dataGaName":528,"dataGaLocation":529},"/","gitlab logo","header",{"text":531,"config":532},"Get free trial",{"href":533,"dataGaName":534,"dataGaLocation":529},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":536,"config":537},"Request a demo",{"href":538,"dataGaName":539,"dataGaLocation":529},"/sales/?contact-topic=request-demo","sales",{"text":541,"config":542},"Sign in",{"href":543,"dataGaName":544,"dataGaLocation":529},"https://gitlab.com/users/sign_in/","sign in",[546,575,675,680,793,849],{"text":547,"config":548,"menu":550},"Platform",{"dataNavLevelOne":549},"platform",{"type":551,"columns":552},"cards",[553,559,567],{"title":547,"description":554,"link":555},"The intelligent orchestration platform for DevSecOps",{"text":556,"config":557},"Explore our Platform",{"href":558,"dataGaName":549,"dataGaLocation":529},"/platform/",{"title":560,"description":561,"link":562},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":563,"config":564},"Meet GitLab Duo",{"href":565,"dataGaName":566,"dataGaLocation":529},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":568,"description":569,"link":570},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":571,"config":572},"Learn more",{"href":573,"dataGaName":574,"dataGaLocation":529},"/why-gitlab/","why gitlab",{"text":576,"left":510,"config":577,"menu":579},"Product",{"dataNavLevelOne":578},"solutions",{"type":580,"link":581,"columns":585,"feature":654},"lists",{"text":582,"config":583},"View all Solutions",{"href":584,"dataGaName":578,"dataGaLocation":529},"/solutions/",[586,610,633],{"title":587,"description":588,"link":589,"items":594},"Automation","CI/CD and automation to accelerate deployment",{"config":590},{"icon":591,"href":592,"dataGaName":593,"dataGaLocation":529},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[595,599,602,606],{"text":596,"config":597},"CI/CD",{"href":598,"dataGaLocation":529,"dataGaName":596},"/solutions/continuous-integration/",{"text":560,"config":600},{"href":565,"dataGaLocation":529,"dataGaName":601},"gitlab duo agent platform - product menu",{"text":603,"config":604},"Source Code Management",{"href":605,"dataGaLocation":529,"dataGaName":603},"/solutions/source-code-management/",{"text":607,"config":608},"Automated Software Delivery",{"href":592,"dataGaLocation":529,"dataGaName":609},"Automated software delivery",{"title":611,"description":612,"link":613,"items":618},"Security","Deliver code faster without compromising security",{"config":614},{"href":615,"dataGaName":616,"dataGaLocation":529,"icon":617},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[619,623,628],{"text":620,"config":621},"Application Security Testing",{"href":615,"dataGaName":622,"dataGaLocation":529},"Application security testing",{"text":624,"config":625},"Software Supply Chain Security",{"href":626,"dataGaLocation":529,"dataGaName":627},"/solutions/supply-chain/","Software supply chain security",{"text":629,"config":630},"Software Compliance",{"href":631,"dataGaName":632,"dataGaLocation":529},"/solutions/software-compliance/","software compliance",{"title":634,"link":635,"items":640},"Measurement",{"config":636},{"icon":637,"href":638,"dataGaName":639,"dataGaLocation":529},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[641,645,649],{"text":642,"config":643},"Visibility & Measurement",{"href":638,"dataGaLocation":529,"dataGaName":644},"Visibility and Measurement",{"text":646,"config":647},"Value Stream Management",{"href":648,"dataGaLocation":529,"dataGaName":646},"/solutions/value-stream-management/",{"text":650,"config":651},"Analytics & Insights",{"href":652,"dataGaLocation":529,"dataGaName":653},"/solutions/analytics-and-insights/","Analytics and insights",{"title":655,"type":580,"items":656},"GitLab for",[657,663,669],{"text":658,"config":659},"Enterprise",{"icon":660,"href":661,"dataGaLocation":529,"dataGaName":662},"Building","/enterprise/","enterprise",{"text":664,"config":665},"Small Business",{"icon":666,"href":667,"dataGaLocation":529,"dataGaName":668},"Work","/small-business/","small business",{"text":670,"config":671},"Public Sector",{"icon":672,"href":673,"dataGaLocation":529,"dataGaName":674},"Organization","/solutions/public-sector/","public sector",{"text":676,"config":677},"Pricing",{"href":678,"dataGaName":679,"dataGaLocation":529,"dataNavLevelOne":679},"/pricing/","pricing",{"text":681,"config":682,"menu":684},"Resources",{"dataNavLevelOne":683},"resources",{"type":580,"link":685,"columns":689,"feature":782},{"text":686,"config":687},"View all resources",{"href":688,"dataGaName":683,"dataGaLocation":529},"/resources/",[690,722,749],{"title":691,"items":692},"Getting started",[693,698,703,708,713,718],{"text":694,"config":695},"Install",{"href":696,"dataGaName":697,"dataGaLocation":529},"/install/","install",{"text":699,"config":700},"Quick start guides",{"href":701,"dataGaName":702,"dataGaLocation":529},"/get-started/","quick setup checklists",{"text":704,"config":705},"Learn",{"href":706,"dataGaLocation":529,"dataGaName":707},"https://university.gitlab.com/","learn",{"text":709,"config":710},"Product documentation",{"href":711,"dataGaName":712,"dataGaLocation":529},"https://docs.gitlab.com/","product documentation",{"text":714,"config":715},"Best practice videos",{"href":716,"dataGaName":717,"dataGaLocation":529},"/getting-started-videos/","best practice videos",{"text":719,"config":720},"Integrations",{"href":721,"dataGaName":521,"dataGaLocation":529},"/integrations/",{"title":723,"items":724},"Discover",[725,730,735,740,744],{"text":726,"config":727},"Customer success stories",{"href":728,"dataGaName":729,"dataGaLocation":529},"/customers/","customer success stories",{"text":731,"config":732},"Blog",{"href":733,"dataGaName":734,"dataGaLocation":529},"/blog/","blog",{"text":736,"config":737},"Demo Hub",{"href":738,"dataGaName":739,"dataGaLocation":529},"/demo-hub/","demo hub",{"text":741,"config":742},"The Source",{"href":743,"dataGaName":734,"dataGaLocation":529},"/the-source/",{"text":745,"config":746},"Remote",{"href":747,"dataGaName":748,"dataGaLocation":529},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":750,"items":751},"Connect",[752,757,762,767,772,777],{"text":753,"config":754},"GitLab Services",{"href":755,"dataGaName":756,"dataGaLocation":529},"/services/","services",{"text":758,"config":759},"Contribute",{"href":760,"dataGaName":761,"dataGaLocation":529},"https://contributors.gitlab.com","contribute",{"text":763,"config":764},"Community",{"href":765,"dataGaName":766,"dataGaLocation":529},"/community/","community",{"text":768,"config":769},"Forum",{"href":770,"dataGaName":771,"dataGaLocation":529},"https://forum.gitlab.com/","forum",{"text":773,"config":774},"Events",{"href":775,"dataGaName":776,"dataGaLocation":529},"/events/","events",{"text":778,"config":779},"Partners",{"href":780,"dataGaName":781,"dataGaLocation":529},"/partners/","partners",{"config":783,"title":786,"text":787,"link":788},{"background":784,"textColor":785},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":789,"config":790},"Read the latest",{"href":791,"dataGaName":792,"dataGaLocation":529},"/whats-new/","whats new",{"text":794,"config":795,"menu":797},"Company",{"dataNavLevelOne":796},"company",{"type":580,"columns":798},[799],{"items":800},[801,806,812,814,819,824,829,834,839,844],{"text":802,"config":803},"About",{"href":804,"dataGaName":805,"dataGaLocation":529},"/company/","about",{"text":807,"config":808,"footerGa":811},"Jobs",{"href":809,"dataGaName":810,"dataGaLocation":529},"/jobs/","jobs",{"dataGaName":810},{"text":773,"config":813},{"href":775,"dataGaName":776,"dataGaLocation":529},{"text":815,"config":816},"Leadership",{"href":817,"dataGaName":818,"dataGaLocation":529},"/company/team/e-group/","leadership",{"text":820,"config":821},"Handbook",{"href":822,"dataGaName":823,"dataGaLocation":529},"https://handbook.gitlab.com/","handbook",{"text":825,"config":826},"Investor relations",{"href":827,"dataGaName":828,"dataGaLocation":529},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":830,"config":831},"Trust Center",{"href":832,"dataGaName":833,"dataGaLocation":529},"/security/","trust center",{"text":835,"config":836},"AI Transparency Center",{"href":837,"dataGaName":838,"dataGaLocation":529},"/ai-transparency-center/","ai transparency center",{"text":840,"config":841},"Newsletter",{"href":842,"dataGaName":843,"dataGaLocation":529},"/company/contact/#contact-forms","newsletter",{"text":845,"config":846},"Press",{"href":847,"dataGaName":848,"dataGaLocation":529},"/press/","press",{"text":850,"config":851,"menu":852},"Contact us",{"dataNavLevelOne":796},{"type":580,"columns":853},[854],{"items":855},[856,861,866],{"text":857,"config":858},"Talk to sales",{"href":859,"dataGaName":860,"dataGaLocation":529},"/sales/","talk to sales",{"text":862,"config":863},"Support portal",{"href":864,"dataGaName":865,"dataGaLocation":529},"https://support.gitlab.com/hc/en-us","support portal",{"text":867,"config":868},"Customer portal",{"href":869,"dataGaName":870,"dataGaLocation":529},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":872,"login":873,"suggestions":880},"Close",{"text":874,"link":875},"To search repositories and projects, login to",{"text":876,"config":877},"gitlab.com",{"href":543,"dataGaName":878,"dataGaLocation":879},"search login","search",{"text":881,"default":882},"Suggestions",[883,885,889,891,895,899],{"text":560,"config":884},{"href":565,"dataGaName":560,"dataGaLocation":879},{"text":886,"config":887},"Code Suggestions (AI)",{"href":888,"dataGaName":886,"dataGaLocation":879},"/solutions/code-suggestions/",{"text":596,"config":890},{"href":598,"dataGaName":596,"dataGaLocation":879},{"text":892,"config":893},"GitLab on AWS",{"href":894,"dataGaName":892,"dataGaLocation":879},"/partners/technology-partners/aws/",{"text":896,"config":897},"GitLab on Google Cloud",{"href":898,"dataGaName":896,"dataGaLocation":879},"/partners/technology-partners/google-cloud-platform/",{"text":900,"config":901},"Why GitLab?",{"href":573,"dataGaName":900,"dataGaLocation":879},{"freeTrial":903,"mobileIcon":908,"desktopIcon":913,"secondaryButton":916},{"text":904,"config":905},"Start free trial",{"href":906,"dataGaName":534,"dataGaLocation":907},"https://gitlab.com/-/trials/new/","nav",{"altText":909,"config":910},"Gitlab Icon",{"src":911,"dataGaName":912,"dataGaLocation":907},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":909,"config":914},{"src":915,"dataGaName":912,"dataGaLocation":907},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":917,"config":918},"Get Started",{"href":919,"dataGaName":920,"dataGaLocation":907},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":922,"mobileIcon":926,"desktopIcon":928},{"text":923,"config":924},"Learn more about GitLab Duo",{"href":565,"dataGaName":925,"dataGaLocation":907},"gitlab duo",{"altText":909,"config":927},{"src":911,"dataGaName":912,"dataGaLocation":907},{"altText":909,"config":929},{"src":915,"dataGaName":912,"dataGaLocation":907},{"button":931,"mobileIcon":936,"desktopIcon":938},{"text":932,"config":933},"/switch",{"href":934,"dataGaName":935,"dataGaLocation":907},"#contact","switch",{"altText":909,"config":937},{"src":911,"dataGaName":912,"dataGaLocation":907},{"altText":909,"config":939},{"src":940,"dataGaName":912,"dataGaLocation":907},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":942,"mobileIcon":947,"desktopIcon":949},{"text":943,"config":944},"Back to pricing",{"href":678,"dataGaName":945,"dataGaLocation":907,"icon":946},"back to pricing","GoBack",{"altText":909,"config":948},{"src":911,"dataGaName":912,"dataGaLocation":907},{"altText":909,"config":950},{"src":915,"dataGaName":912,"dataGaLocation":907},{"title":952,"titleMobile":953,"button":954,"config":959},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":571,"config":955},{"href":956,"dataGaName":957,"dataGaLocation":958},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":960,"disabled":507},"release",{"data":962},{"text":963,"source":964,"edit":970,"contribute":975,"config":980,"items":985,"minimal":1195},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":965,"config":966},"View page source",{"href":967,"dataGaName":968,"dataGaLocation":969},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":971,"config":972},"Edit this page",{"href":973,"dataGaName":974,"dataGaLocation":969},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":976,"config":977},"Please contribute",{"href":978,"dataGaName":979,"dataGaLocation":969},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":981,"facebook":982,"youtube":983,"linkedin":984},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[986,1033,1087,1131,1163],{"title":676,"links":987,"subMenu":1002},[988,992,997],{"text":989,"config":990},"View plans",{"href":678,"dataGaName":991,"dataGaLocation":969},"view plans",{"text":993,"config":994},"Why Premium?",{"href":995,"dataGaName":996,"dataGaLocation":969},"/pricing/premium/","why premium",{"text":998,"config":999},"Why Ultimate?",{"href":1000,"dataGaName":1001,"dataGaLocation":969},"/pricing/ultimate/","why ultimate",[1003],{"title":1004,"links":1005},"Contact Us",[1006,1009,1011,1013,1018,1023,1028],{"text":1007,"config":1008},"Contact sales",{"href":859,"dataGaName":539,"dataGaLocation":969},{"text":862,"config":1010},{"href":864,"dataGaName":865,"dataGaLocation":969},{"text":867,"config":1012},{"href":869,"dataGaName":870,"dataGaLocation":969},{"text":1014,"config":1015},"Status",{"href":1016,"dataGaName":1017,"dataGaLocation":969},"https://status.gitlab.com/","status",{"text":1019,"config":1020},"Terms of use",{"href":1021,"dataGaName":1022,"dataGaLocation":969},"/terms/","terms of use",{"text":1024,"config":1025},"Privacy statement",{"href":1026,"dataGaName":1027,"dataGaLocation":969},"/privacy/","privacy statement",{"text":1029,"config":1030},"Cookie preferences",{"dataGaName":1031,"dataGaLocation":969,"id":1032,"isOneTrustButton":510},"cookie preferences","ot-sdk-btn",{"title":576,"links":1034,"subMenu":1043},[1035,1039],{"text":1036,"config":1037},"DevSecOps platform",{"href":558,"dataGaName":1038,"dataGaLocation":969},"devsecops platform",{"text":1040,"config":1041},"AI-Assisted Development",{"href":565,"dataGaName":1042,"dataGaLocation":969},"ai-assisted development",[1044],{"title":1045,"links":1046},"Topics",[1047,1052,1057,1062,1067,1072,1077,1082],{"text":1048,"config":1049},"CICD",{"href":1050,"dataGaName":1051,"dataGaLocation":969},"/topics/ci-cd/","cicd",{"text":1053,"config":1054},"GitOps",{"href":1055,"dataGaName":1056,"dataGaLocation":969},"/topics/gitops/","gitops",{"text":1058,"config":1059},"DevOps",{"href":1060,"dataGaName":1061,"dataGaLocation":969},"/topics/devops/","devops",{"text":1063,"config":1064},"Version Control",{"href":1065,"dataGaName":1066,"dataGaLocation":969},"/topics/version-control/","version control",{"text":1068,"config":1069},"DevSecOps",{"href":1070,"dataGaName":1071,"dataGaLocation":969},"/topics/devsecops/","devsecops",{"text":1073,"config":1074},"Cloud Native",{"href":1075,"dataGaName":1076,"dataGaLocation":969},"/topics/cloud-native/","cloud native",{"text":1078,"config":1079},"AI for Coding",{"href":1080,"dataGaName":1081,"dataGaLocation":969},"/topics/devops/ai-for-coding/","ai for coding",{"text":1083,"config":1084},"Agentic AI",{"href":1085,"dataGaName":1086,"dataGaLocation":969},"/topics/agentic-ai/","agentic ai",{"title":1088,"links":1089},"Solutions",[1090,1092,1094,1099,1103,1106,1110,1113,1115,1118,1121,1126],{"text":620,"config":1091},{"href":615,"dataGaName":620,"dataGaLocation":969},{"text":609,"config":1093},{"href":592,"dataGaName":593,"dataGaLocation":969},{"text":1095,"config":1096},"Agile development",{"href":1097,"dataGaName":1098,"dataGaLocation":969},"/solutions/agile-delivery/","agile delivery",{"text":1100,"config":1101},"SCM",{"href":605,"dataGaName":1102,"dataGaLocation":969},"source code management",{"text":1048,"config":1104},{"href":598,"dataGaName":1105,"dataGaLocation":969},"continuous integration & delivery",{"text":1107,"config":1108},"Value stream management",{"href":648,"dataGaName":1109,"dataGaLocation":969},"value stream management",{"text":1053,"config":1111},{"href":1112,"dataGaName":1056,"dataGaLocation":969},"/solutions/gitops/",{"text":658,"config":1114},{"href":661,"dataGaName":662,"dataGaLocation":969},{"text":1116,"config":1117},"Small business",{"href":667,"dataGaName":668,"dataGaLocation":969},{"text":1119,"config":1120},"Public sector",{"href":673,"dataGaName":674,"dataGaLocation":969},{"text":1122,"config":1123},"Education",{"href":1124,"dataGaName":1125,"dataGaLocation":969},"/solutions/education/","education",{"text":1127,"config":1128},"Financial services",{"href":1129,"dataGaName":1130,"dataGaLocation":969},"/solutions/finance/","financial services",{"title":681,"links":1132},[1133,1135,1137,1139,1142,1144,1147,1149,1151,1153,1155,1157,1159,1161],{"text":694,"config":1134},{"href":696,"dataGaName":697,"dataGaLocation":969},{"text":699,"config":1136},{"href":701,"dataGaName":702,"dataGaLocation":969},{"text":704,"config":1138},{"href":706,"dataGaName":707,"dataGaLocation":969},{"text":709,"config":1140},{"href":711,"dataGaName":1141,"dataGaLocation":969},"docs",{"text":731,"config":1143},{"href":733,"dataGaName":734,"dataGaLocation":969},{"text":1145,"config":1146},"What's new",{"href":791,"dataGaName":792,"dataGaLocation":969},{"text":726,"config":1148},{"href":728,"dataGaName":729,"dataGaLocation":969},{"text":745,"config":1150},{"href":747,"dataGaName":748,"dataGaLocation":969},{"text":753,"config":1152},{"href":755,"dataGaName":756,"dataGaLocation":969},{"text":758,"config":1154},{"href":760,"dataGaName":761,"dataGaLocation":969},{"text":763,"config":1156},{"href":765,"dataGaName":766,"dataGaLocation":969},{"text":768,"config":1158},{"href":770,"dataGaName":771,"dataGaLocation":969},{"text":773,"config":1160},{"href":775,"dataGaName":776,"dataGaLocation":969},{"text":778,"config":1162},{"href":780,"dataGaName":781,"dataGaLocation":969},{"title":794,"links":1164},[1165,1167,1169,1171,1173,1175,1179,1184,1186,1188,1190],{"text":802,"config":1166},{"href":804,"dataGaName":796,"dataGaLocation":969},{"text":807,"config":1168},{"href":809,"dataGaName":810,"dataGaLocation":969},{"text":815,"config":1170},{"href":817,"dataGaName":818,"dataGaLocation":969},{"text":820,"config":1172},{"href":822,"dataGaName":823,"dataGaLocation":969},{"text":825,"config":1174},{"href":827,"dataGaName":828,"dataGaLocation":969},{"text":1176,"config":1177},"Sustainability",{"href":1178,"dataGaName":1176,"dataGaLocation":969},"/sustainability/",{"text":1180,"config":1181},"Diversity, inclusion and belonging (DIB)",{"href":1182,"dataGaName":1183,"dataGaLocation":969},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":830,"config":1185},{"href":832,"dataGaName":833,"dataGaLocation":969},{"text":840,"config":1187},{"href":842,"dataGaName":843,"dataGaLocation":969},{"text":845,"config":1189},{"href":847,"dataGaName":848,"dataGaLocation":969},{"text":1191,"config":1192},"Modern Slavery Transparency Statement",{"href":1193,"dataGaName":1194,"dataGaLocation":969},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1196},[1197,1200,1203],{"text":1198,"config":1199},"Terms",{"href":1021,"dataGaName":1022,"dataGaLocation":969},{"text":1201,"config":1202},"Cookies",{"dataGaName":1031,"dataGaLocation":969,"id":1032,"isOneTrustButton":510},{"text":1204,"config":1205},"Privacy",{"href":1026,"dataGaName":1027,"dataGaLocation":969},[1207],{"id":1208,"title":7,"body":506,"config":1209,"content":1211,"description":506,"extension":1215,"meta":1216,"navigation":510,"path":1217,"seo":1218,"stem":1219,"__hash__":1220},"blogAuthors/en-us/blog/authors/cesar-saavedra.yml",{"template":1210},"BlogAuthor",{"name":7,"config":1212},{"headshot":1213,"ctfId":1214},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1","yml",{},"/en-us/blog/authors/cesar-saavedra",{},"en-us/blog/authors/cesar-saavedra","SMqRf-z0W5m5GROz_dXGjmuIb3YaOwm_n_RfeK16GcA",[1222,1231,1239],{"title":1223,"description":1224,"heroImage":1225,"category":502,"date":1226,"authors":1227,"slug":1230,"externalUrl":506},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1228,1229],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1232,"description":1233,"heroImage":1234,"category":502,"date":1235,"authors":1236,"slug":1238,"externalUrl":506},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1237],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1240,"description":1241,"heroImage":1242,"category":502,"date":1243,"authors":1244,"slug":1246,"externalUrl":506},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1245],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1248},[1249,1263,1275,1287],{"id":1250,"categories":1251,"header":1253,"text":1254,"button":1255,"image":1260},"ai-modernization",[1252],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1256,"config":1257},"Get your AI maturity score",{"href":1258,"dataGaName":1259,"dataGaLocation":734},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1261},{"src":1262},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1264,"categories":1265,"header":1267,"text":1254,"button":1268,"image":1272},"devops-modernization",[1266,1071],"product","Are you just managing tools or shipping innovation?",{"text":1269,"config":1270},"Get your DevOps maturity score",{"href":1271,"dataGaName":1259,"dataGaLocation":734},"/assessments/devops-modernization-assessment/",{"config":1273},{"src":1274},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1276,"categories":1277,"header":1279,"text":1254,"button":1280,"image":1284},"security-modernization",[1278],"security","Are you trading speed for security?",{"text":1281,"config":1282},"Get your security maturity score",{"href":1283,"dataGaName":1259,"dataGaLocation":734},"/assessments/security-modernization-assessment/",{"config":1285},{"src":1286},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1288,"paths":1289,"header":1292,"text":1293,"button":1294,"image":1299},"github-azure-migration",[1290,1291],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1295,"config":1296},"See how GitLab compares to GitHub",{"href":1297,"dataGaName":1298,"dataGaLocation":734},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1300},{"src":1274},{"header":1302,"blurb":1303,"button":1304,"secondaryButton":1309},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1305,"config":1306},"Get your free trial",{"href":1307,"dataGaName":534,"dataGaLocation":1308},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1007,"config":1310},{"href":859,"dataGaName":539,"dataGaLocation":1308},1786803751390]