[{"data":1,"prerenderedAt":1201},["ShallowReactive",2],{"/blog/microcks-and-gitlab-part-one":3,"navigation-en-us":416,"banner-en-us":842,"footer-en-us":852,"blog-post-authors-en-us-Madou Coulibaly":1096,"blog-related-posts-en-us-microcks-and-gitlab-part-one":1111,"blog-promotions-en-us":1137,"next-steps-en-us":1191},{"id":4,"title":5,"authors":6,"body":8,"category":392,"date":393,"description":394,"extension":395,"externalUrl":396,"faq":396,"featured":397,"heroImage":398,"meta":399,"navigation":400,"path":401,"seo":402,"slug":406,"stem":407,"tags":408,"template":414,"updatedDate":396,"__hash__":415},"blogPosts/en-us/blog/microcks-and-gitlab-part-one.md","Speed up API and microservices delivery with Microcks and GitLab - Part 1",[7],"Madou Coulibaly",{"type":9,"value":10,"toc":379},"minimark",[11,15,58,61,66,69,86,89,93,113,120,123,135,142,148,151,155,170,176,183,188,197,234,240,254,260,264,292,298,309,327,333,337,340,346,350,353,370],[12,13,14],"p",{},"API development is all the rage these days for customer and partner integration, frontend-to-backend communication, microservices orchestration, and more. Yet APIs have their challenges, including how to create a fast feedback loop on design, how different teams can work with autonomy without having to wait for each other's API implementation, and how to cope with backward compatibility tests when shipping newer versions of the API.",[12,16,17,23,24,29,30,35,36,35,41,35,46,51,52,57],{},[18,19,22],"a",{"href":20,"rel":21},"https://microcks.io",[],"Microcks",", an open source, Kubernetes-native tool for API mocking and testing, addresses these challenges. With Microcks, which is accepted as a Sandbox project in the ",[18,25,28],{"href":26,"rel":27},"https://cncf.io",[],"Cloud Native Computing Foundation",", developers can leverage their ",[18,31,34],{"href":32,"rel":33},"https://www.openapis.org/",[],"OpenAPI",", ",[18,37,40],{"href":38,"rel":39},"https://graphql.org/",[],"GraphQL",[18,42,45],{"href":43,"rel":44},"https://grpc.io/",[],"gRPC",[18,47,50],{"href":48,"rel":49},"https://www.asyncapi.com/",[],"AsyncAPI",", and ",[18,53,56],{"href":54,"rel":55},"https://www.postman.com/collection/",[],"Postman Collection"," assets to quickly mock and simulate APIs before writing them. Couple Microcks with GitLab and you have a powerful combination to foster collaboration, encourage rapid changes, and provide a robust delivery platform for API-based applications.",[12,59,60],{},"In this ongoing blog series, we will introduce you to Microcks use cases and how they fit with the GitLab platform. We'll also discuss technical integration points that will help ease the developer burden, including identity management, Git repositories, and pipeline integrations.",[62,63,65],"h2",{"id":64},"what-is-microcks","What is Microcks?",[12,67,68],{},"Microcks addresses two major use cases:",[70,71,72,80],"ul",{},[73,74,75,79],"li",{},[76,77,78],"strong",{},"Simulating (or mocking) an API or a microservice"," from a set of descriptive assets. This can be done as soon as you start the design phase to set up a feedback loop very quickly, or later on to ease the pain of provisioning environments with a lot of dependencies.",[73,81,82,85],{},[76,83,84],{},"Validating the conformance of your application regarding your API specification"," by running contract-test. This validation can be integrated into your CI/CD pipeline so that conformance can be checked on each and every iteration. This is of great help to enforce backward compatibility of your API of microservices interfaces.",[12,87,88],{},"Microcks offers a uniform and consistent approach for the various kinds of request/response APIs (REST, GraphQL, gRPC, Soap) and event-driven APIs (currently supporting eight different protocols), thereby bringing consistency for users and for automations all along your API lifecycle.",[62,90,92],{"id":91},"how-microcks-fits-into-the-software-development-lifecycle","How Microcks fits into the software development lifecycle",[12,94,95,96,35,101,106,107,112],{},"Microcks is a solution based on containers and can be deployed in several configurations. It can be deployed on the developer laptop through ",[18,97,100],{"href":98,"rel":99},"https://microcks.io/documentation/installing/docker-compose/",[],"Docker",[18,102,105],{"href":103,"rel":104},"https://microcks.io/documentation/installing/podman-compose/",[],"Podman"," or ",[18,108,111],{"href":109,"rel":110},"https://microcks.io/documentation/installing/docker-desktop-extension/",[],"Docker Desktop Extension"," to assist with mocking complex environments. When it comes to team collaboration, Microcks can be deployed as a centralized instance that connects to the Git repositories of the organization, discovers the API artifacts, and then provides shared up-to-date API simulations.",[12,114,115],{},[116,117],"img",{"alt":118,"src":119},"diagram of how Microcks fits into development lifecycle","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397847/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/microcks.png",[12,121,122],{},"To ease the burden on developers (and administrators), Microcks can be configured to use your GitLab platform as an identity provider. With that configuration, integrating Microcks is seamless, and API simulations are automatically shared among development teams. Microcks fosters collaboration by providing everyone with the same “source of truth” and avoiding drift risks. The tool can also be used to lower the pain and the cost of deploying and maintaining complex QA environments because simulations are inexpensive to deploy or redeploy on-demand. Microcks deployment follows a GitOps approach.",[12,124,125,126,130,131,134],{},"Beyond this sharing of simulations, Microcks also integrates well with CI/CD pipelines. As you release API-based applications, there is always concern about conformance of the contractualized expectations you defined using specifications like OpenAPI, GraphQL, and the like. Usually, the hardest part isn't delivering the ",[127,128,129],"code",{},"1.0"," of this API; problems come later when you're trying to deliver the ",[127,132,133],{},"1.3",". This latest version must still be backward compatible with the 1.0 contract if you don't want to make your consumers angry and frustrated.",[12,136,137,138,141],{},"This conformance validation is very well assured by Microcks using contract-testing principles. So we encourage you to plug Microcks into some ",[127,139,140],{},"test"," related jobs in your GitLab pipeline and delegate this conformance validation to your Microcks instance.",[12,143,144],{},[116,145],{"alt":146,"src":147},"microcks-in-gitlab-workflow","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397847/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/microcks-in-gitlab-workflow.png",[12,149,150],{},"Embedding Microcks conformance testing in your pipeline is actually easy thanks to our lightweight CLI that you'll integrate in pipeline jobs. You can choose to reuse an existing Microcks instance to record results and keep history of your success or pop up a new ephemeral instance as it's lightweight and fast to bootstrap.",[62,152,154],{"id":153},"how-to-set-up-gitlab-as-an-identity-provider-in-microcks","How to set up GitLab as an identity provider in Microcks",[12,156,157,158,163,164,169],{},"To start off this series, we will detail how to configure Microcks to use your GitLab platform as an identity provider. This is in fact very easy as authentication in Microcks is based on ",[18,159,162],{"href":160,"rel":161},"https://keycloak.org",[],"Keycloak"," (another CNCF project) and GitLab can be set as an identity provider in Keycloak (see ",[18,165,168],{"href":166,"rel":167},"https://www.keycloak.org/docs/latest/server_admin/index.html#gitlab",[],"official documentation",").",[12,171,172,175],{},[76,173,174],{},"Note:"," This configuration is optional as Microcks can use any other identity provider Keycloak integrates with.",[12,177,178,179,182],{},"Keycloak is a very common solution that may be deployed already at your organization. If not, Microcks comes with a Keycloak distribution that is pre-configured for its usage with a realm called ",[127,180,181],{},"microcks",". We have used this realm to validate this configuration.",[184,185,187],"h3",{"id":186},"create-a-gitlab-group-application","Create a GitLab Group Application",[12,189,190,191,196],{},"The first thing is to create a new ",[18,192,195],{"href":193,"rel":194},"https://docs.gitlab.com/integration/oauth_provider/#create-a-group-owned-application",[],"Group Application"," on your GitLab instance as follows:",[70,198,199,208,216],{},[73,200,201,204,205],{},[127,202,203],{},"Name",": ",[127,206,207],{},"microcks-via-keycloak",[73,209,210,204,213],{},[127,211,212],{},"Redirect URI",[127,214,215],{},"https://keycloak.acme.org/realms/microcks/broker/gitlab/endpoint",[73,217,218,204,221,35,224,35,227,230,231],{},[127,219,220],{},"Scopes",[127,222,223],{},"read_user",[127,225,226],{},"openid",[127,228,229],{},"profile"," and ",[127,232,233],{},"email",[12,235,236],{},[116,237],{"alt":238,"src":239},"gitlab-application-form","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397845/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/gitlab-application-form.png",[12,241,242,243,245,246,249,250,253],{},"This application uses your Keycloak instance with ",[127,244,215],{}," as the redirect URI. As a result, we obtain an ",[127,247,248],{},"Application ID"," and an associated ",[127,251,252],{},"Secret"," we have to keep aside for the next step.",[12,255,256],{},[116,257],{"alt":258,"src":259},"gitlab-application","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397845/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/gitlab-application.jpg",[184,261,263],{"id":262},"add-gitlab-as-identity-provider-in-keycloak","Add GitLab as identity provider in Keycloak",[12,265,266,267,269,270,273,274,276,277,280,281,283,284,287,288,291],{},"The next step takes place in the Keycloak admin console. Once the correct ",[127,268,181],{}," realm is selected, you'll just have to go to the ",[76,271,272],{},"Identity providers"," section and add a GitLab provider. Simply paste here the ",[127,275,248],{}," you got earlier as ",[127,278,279],{},"Client ID"," and the ",[127,282,252],{}," as ",[127,285,286],{},"Client Secret",". You can also choose a ",[127,289,290],{},"Display order"," if you plan to have multiple identity providers.",[12,293,294],{},[116,295],{"alt":296,"src":297},"keycloak-identity-provider","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397845/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/keycloak-identity-provider.jpg",[12,299,300,301,304,305,308],{},"Then, from the ",[76,302,303],{},"Authentication"," section in the admin console, choose the browser flow and configure the ",[127,306,307],{},"Identity Provider Redirector"," as follows:",[70,310,311,319],{},[73,312,313,204,316],{},[127,314,315],{},"Alias",[127,317,318],{},"GitLab",[73,320,321,204,324],{},[127,322,323],{},"Default Identify Provider",[127,325,326],{},"gitlab",[12,328,329],{},[116,330],{"alt":331,"src":332},"keycloak-redirector","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397846/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/keycloak-redirector.jpg",[184,334,336],{"id":335},"test-your-microcks-configuration","Test your Microcks configuration",[12,338,339],{},"Now open the Microcks URL into your browser and you'll be directly redirected to the GitLab login page. Enter your GitLab credentials and you will be authenticated and redirected to Microcks.",[12,341,342],{},[116,343],{"alt":344,"src":345},"microcks-homepage","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397847/blog/Content%20Images/2023-09-27-microcks-and-gitlab-part-1-speed-up-api-and-microservices-delivery/microcks-homepage.jpg",[62,347,349],{"id":348},"whats-next","What's next?",[12,351,352],{},"In upcoming blogs, we'll detail how GitLab can be used in the two major use cases for Microcks. We'll see how Microcks integrates with GitLab Git repositories to discover API specifications and produce simulations, and how to integrate Microcks conformance tests into your GitLab CI/CD pipelines.",[12,354,355],{},[356,357,358,363,364,369],"em",{},[18,359,362],{"href":360,"rel":361},"https://www.linkedin.com/in/laurentbroudoux/",[],"Laurent Broudoux"," is a cloud-native architecture expert and enterprise integration problem lover. He has helped organizations in adopting distributed and cloud paradigms while capitalizing on their critical existing assets. He is the founder and lead developer of the ",[18,365,368],{"href":366,"rel":367},"https://microcks.io/",[],"Microcks.io"," open-source project: a Kubernetes-native tool for API mocking and testing. For this, he is using his 10+ years experience as an architect in financial services where he defined API transformation strategies, including governance and delivery process.",[12,371,372],{},[356,373,374,378],{},[18,375,7],{"href":376,"rel":377},"https://gitlab.com/madou",[]," is a senior solutions architect at GitLab.",{"title":380,"searchDepth":381,"depth":381,"links":382},"",2,[383,384,385,391],{"id":64,"depth":381,"text":65},{"id":91,"depth":381,"text":92},{"id":153,"depth":381,"text":154,"children":386},[387,389,390],{"id":186,"depth":388,"text":187},3,{"id":262,"depth":388,"text":263},{"id":335,"depth":388,"text":336},{"id":348,"depth":381,"text":349},"engineering","2023-09-27","Learn how to configure Microcks for GitLab and what the use cases are for this open source Kubernetes-native tool.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749683021/Blog/Hero%20Images/lightsticks.png",{},true,"/en-us/blog/microcks-and-gitlab-part-one",{"title":5,"description":394,"ogTitle":5,"ogDescription":394,"noIndex":397,"ogImage":398,"ogUrl":403,"ogSiteName":404,"ogType":405,"canonicalUrls":403},"https://about.gitlab.com/blog/microcks-and-gitlab-part-one","https://about.gitlab.com","article","microcks-and-gitlab-part-one","en-us/blog/microcks-and-gitlab-part-one",[409,410,411,412,413],"AWS","testing","CI/CD","cloud native","integrations","BlogPost","GdP-aLpPkzgAT7iUdca_2hBvlHaIknXXAAAJEx8UK6w",{"logo":417,"freeTrial":422,"sales":427,"login":432,"items":437,"search":762,"minimal":793,"duo":812,"switchNav":821,"pricingDeployment":832},{"config":418},{"href":419,"dataGaName":420,"dataGaLocation":421},"/","gitlab logo","header",{"text":423,"config":424},"Get free trial",{"href":425,"dataGaName":426,"dataGaLocation":421},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":428,"config":429},"Request a demo",{"href":430,"dataGaName":431,"dataGaLocation":421},"/sales/?contact-topic=request-demo","sales",{"text":433,"config":434},"Sign in",{"href":435,"dataGaName":436,"dataGaLocation":421},"https://gitlab.com/users/sign_in/","sign in",[438,467,566,571,684,740],{"text":439,"config":440,"menu":442},"Platform",{"dataNavLevelOne":441},"platform",{"type":443,"columns":444},"cards",[445,451,459],{"title":439,"description":446,"link":447},"The intelligent orchestration platform for DevSecOps",{"text":448,"config":449},"Explore our Platform",{"href":450,"dataGaName":441,"dataGaLocation":421},"/platform/",{"title":452,"description":453,"link":454},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":455,"config":456},"Meet GitLab Duo",{"href":457,"dataGaName":458,"dataGaLocation":421},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":460,"description":461,"link":462},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":463,"config":464},"Learn more",{"href":465,"dataGaName":466,"dataGaLocation":421},"/why-gitlab/","why gitlab",{"text":468,"left":400,"config":469,"menu":471},"Product",{"dataNavLevelOne":470},"solutions",{"type":472,"link":473,"columns":477,"feature":545},"lists",{"text":474,"config":475},"View all Solutions",{"href":476,"dataGaName":470,"dataGaLocation":421},"/solutions/",[478,501,524],{"title":479,"description":480,"link":481,"items":486},"Automation","CI/CD and automation to accelerate deployment",{"config":482},{"icon":483,"href":484,"dataGaName":485,"dataGaLocation":421},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[487,490,493,497],{"text":411,"config":488},{"href":489,"dataGaLocation":421,"dataGaName":411},"/solutions/continuous-integration/",{"text":452,"config":491},{"href":457,"dataGaLocation":421,"dataGaName":492},"gitlab duo agent platform - product menu",{"text":494,"config":495},"Source Code Management",{"href":496,"dataGaLocation":421,"dataGaName":494},"/solutions/source-code-management/",{"text":498,"config":499},"Automated Software Delivery",{"href":484,"dataGaLocation":421,"dataGaName":500},"Automated software delivery",{"title":502,"description":503,"link":504,"items":509},"Security","Deliver code faster without compromising security",{"config":505},{"href":506,"dataGaName":507,"dataGaLocation":421,"icon":508},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[510,514,519],{"text":511,"config":512},"Application Security Testing",{"href":506,"dataGaName":513,"dataGaLocation":421},"Application security testing",{"text":515,"config":516},"Software Supply Chain Security",{"href":517,"dataGaLocation":421,"dataGaName":518},"/solutions/supply-chain/","Software supply chain security",{"text":520,"config":521},"Software Compliance",{"href":522,"dataGaName":523,"dataGaLocation":421},"/solutions/software-compliance/","software compliance",{"title":525,"link":526,"items":531},"Measurement",{"config":527},{"icon":528,"href":529,"dataGaName":530,"dataGaLocation":421},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[532,536,540],{"text":533,"config":534},"Visibility & Measurement",{"href":529,"dataGaLocation":421,"dataGaName":535},"Visibility and Measurement",{"text":537,"config":538},"Value Stream Management",{"href":539,"dataGaLocation":421,"dataGaName":537},"/solutions/value-stream-management/",{"text":541,"config":542},"Analytics & Insights",{"href":543,"dataGaLocation":421,"dataGaName":544},"/solutions/analytics-and-insights/","Analytics and insights",{"title":546,"type":472,"items":547},"GitLab for",[548,554,560],{"text":549,"config":550},"Enterprise",{"icon":551,"href":552,"dataGaLocation":421,"dataGaName":553},"Building","/enterprise/","enterprise",{"text":555,"config":556},"Small Business",{"icon":557,"href":558,"dataGaLocation":421,"dataGaName":559},"Work","/small-business/","small business",{"text":561,"config":562},"Public Sector",{"icon":563,"href":564,"dataGaLocation":421,"dataGaName":565},"Organization","/solutions/public-sector/","public sector",{"text":567,"config":568},"Pricing",{"href":569,"dataGaName":570,"dataGaLocation":421,"dataNavLevelOne":570},"/pricing/","pricing",{"text":572,"config":573,"menu":575},"Resources",{"dataNavLevelOne":574},"resources",{"type":472,"link":576,"columns":580,"feature":673},{"text":577,"config":578},"View all resources",{"href":579,"dataGaName":574,"dataGaLocation":421},"/resources/",[581,613,640],{"title":582,"items":583},"Getting started",[584,589,594,599,604,609],{"text":585,"config":586},"Install",{"href":587,"dataGaName":588,"dataGaLocation":421},"/install/","install",{"text":590,"config":591},"Quick start guides",{"href":592,"dataGaName":593,"dataGaLocation":421},"/get-started/","quick setup checklists",{"text":595,"config":596},"Learn",{"href":597,"dataGaLocation":421,"dataGaName":598},"https://university.gitlab.com/","learn",{"text":600,"config":601},"Product documentation",{"href":602,"dataGaName":603,"dataGaLocation":421},"https://docs.gitlab.com/","product documentation",{"text":605,"config":606},"Best practice videos",{"href":607,"dataGaName":608,"dataGaLocation":421},"/getting-started-videos/","best practice videos",{"text":610,"config":611},"Integrations",{"href":612,"dataGaName":413,"dataGaLocation":421},"/integrations/",{"title":614,"items":615},"Discover",[616,621,626,631,635],{"text":617,"config":618},"Customer success stories",{"href":619,"dataGaName":620,"dataGaLocation":421},"/customers/","customer success stories",{"text":622,"config":623},"Blog",{"href":624,"dataGaName":625,"dataGaLocation":421},"/blog/","blog",{"text":627,"config":628},"Demo Hub",{"href":629,"dataGaName":630,"dataGaLocation":421},"/demo-hub/","demo hub",{"text":632,"config":633},"The Source",{"href":634,"dataGaName":625,"dataGaLocation":421},"/the-source/",{"text":636,"config":637},"Remote",{"href":638,"dataGaName":639,"dataGaLocation":421},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":641,"items":642},"Connect",[643,648,653,658,663,668],{"text":644,"config":645},"GitLab Services",{"href":646,"dataGaName":647,"dataGaLocation":421},"/services/","services",{"text":649,"config":650},"Contribute",{"href":651,"dataGaName":652,"dataGaLocation":421},"https://contributors.gitlab.com","contribute",{"text":654,"config":655},"Community",{"href":656,"dataGaName":657,"dataGaLocation":421},"/community/","community",{"text":659,"config":660},"Forum",{"href":661,"dataGaName":662,"dataGaLocation":421},"https://forum.gitlab.com/","forum",{"text":664,"config":665},"Events",{"href":666,"dataGaName":667,"dataGaLocation":421},"/events/","events",{"text":669,"config":670},"Partners",{"href":671,"dataGaName":672,"dataGaLocation":421},"/partners/","partners",{"config":674,"title":677,"text":678,"link":679},{"background":675,"textColor":676},"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":680,"config":681},"Read the latest",{"href":682,"dataGaName":683,"dataGaLocation":421},"/whats-new/","whats new",{"text":685,"config":686,"menu":688},"Company",{"dataNavLevelOne":687},"company",{"type":472,"columns":689},[690],{"items":691},[692,697,703,705,710,715,720,725,730,735],{"text":693,"config":694},"About",{"href":695,"dataGaName":696,"dataGaLocation":421},"/company/","about",{"text":698,"config":699,"footerGa":702},"Jobs",{"href":700,"dataGaName":701,"dataGaLocation":421},"/jobs/","jobs",{"dataGaName":701},{"text":664,"config":704},{"href":666,"dataGaName":667,"dataGaLocation":421},{"text":706,"config":707},"Leadership",{"href":708,"dataGaName":709,"dataGaLocation":421},"/company/team/e-group/","leadership",{"text":711,"config":712},"Handbook",{"href":713,"dataGaName":714,"dataGaLocation":421},"https://handbook.gitlab.com/","handbook",{"text":716,"config":717},"Investor relations",{"href":718,"dataGaName":719,"dataGaLocation":421},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":721,"config":722},"Trust Center",{"href":723,"dataGaName":724,"dataGaLocation":421},"/security/","trust center",{"text":726,"config":727},"AI Transparency Center",{"href":728,"dataGaName":729,"dataGaLocation":421},"/ai-transparency-center/","ai transparency center",{"text":731,"config":732},"Newsletter",{"href":733,"dataGaName":734,"dataGaLocation":421},"/company/contact/#contact-forms","newsletter",{"text":736,"config":737},"Press",{"href":738,"dataGaName":739,"dataGaLocation":421},"/press/","press",{"text":741,"config":742,"menu":743},"Contact us",{"dataNavLevelOne":687},{"type":472,"columns":744},[745],{"items":746},[747,752,757],{"text":748,"config":749},"Talk to sales",{"href":750,"dataGaName":751,"dataGaLocation":421},"/sales/","talk to sales",{"text":753,"config":754},"Support portal",{"href":755,"dataGaName":756,"dataGaLocation":421},"https://support.gitlab.com/hc/en-us","support portal",{"text":758,"config":759},"Customer portal",{"href":760,"dataGaName":761,"dataGaLocation":421},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":763,"login":764,"suggestions":771},"Close",{"text":765,"link":766},"To search repositories and projects, login to",{"text":767,"config":768},"gitlab.com",{"href":435,"dataGaName":769,"dataGaLocation":770},"search login","search",{"text":772,"default":773},"Suggestions",[774,776,780,782,786,790],{"text":452,"config":775},{"href":457,"dataGaName":452,"dataGaLocation":770},{"text":777,"config":778},"Code Suggestions (AI)",{"href":779,"dataGaName":777,"dataGaLocation":770},"/solutions/code-suggestions/",{"text":411,"config":781},{"href":489,"dataGaName":411,"dataGaLocation":770},{"text":783,"config":784},"GitLab on AWS",{"href":785,"dataGaName":783,"dataGaLocation":770},"/partners/technology-partners/aws/",{"text":787,"config":788},"GitLab on Google Cloud",{"href":789,"dataGaName":787,"dataGaLocation":770},"/partners/technology-partners/google-cloud-platform/",{"text":791,"config":792},"Why GitLab?",{"href":465,"dataGaName":791,"dataGaLocation":770},{"freeTrial":794,"mobileIcon":799,"desktopIcon":804,"secondaryButton":807},{"text":795,"config":796},"Start free trial",{"href":797,"dataGaName":426,"dataGaLocation":798},"https://gitlab.com/-/trials/new/","nav",{"altText":800,"config":801},"Gitlab Icon",{"src":802,"dataGaName":803,"dataGaLocation":798},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":800,"config":805},{"src":806,"dataGaName":803,"dataGaLocation":798},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":808,"config":809},"Get Started",{"href":810,"dataGaName":811,"dataGaLocation":798},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":813,"mobileIcon":817,"desktopIcon":819},{"text":814,"config":815},"Learn more about GitLab Duo",{"href":457,"dataGaName":816,"dataGaLocation":798},"gitlab duo",{"altText":800,"config":818},{"src":802,"dataGaName":803,"dataGaLocation":798},{"altText":800,"config":820},{"src":806,"dataGaName":803,"dataGaLocation":798},{"button":822,"mobileIcon":827,"desktopIcon":829},{"text":823,"config":824},"/switch",{"href":825,"dataGaName":826,"dataGaLocation":798},"#contact","switch",{"altText":800,"config":828},{"src":802,"dataGaName":803,"dataGaLocation":798},{"altText":800,"config":830},{"src":831,"dataGaName":803,"dataGaLocation":798},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":833,"mobileIcon":838,"desktopIcon":840},{"text":834,"config":835},"Back to pricing",{"href":569,"dataGaName":836,"dataGaLocation":798,"icon":837},"back to pricing","GoBack",{"altText":800,"config":839},{"src":802,"dataGaName":803,"dataGaLocation":798},{"altText":800,"config":841},{"src":806,"dataGaName":803,"dataGaLocation":798},{"title":843,"titleMobile":844,"button":845,"config":850},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":463,"config":846},{"href":847,"dataGaName":848,"dataGaLocation":849},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":851,"disabled":397},"release",{"data":853},{"text":854,"source":855,"edit":861,"contribute":866,"config":871,"items":876,"minimal":1085},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":856,"config":857},"View page source",{"href":858,"dataGaName":859,"dataGaLocation":860},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":862,"config":863},"Edit this page",{"href":864,"dataGaName":865,"dataGaLocation":860},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":867,"config":868},"Please contribute",{"href":869,"dataGaName":870,"dataGaLocation":860},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":872,"facebook":873,"youtube":874,"linkedin":875},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[877,924,977,1021,1053],{"title":567,"links":878,"subMenu":893},[879,883,888],{"text":880,"config":881},"View plans",{"href":569,"dataGaName":882,"dataGaLocation":860},"view plans",{"text":884,"config":885},"Why Premium?",{"href":886,"dataGaName":887,"dataGaLocation":860},"/pricing/premium/","why premium",{"text":889,"config":890},"Why Ultimate?",{"href":891,"dataGaName":892,"dataGaLocation":860},"/pricing/ultimate/","why ultimate",[894],{"title":895,"links":896},"Contact Us",[897,900,902,904,909,914,919],{"text":898,"config":899},"Contact sales",{"href":750,"dataGaName":431,"dataGaLocation":860},{"text":753,"config":901},{"href":755,"dataGaName":756,"dataGaLocation":860},{"text":758,"config":903},{"href":760,"dataGaName":761,"dataGaLocation":860},{"text":905,"config":906},"Status",{"href":907,"dataGaName":908,"dataGaLocation":860},"https://status.gitlab.com/","status",{"text":910,"config":911},"Terms of use",{"href":912,"dataGaName":913,"dataGaLocation":860},"/terms/","terms of use",{"text":915,"config":916},"Privacy statement",{"href":917,"dataGaName":918,"dataGaLocation":860},"/privacy/","privacy statement",{"text":920,"config":921},"Cookie preferences",{"dataGaName":922,"dataGaLocation":860,"id":923,"isOneTrustButton":400},"cookie preferences","ot-sdk-btn",{"title":468,"links":925,"subMenu":934},[926,930],{"text":927,"config":928},"DevSecOps platform",{"href":450,"dataGaName":929,"dataGaLocation":860},"devsecops platform",{"text":931,"config":932},"AI-Assisted Development",{"href":457,"dataGaName":933,"dataGaLocation":860},"ai-assisted development",[935],{"title":936,"links":937},"Topics",[938,943,948,953,958,963,967,972],{"text":939,"config":940},"CICD",{"href":941,"dataGaName":942,"dataGaLocation":860},"/topics/ci-cd/","cicd",{"text":944,"config":945},"GitOps",{"href":946,"dataGaName":947,"dataGaLocation":860},"/topics/gitops/","gitops",{"text":949,"config":950},"DevOps",{"href":951,"dataGaName":952,"dataGaLocation":860},"/topics/devops/","devops",{"text":954,"config":955},"Version Control",{"href":956,"dataGaName":957,"dataGaLocation":860},"/topics/version-control/","version control",{"text":959,"config":960},"DevSecOps",{"href":961,"dataGaName":962,"dataGaLocation":860},"/topics/devsecops/","devsecops",{"text":964,"config":965},"Cloud Native",{"href":966,"dataGaName":412,"dataGaLocation":860},"/topics/cloud-native/",{"text":968,"config":969},"AI for Coding",{"href":970,"dataGaName":971,"dataGaLocation":860},"/topics/devops/ai-for-coding/","ai for coding",{"text":973,"config":974},"Agentic AI",{"href":975,"dataGaName":976,"dataGaLocation":860},"/topics/agentic-ai/","agentic ai",{"title":978,"links":979},"Solutions",[980,982,984,989,993,996,1000,1003,1005,1008,1011,1016],{"text":511,"config":981},{"href":506,"dataGaName":511,"dataGaLocation":860},{"text":500,"config":983},{"href":484,"dataGaName":485,"dataGaLocation":860},{"text":985,"config":986},"Agile development",{"href":987,"dataGaName":988,"dataGaLocation":860},"/solutions/agile-delivery/","agile delivery",{"text":990,"config":991},"SCM",{"href":496,"dataGaName":992,"dataGaLocation":860},"source code management",{"text":939,"config":994},{"href":489,"dataGaName":995,"dataGaLocation":860},"continuous integration & delivery",{"text":997,"config":998},"Value stream management",{"href":539,"dataGaName":999,"dataGaLocation":860},"value stream management",{"text":944,"config":1001},{"href":1002,"dataGaName":947,"dataGaLocation":860},"/solutions/gitops/",{"text":549,"config":1004},{"href":552,"dataGaName":553,"dataGaLocation":860},{"text":1006,"config":1007},"Small business",{"href":558,"dataGaName":559,"dataGaLocation":860},{"text":1009,"config":1010},"Public sector",{"href":564,"dataGaName":565,"dataGaLocation":860},{"text":1012,"config":1013},"Education",{"href":1014,"dataGaName":1015,"dataGaLocation":860},"/solutions/education/","education",{"text":1017,"config":1018},"Financial services",{"href":1019,"dataGaName":1020,"dataGaLocation":860},"/solutions/finance/","financial services",{"title":572,"links":1022},[1023,1025,1027,1029,1032,1034,1037,1039,1041,1043,1045,1047,1049,1051],{"text":585,"config":1024},{"href":587,"dataGaName":588,"dataGaLocation":860},{"text":590,"config":1026},{"href":592,"dataGaName":593,"dataGaLocation":860},{"text":595,"config":1028},{"href":597,"dataGaName":598,"dataGaLocation":860},{"text":600,"config":1030},{"href":602,"dataGaName":1031,"dataGaLocation":860},"docs",{"text":622,"config":1033},{"href":624,"dataGaName":625,"dataGaLocation":860},{"text":1035,"config":1036},"What's new",{"href":682,"dataGaName":683,"dataGaLocation":860},{"text":617,"config":1038},{"href":619,"dataGaName":620,"dataGaLocation":860},{"text":636,"config":1040},{"href":638,"dataGaName":639,"dataGaLocation":860},{"text":644,"config":1042},{"href":646,"dataGaName":647,"dataGaLocation":860},{"text":649,"config":1044},{"href":651,"dataGaName":652,"dataGaLocation":860},{"text":654,"config":1046},{"href":656,"dataGaName":657,"dataGaLocation":860},{"text":659,"config":1048},{"href":661,"dataGaName":662,"dataGaLocation":860},{"text":664,"config":1050},{"href":666,"dataGaName":667,"dataGaLocation":860},{"text":669,"config":1052},{"href":671,"dataGaName":672,"dataGaLocation":860},{"title":685,"links":1054},[1055,1057,1059,1061,1063,1065,1069,1074,1076,1078,1080],{"text":693,"config":1056},{"href":695,"dataGaName":687,"dataGaLocation":860},{"text":698,"config":1058},{"href":700,"dataGaName":701,"dataGaLocation":860},{"text":706,"config":1060},{"href":708,"dataGaName":709,"dataGaLocation":860},{"text":711,"config":1062},{"href":713,"dataGaName":714,"dataGaLocation":860},{"text":716,"config":1064},{"href":718,"dataGaName":719,"dataGaLocation":860},{"text":1066,"config":1067},"Sustainability",{"href":1068,"dataGaName":1066,"dataGaLocation":860},"/sustainability/",{"text":1070,"config":1071},"Diversity, inclusion and belonging (DIB)",{"href":1072,"dataGaName":1073,"dataGaLocation":860},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":721,"config":1075},{"href":723,"dataGaName":724,"dataGaLocation":860},{"text":731,"config":1077},{"href":733,"dataGaName":734,"dataGaLocation":860},{"text":736,"config":1079},{"href":738,"dataGaName":739,"dataGaLocation":860},{"text":1081,"config":1082},"Modern Slavery Transparency Statement",{"href":1083,"dataGaName":1084,"dataGaLocation":860},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1086},[1087,1090,1093],{"text":1088,"config":1089},"Terms",{"href":912,"dataGaName":913,"dataGaLocation":860},{"text":1091,"config":1092},"Cookies",{"dataGaName":922,"dataGaLocation":860,"id":923,"isOneTrustButton":400},{"text":1094,"config":1095},"Privacy",{"href":917,"dataGaName":918,"dataGaLocation":860},[1097],{"id":1098,"title":7,"body":396,"config":1099,"content":1101,"description":396,"extension":1105,"meta":1106,"navigation":400,"path":1107,"seo":1108,"stem":1109,"__hash__":1110},"blogAuthors/en-us/blog/authors/madou-coulibaly.yml",{"template":1100},"BlogAuthor",{"name":7,"config":1102},{"headshot":1103,"ctfId":1104},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679848/Blog/Author%20Headshots/madou-headshot.jpg","madou","yml",{},"/en-us/blog/authors/madou-coulibaly",{},"en-us/blog/authors/madou-coulibaly","B1ujB-U-HU1uDfrGilJbCxfUUm6TJB_H1DRGY_p32OA",[1112,1121,1129],{"title":1113,"description":1114,"heroImage":1115,"category":392,"date":1116,"authors":1117,"slug":1120,"externalUrl":396},"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",[1118,1119],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1122,"description":1123,"heroImage":1124,"category":392,"date":1125,"authors":1126,"slug":1128,"externalUrl":396},"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",[1127],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1130,"description":1131,"heroImage":1132,"category":392,"date":1133,"authors":1134,"slug":1136,"externalUrl":396},"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",[1135],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1138},[1139,1153,1165,1177],{"id":1140,"categories":1141,"header":1143,"text":1144,"button":1145,"image":1150},"ai-modernization",[1142],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1146,"config":1147},"Get your AI maturity score",{"href":1148,"dataGaName":1149,"dataGaLocation":625},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1151},{"src":1152},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1154,"categories":1155,"header":1157,"text":1144,"button":1158,"image":1162},"devops-modernization",[1156,962],"product","Are you just managing tools or shipping innovation?",{"text":1159,"config":1160},"Get your DevOps maturity score",{"href":1161,"dataGaName":1149,"dataGaLocation":625},"/assessments/devops-modernization-assessment/",{"config":1163},{"src":1164},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1166,"categories":1167,"header":1169,"text":1144,"button":1170,"image":1174},"security-modernization",[1168],"security","Are you trading speed for security?",{"text":1171,"config":1172},"Get your security maturity score",{"href":1173,"dataGaName":1149,"dataGaLocation":625},"/assessments/security-modernization-assessment/",{"config":1175},{"src":1176},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1178,"paths":1179,"header":1182,"text":1183,"button":1184,"image":1189},"github-azure-migration",[1180,1181],"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":1185,"config":1186},"See how GitLab compares to GitHub",{"href":1187,"dataGaName":1188,"dataGaLocation":625},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1190},{"src":1164},{"header":1192,"blurb":1193,"button":1194,"secondaryButton":1199},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1195,"config":1196},"Get your free trial",{"href":1197,"dataGaName":426,"dataGaLocation":1198},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":898,"config":1200},{"href":750,"dataGaName":431,"dataGaLocation":1198},1786803773081]