[{"data":1,"prerenderedAt":1452},["ShallowReactive",2],{"/blog/deploy-shopify-themes-with-gitlab":3,"navigation-en-us":667,"banner-en-us":1094,"footer-en-us":1104,"blog-post-authors-en-us-Austin Regnery":1349,"blog-related-posts-en-us-deploy-shopify-themes-with-gitlab":1363,"blog-promotions-en-us":1389,"next-steps-en-us":1443},{"id":4,"title":5,"authors":6,"body":8,"category":648,"date":649,"description":650,"extension":651,"externalUrl":652,"faq":652,"featured":653,"heroImage":654,"meta":655,"navigation":262,"path":656,"seo":657,"slug":661,"stem":662,"tags":663,"template":665,"updatedDate":652,"__hash__":666},"blogPosts/en-us/blog/deploy-shopify-themes-with-gitlab.md","How to deploy Shopify themes with GitLab",[7],"Austin Regnery",{"type":9,"value":10,"toc":640},"minimark",[11,21,43,48,57,89,109,177,192,200,206,300,308,314,500,509,513,519,545,548,582,636],[12,13,14,20],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://backlinko.com/shopify-stores",[],"1.75 million sellers are using Shopify's eCommerce platform",", and every one of these online stores has a codebase that lives somewhere. You may have encountered some challenges while scaling your development efforts at your organization while working within Shopify. Setting up a process for repeatable deployments with GitLab can keep everything streamlined and safe. No one wants something going live in production before it's ready.\nHere's a simple development flow you are going to be able to replicate using GitLab CI/CD pipelines for Shopify theme deployments.",[22,23,24,28,40],"ol",{},[25,26,27],"li",{},"Develop locally on a feature branch until you are happy with your local changes",[25,29,30,31,35,36,39],{},"Merge your ",[32,33,34],"code",{},"feature"," branch into your ",[32,37,38],{},"main"," branch → This will update the staging theme in Shopify",[25,41,42],{},"When everything is ready to go live, create a new tag and push it to GitLab → The live theme will be updated automatically 🎉\nThis tutorial assumes you have set up a repository in a GitLab project.",[44,45,47],"h2",{"id":46},"_1-add-your-variables","1. Add your variables",[12,49,50,51,56],{},"For security purposes, you don't want to store your credentials for your Shopify site in your configuration file. You can use variables in GitLab to handle that.\nUse the ",[15,52,55],{"href":53,"rel":54},"https://shopify.github.io/themekit/configuration/",[],"ThemeKit CLI"," to retrieve all the available theme IDs from your Shopify store by entering this into your command line:",[58,59,64],"pre",{"className":60,"code":61,"language":62,"meta":63,"style":63},"language-shell shiki shiki-themes github-light","theme get --list -p=[shopify-api-access-token] -s=[your-store.myshopify.com]\n","shell","",[32,65,66],{"__ignoreMap":63},[67,68,71,75,79,83,86],"span",{"class":69,"line":70},"line",1,[67,72,74],{"class":73},"s7eDp","theme",[67,76,78],{"class":77},"sYBdl"," get",[67,80,82],{"class":81},"sYu0t"," --list",[67,84,85],{"class":81}," -p=[shopify-api-access-token]",[67,87,88],{"class":81}," -s=[your-store.myshopify.com]\n",[90,91,92],"blockquote",{},[12,93,94,98,99,104,105,108],{},[95,96,97],"strong",{},"Help:"," ",[15,100,103],{"href":101,"rel":102},"https://shopify.dev/apps/auth/basic-http#step-2-generate-api-credentials",[],"Generate API credentials in Shopify","\nOpen your project in GitLab, navigate to ",[32,106,107],{},"/settings/ci_cd",", and open the variables section.\nAdd four unique variables with their corresponding keys and values",[110,111,112,125],"table",{},[113,114,115],"thead",{},[116,117,118,122],"tr",{},[119,120,121],"th",{},"Key",[119,123,124],{},"Value",[126,127,128,141,153,165],"tbody",{},[116,129,130,136],{},[131,132,133],"td",{},[32,134,135],{},"STAGING_THEME_ID",[131,137,138],{},[67,139,140],{},"staging-theme-id-number",[116,142,143,148],{},[131,144,145],{},[32,146,147],{},"PRODUCTION_THEME_ID",[131,149,150],{},[67,151,152],{},"production-theme-id-number",[116,154,155,160],{},[131,156,157],{},[32,158,159],{},"SHOP_WEB_ADDRESS",[131,161,162],{},[67,163,164],{},"your-store.myshopify.com",[116,166,167,172],{},[131,168,169],{},[32,170,171],{},"SHOPIFY_API_ACCESS_TOKEN",[131,173,174],{},[67,175,176],{},"shopify-api-access-token",[90,178,179],{},[12,180,181,184,185,187,188,191],{},[95,182,183],{},"Note:"," A protected variable will not show in the CI logs, which adds an extra layer of security. If you choose to protect your variables, you need to make sure that your ",[32,186,38],{}," branch and the tag ",[32,189,190],{},"v*"," wildcard are protected as well.",[44,193,195,196,199],{"id":194},"_2-add-a-configyml-to-your-project-repository","2. Add a ",[32,197,198],{},"config.yml"," to your project repository",[12,201,202,203,205],{},"This file may already exist, but ",[32,204,198],{}," needs to have the following to properly map the variables from step 1 with your Shopify theme for deployments.",[58,207,211],{"className":208,"code":209,"language":210,"meta":63,"style":63},"language-yml shiki shiki-themes github-light","staging:\n  password: ${SHOPIFY_API_ACCESS_TOKEN}\n  theme_id: ${STAGING_THEME_ID}\n  store: ${SHOP_WEB_ADDRESS}\n\nproduction:\n  password: ${SHOPIFY_API_ACCESS_TOKEN}\n  theme_id: ${PRODUCTION_THEME_ID}\n  store: ${SHOP_WEB_ADDRESS}\n","yml",[32,212,213,223,235,246,257,264,272,281,291],{"__ignoreMap":63},[67,214,215,219],{"class":69,"line":70},[67,216,218],{"class":217},"shJU0","staging",[67,220,222],{"class":221},"sgsFI",":\n",[67,224,226,229,232],{"class":69,"line":225},2,[67,227,228],{"class":217},"  password",[67,230,231],{"class":221},": ",[67,233,234],{"class":77},"${SHOPIFY_API_ACCESS_TOKEN}\n",[67,236,238,241,243],{"class":69,"line":237},3,[67,239,240],{"class":217},"  theme_id",[67,242,231],{"class":221},[67,244,245],{"class":77},"${STAGING_THEME_ID}\n",[67,247,249,252,254],{"class":69,"line":248},4,[67,250,251],{"class":217},"  store",[67,253,231],{"class":221},[67,255,256],{"class":77},"${SHOP_WEB_ADDRESS}\n",[67,258,260],{"class":69,"line":259},5,[67,261,263],{"emptyLinePlaceholder":262},true,"\n",[67,265,267,270],{"class":69,"line":266},6,[67,268,269],{"class":217},"production",[67,271,222],{"class":221},[67,273,275,277,279],{"class":69,"line":274},7,[67,276,228],{"class":217},[67,278,231],{"class":221},[67,280,234],{"class":77},[67,282,284,286,288],{"class":69,"line":283},8,[67,285,240],{"class":217},[67,287,231],{"class":221},[67,289,290],{"class":77},"${PRODUCTION_THEME_ID}\n",[67,292,294,296,298],{"class":69,"line":293},9,[67,295,251],{"class":217},[67,297,231],{"class":221},[67,299,256],{"class":77},[44,301,303,304,307],{"id":302},"_3-add-a-gitlab-ciyml-file-to-your-project","3. Add a ",[32,305,306],{},".gitlab-ci.yml"," file to your project",[12,309,310,311,313],{},"Now set up your pipeline to run on specific triggers. Go to your local theme folder, create a ",[32,312,306],{}," file at the project root, and add the snippet below. This snippet is the configuration for the CI pipeline.",[58,315,317],{"className":208,"code":316,"language":210,"meta":63,"style":63},"image: python:2\n\nstages:\n  - staging\n  - production\n\nstaging:\n  image: python:2\n  stage: staging\n  script:\n    - curl -s https://shopify.github.io/themekit/scripts/install.py | python\n    - theme deploy -e=staging\n  only:\n    variables:\n      - $CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH\n\nproduction:\n  image: python:2\n  stage: production\n  script:\n    - curl -s https://shopify.github.io/themekit/scripts/install.py | python\n    - theme deploy -e=production --allow-live\n  only:\n    - tags\n\n",[32,318,319,329,333,340,348,355,359,365,374,383,391,400,408,416,424,433,438,445,454,463,470,477,485,492],{"__ignoreMap":63},[67,320,321,324,326],{"class":69,"line":70},[67,322,323],{"class":217},"image",[67,325,231],{"class":221},[67,327,328],{"class":77},"python:2\n",[67,330,331],{"class":69,"line":225},[67,332,263],{"emptyLinePlaceholder":262},[67,334,335,338],{"class":69,"line":237},[67,336,337],{"class":217},"stages",[67,339,222],{"class":221},[67,341,342,345],{"class":69,"line":248},[67,343,344],{"class":221},"  - ",[67,346,347],{"class":77},"staging\n",[67,349,350,352],{"class":69,"line":259},[67,351,344],{"class":221},[67,353,354],{"class":77},"production\n",[67,356,357],{"class":69,"line":266},[67,358,263],{"emptyLinePlaceholder":262},[67,360,361,363],{"class":69,"line":274},[67,362,218],{"class":217},[67,364,222],{"class":221},[67,366,367,370,372],{"class":69,"line":283},[67,368,369],{"class":217},"  image",[67,371,231],{"class":221},[67,373,328],{"class":77},[67,375,376,379,381],{"class":69,"line":293},[67,377,378],{"class":217},"  stage",[67,380,231],{"class":221},[67,382,347],{"class":77},[67,384,386,389],{"class":69,"line":385},10,[67,387,388],{"class":217},"  script",[67,390,222],{"class":221},[67,392,394,397],{"class":69,"line":393},11,[67,395,396],{"class":221},"    - ",[67,398,399],{"class":77},"curl -s https://shopify.github.io/themekit/scripts/install.py | python\n",[67,401,403,405],{"class":69,"line":402},12,[67,404,396],{"class":221},[67,406,407],{"class":77},"theme deploy -e=staging\n",[67,409,411,414],{"class":69,"line":410},13,[67,412,413],{"class":217},"  only",[67,415,222],{"class":221},[67,417,419,422],{"class":69,"line":418},14,[67,420,421],{"class":217},"    variables",[67,423,222],{"class":221},[67,425,427,430],{"class":69,"line":426},15,[67,428,429],{"class":221},"      - ",[67,431,432],{"class":77},"$CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH\n",[67,434,436],{"class":69,"line":435},16,[67,437,263],{"emptyLinePlaceholder":262},[67,439,441,443],{"class":69,"line":440},17,[67,442,269],{"class":217},[67,444,222],{"class":221},[67,446,448,450,452],{"class":69,"line":447},18,[67,449,369],{"class":217},[67,451,231],{"class":221},[67,453,328],{"class":77},[67,455,457,459,461],{"class":69,"line":456},19,[67,458,378],{"class":217},[67,460,231],{"class":221},[67,462,354],{"class":77},[67,464,466,468],{"class":69,"line":465},20,[67,467,388],{"class":217},[67,469,222],{"class":221},[67,471,473,475],{"class":69,"line":472},21,[67,474,396],{"class":221},[67,476,399],{"class":77},[67,478,480,482],{"class":69,"line":479},22,[67,481,396],{"class":221},[67,483,484],{"class":77},"theme deploy -e=production --allow-live\n",[67,486,488,490],{"class":69,"line":487},23,[67,489,413],{"class":217},[67,491,222],{"class":221},[67,493,495,497],{"class":69,"line":494},24,[67,496,396],{"class":221},[67,498,499],{"class":77},"tags\n",[12,501,502,503,505,506,508],{},"It has two stages: ",[95,504,218],{}," and ",[95,507,269],{},". Each will install the ThemeKit CLI first and then deploy the repository to the corresponding theme.",[44,510,512],{"id":511},"_4-now-push-some-changes-to-deploy","4. Now push some changes to deploy",[12,514,515,516,518],{},"Any code pushed to the ",[32,517,38],{}," branch will set up a deployment to the staging theme in Shopify",[58,520,522],{"className":60,"code":521,"language":62,"meta":63,"style":63},"git commit -am \"commit message\"\ngit push\n",[32,523,524,538],{"__ignoreMap":63},[67,525,526,529,532,535],{"class":69,"line":70},[67,527,528],{"class":73},"git",[67,530,531],{"class":77}," commit",[67,533,534],{"class":81}," -am",[67,536,537],{"class":77}," \"commit message\"\n",[67,539,540,542],{"class":69,"line":225},[67,541,528],{"class":73},[67,543,544],{"class":77}," push\n",[12,546,547],{},"When you are ready to push changes to production, add a tag and push it.",[58,549,551],{"className":60,"code":550,"language":62,"meta":63,"style":63},"git tag -a \"v1.0.0\" -m \"First release to production from GitLab\"\ngit push --tags\n",[32,552,553,572],{"__ignoreMap":63},[67,554,555,557,560,563,566,569],{"class":69,"line":70},[67,556,528],{"class":73},[67,558,559],{"class":77}," tag",[67,561,562],{"class":81}," -a",[67,564,565],{"class":77}," \"v1.0.0\"",[67,567,568],{"class":81}," -m",[67,570,571],{"class":77}," \"First release to production from GitLab\"\n",[67,573,574,576,579],{"class":69,"line":225},[67,575,528],{"class":73},[67,577,578],{"class":77}," push",[67,580,581],{"class":81}," --tags\n",[90,583,584],{},[12,585,586,98,589,594,595,599,600,604,605,609,610,615,616,618,619,624,625,630,631],{},[95,587,588],{},"Alternative option:",[15,590,593],{"href":591,"rel":592},"https://docs.gitlab.com/user/project/releases/#create-a-release-in-the-tags-page",[],"Create a tag from GitLab","\nThat's it! You're now using CI to automate deployments from GitLab to your Shopify themes.\nFurther refine this workflow by ",[15,596,598],{"href":597},"/blog/feature-highlight-merge-request-approvals/","incorporating merge requests approvals",", ",[15,601,603],{"href":602},"/blog/merge-trains-explained/","setting up merge trains",", or learning more about ",[15,606,608],{"href":607},"/blog/guide-to-ci-cd-pipelines/","GitLab CI/CD pipelines",".\nBig thanks to Alex Gogl for their ",[15,611,614],{"href":612,"rel":613},"https://medium.com/@gogl.alex/how-to-deploy-shopify-themes-automatically-1ac17ee1229c",[],"blog",". This ",[32,617,306],{}," will appear as an available template when ",[15,620,623],{"href":621,"rel":622},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52279",[],"merge request !52279"," is merged.\nCover image by ",[15,626,629],{"href":627,"rel":628},"https://unsplash.com/@tmwd?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Artem Gavrysh"," on ",[15,632,635],{"href":633,"rel":634},"https://unsplash.com/",[],"Unsplash",[637,638,639],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}",{"title":63,"searchDepth":225,"depth":225,"links":641},[642,643,645,647],{"id":46,"depth":225,"text":47},{"id":194,"depth":225,"text":644},"2. Add a config.yml to your project repository",{"id":302,"depth":225,"text":646},"3. Add a .gitlab-ci.yml file to your project",{"id":511,"depth":225,"text":512},"engineering","2022-04-14","Streamline your development workflow by configuring auto deployments for Shopify themes with GitLab pipelines.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749683288/Blog/Hero%20Images/storefront.jpg",{},"/en-us/blog/deploy-shopify-themes-with-gitlab",{"title":5,"description":650,"ogTitle":5,"ogDescription":650,"noIndex":653,"ogImage":654,"ogUrl":658,"ogSiteName":659,"ogType":660,"canonicalUrls":658},"https://about.gitlab.com/blog/deploy-shopify-themes-with-gitlab","https://about.gitlab.com","article","deploy-shopify-themes-with-gitlab","en-us/blog/deploy-shopify-themes-with-gitlab",[664],"tutorial","BlogPost","z-C_slmEjKsWT_LR98IsWS6Y2QMNVGJBww5MCv41JQI",{"logo":668,"freeTrial":673,"sales":678,"login":683,"items":688,"search":1014,"minimal":1045,"duo":1064,"switchNav":1073,"pricingDeployment":1084},{"config":669},{"href":670,"dataGaName":671,"dataGaLocation":672},"/","gitlab logo","header",{"text":674,"config":675},"Get free trial",{"href":676,"dataGaName":677,"dataGaLocation":672},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":679,"config":680},"Request a demo",{"href":681,"dataGaName":682,"dataGaLocation":672},"/sales/?contact-topic=request-demo","sales",{"text":684,"config":685},"Sign in",{"href":686,"dataGaName":687,"dataGaLocation":672},"https://gitlab.com/users/sign_in/","sign in",[689,718,818,823,936,992],{"text":690,"config":691,"menu":693},"Platform",{"dataNavLevelOne":692},"platform",{"type":694,"columns":695},"cards",[696,702,710],{"title":690,"description":697,"link":698},"The intelligent orchestration platform for DevSecOps",{"text":699,"config":700},"Explore our Platform",{"href":701,"dataGaName":692,"dataGaLocation":672},"/platform/",{"title":703,"description":704,"link":705},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":706,"config":707},"Meet GitLab Duo",{"href":708,"dataGaName":709,"dataGaLocation":672},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":711,"description":712,"link":713},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":714,"config":715},"Learn more",{"href":716,"dataGaName":717,"dataGaLocation":672},"/why-gitlab/","why gitlab",{"text":719,"left":262,"config":720,"menu":722},"Product",{"dataNavLevelOne":721},"solutions",{"type":723,"link":724,"columns":728,"feature":797},"lists",{"text":725,"config":726},"View all Solutions",{"href":727,"dataGaName":721,"dataGaLocation":672},"/solutions/",[729,753,776],{"title":730,"description":731,"link":732,"items":737},"Automation","CI/CD and automation to accelerate deployment",{"config":733},{"icon":734,"href":735,"dataGaName":736,"dataGaLocation":672},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[738,742,745,749],{"text":739,"config":740},"CI/CD",{"href":741,"dataGaLocation":672,"dataGaName":739},"/solutions/continuous-integration/",{"text":703,"config":743},{"href":708,"dataGaLocation":672,"dataGaName":744},"gitlab duo agent platform - product menu",{"text":746,"config":747},"Source Code Management",{"href":748,"dataGaLocation":672,"dataGaName":746},"/solutions/source-code-management/",{"text":750,"config":751},"Automated Software Delivery",{"href":735,"dataGaLocation":672,"dataGaName":752},"Automated software delivery",{"title":754,"description":755,"link":756,"items":761},"Security","Deliver code faster without compromising security",{"config":757},{"href":758,"dataGaName":759,"dataGaLocation":672,"icon":760},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[762,766,771],{"text":763,"config":764},"Application Security Testing",{"href":758,"dataGaName":765,"dataGaLocation":672},"Application security testing",{"text":767,"config":768},"Software Supply Chain Security",{"href":769,"dataGaLocation":672,"dataGaName":770},"/solutions/supply-chain/","Software supply chain security",{"text":772,"config":773},"Software Compliance",{"href":774,"dataGaName":775,"dataGaLocation":672},"/solutions/software-compliance/","software compliance",{"title":777,"link":778,"items":783},"Measurement",{"config":779},{"icon":780,"href":781,"dataGaName":782,"dataGaLocation":672},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[784,788,792],{"text":785,"config":786},"Visibility & Measurement",{"href":781,"dataGaLocation":672,"dataGaName":787},"Visibility and Measurement",{"text":789,"config":790},"Value Stream Management",{"href":791,"dataGaLocation":672,"dataGaName":789},"/solutions/value-stream-management/",{"text":793,"config":794},"Analytics & Insights",{"href":795,"dataGaLocation":672,"dataGaName":796},"/solutions/analytics-and-insights/","Analytics and insights",{"title":798,"type":723,"items":799},"GitLab for",[800,806,812],{"text":801,"config":802},"Enterprise",{"icon":803,"href":804,"dataGaLocation":672,"dataGaName":805},"Building","/enterprise/","enterprise",{"text":807,"config":808},"Small Business",{"icon":809,"href":810,"dataGaLocation":672,"dataGaName":811},"Work","/small-business/","small business",{"text":813,"config":814},"Public Sector",{"icon":815,"href":816,"dataGaLocation":672,"dataGaName":817},"Organization","/solutions/public-sector/","public sector",{"text":819,"config":820},"Pricing",{"href":821,"dataGaName":822,"dataGaLocation":672,"dataNavLevelOne":822},"/pricing/","pricing",{"text":824,"config":825,"menu":827},"Resources",{"dataNavLevelOne":826},"resources",{"type":723,"link":828,"columns":832,"feature":925},{"text":829,"config":830},"View all resources",{"href":831,"dataGaName":826,"dataGaLocation":672},"/resources/",[833,866,892],{"title":834,"items":835},"Getting started",[836,841,846,851,856,861],{"text":837,"config":838},"Install",{"href":839,"dataGaName":840,"dataGaLocation":672},"/install/","install",{"text":842,"config":843},"Quick start guides",{"href":844,"dataGaName":845,"dataGaLocation":672},"/get-started/","quick setup checklists",{"text":847,"config":848},"Learn",{"href":849,"dataGaLocation":672,"dataGaName":850},"https://university.gitlab.com/","learn",{"text":852,"config":853},"Product documentation",{"href":854,"dataGaName":855,"dataGaLocation":672},"https://docs.gitlab.com/","product documentation",{"text":857,"config":858},"Best practice videos",{"href":859,"dataGaName":860,"dataGaLocation":672},"/getting-started-videos/","best practice videos",{"text":862,"config":863},"Integrations",{"href":864,"dataGaName":865,"dataGaLocation":672},"/integrations/","integrations",{"title":867,"items":868},"Discover",[869,874,878,883,887],{"text":870,"config":871},"Customer success stories",{"href":872,"dataGaName":873,"dataGaLocation":672},"/customers/","customer success stories",{"text":875,"config":876},"Blog",{"href":877,"dataGaName":614,"dataGaLocation":672},"/blog/",{"text":879,"config":880},"Demo Hub",{"href":881,"dataGaName":882,"dataGaLocation":672},"/demo-hub/","demo hub",{"text":884,"config":885},"The Source",{"href":886,"dataGaName":614,"dataGaLocation":672},"/the-source/",{"text":888,"config":889},"Remote",{"href":890,"dataGaName":891,"dataGaLocation":672},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":893,"items":894},"Connect",[895,900,905,910,915,920],{"text":896,"config":897},"GitLab Services",{"href":898,"dataGaName":899,"dataGaLocation":672},"/services/","services",{"text":901,"config":902},"Contribute",{"href":903,"dataGaName":904,"dataGaLocation":672},"https://contributors.gitlab.com","contribute",{"text":906,"config":907},"Community",{"href":908,"dataGaName":909,"dataGaLocation":672},"/community/","community",{"text":911,"config":912},"Forum",{"href":913,"dataGaName":914,"dataGaLocation":672},"https://forum.gitlab.com/","forum",{"text":916,"config":917},"Events",{"href":918,"dataGaName":919,"dataGaLocation":672},"/events/","events",{"text":921,"config":922},"Partners",{"href":923,"dataGaName":924,"dataGaLocation":672},"/partners/","partners",{"config":926,"title":929,"text":930,"link":931},{"background":927,"textColor":928},"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":932,"config":933},"Read the latest",{"href":934,"dataGaName":935,"dataGaLocation":672},"/whats-new/","whats new",{"text":937,"config":938,"menu":940},"Company",{"dataNavLevelOne":939},"company",{"type":723,"columns":941},[942],{"items":943},[944,949,955,957,962,967,972,977,982,987],{"text":945,"config":946},"About",{"href":947,"dataGaName":948,"dataGaLocation":672},"/company/","about",{"text":950,"config":951,"footerGa":954},"Jobs",{"href":952,"dataGaName":953,"dataGaLocation":672},"/jobs/","jobs",{"dataGaName":953},{"text":916,"config":956},{"href":918,"dataGaName":919,"dataGaLocation":672},{"text":958,"config":959},"Leadership",{"href":960,"dataGaName":961,"dataGaLocation":672},"/company/team/e-group/","leadership",{"text":963,"config":964},"Handbook",{"href":965,"dataGaName":966,"dataGaLocation":672},"https://handbook.gitlab.com/","handbook",{"text":968,"config":969},"Investor relations",{"href":970,"dataGaName":971,"dataGaLocation":672},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":973,"config":974},"Trust Center",{"href":975,"dataGaName":976,"dataGaLocation":672},"/security/","trust center",{"text":978,"config":979},"AI Transparency Center",{"href":980,"dataGaName":981,"dataGaLocation":672},"/ai-transparency-center/","ai transparency center",{"text":983,"config":984},"Newsletter",{"href":985,"dataGaName":986,"dataGaLocation":672},"/company/contact/#contact-forms","newsletter",{"text":988,"config":989},"Press",{"href":990,"dataGaName":991,"dataGaLocation":672},"/press/","press",{"text":993,"config":994,"menu":995},"Contact us",{"dataNavLevelOne":939},{"type":723,"columns":996},[997],{"items":998},[999,1004,1009],{"text":1000,"config":1001},"Talk to sales",{"href":1002,"dataGaName":1003,"dataGaLocation":672},"/sales/","talk to sales",{"text":1005,"config":1006},"Support portal",{"href":1007,"dataGaName":1008,"dataGaLocation":672},"https://support.gitlab.com/hc/en-us","support portal",{"text":1010,"config":1011},"Customer portal",{"href":1012,"dataGaName":1013,"dataGaLocation":672},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1015,"login":1016,"suggestions":1023},"Close",{"text":1017,"link":1018},"To search repositories and projects, login to",{"text":1019,"config":1020},"gitlab.com",{"href":686,"dataGaName":1021,"dataGaLocation":1022},"search login","search",{"text":1024,"default":1025},"Suggestions",[1026,1028,1032,1034,1038,1042],{"text":703,"config":1027},{"href":708,"dataGaName":703,"dataGaLocation":1022},{"text":1029,"config":1030},"Code Suggestions (AI)",{"href":1031,"dataGaName":1029,"dataGaLocation":1022},"/solutions/code-suggestions/",{"text":739,"config":1033},{"href":741,"dataGaName":739,"dataGaLocation":1022},{"text":1035,"config":1036},"GitLab on AWS",{"href":1037,"dataGaName":1035,"dataGaLocation":1022},"/partners/technology-partners/aws/",{"text":1039,"config":1040},"GitLab on Google Cloud",{"href":1041,"dataGaName":1039,"dataGaLocation":1022},"/partners/technology-partners/google-cloud-platform/",{"text":1043,"config":1044},"Why GitLab?",{"href":716,"dataGaName":1043,"dataGaLocation":1022},{"freeTrial":1046,"mobileIcon":1051,"desktopIcon":1056,"secondaryButton":1059},{"text":1047,"config":1048},"Start free trial",{"href":1049,"dataGaName":677,"dataGaLocation":1050},"https://gitlab.com/-/trials/new/","nav",{"altText":1052,"config":1053},"Gitlab Icon",{"src":1054,"dataGaName":1055,"dataGaLocation":1050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1052,"config":1057},{"src":1058,"dataGaName":1055,"dataGaLocation":1050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1060,"config":1061},"Get Started",{"href":1062,"dataGaName":1063,"dataGaLocation":1050},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1065,"mobileIcon":1069,"desktopIcon":1071},{"text":1066,"config":1067},"Learn more about GitLab Duo",{"href":708,"dataGaName":1068,"dataGaLocation":1050},"gitlab duo",{"altText":1052,"config":1070},{"src":1054,"dataGaName":1055,"dataGaLocation":1050},{"altText":1052,"config":1072},{"src":1058,"dataGaName":1055,"dataGaLocation":1050},{"button":1074,"mobileIcon":1079,"desktopIcon":1081},{"text":1075,"config":1076},"/switch",{"href":1077,"dataGaName":1078,"dataGaLocation":1050},"#contact","switch",{"altText":1052,"config":1080},{"src":1054,"dataGaName":1055,"dataGaLocation":1050},{"altText":1052,"config":1082},{"src":1083,"dataGaName":1055,"dataGaLocation":1050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1085,"mobileIcon":1090,"desktopIcon":1092},{"text":1086,"config":1087},"Back to pricing",{"href":821,"dataGaName":1088,"dataGaLocation":1050,"icon":1089},"back to pricing","GoBack",{"altText":1052,"config":1091},{"src":1054,"dataGaName":1055,"dataGaLocation":1050},{"altText":1052,"config":1093},{"src":1058,"dataGaName":1055,"dataGaLocation":1050},{"title":1095,"titleMobile":1096,"button":1097,"config":1102},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":714,"config":1098},{"href":1099,"dataGaName":1100,"dataGaLocation":1101},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1103,"disabled":653},"release",{"data":1105},{"text":1106,"source":1107,"edit":1113,"contribute":1118,"config":1123,"items":1128,"minimal":1338},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1108,"config":1109},"View page source",{"href":1110,"dataGaName":1111,"dataGaLocation":1112},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1114,"config":1115},"Edit this page",{"href":1116,"dataGaName":1117,"dataGaLocation":1112},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1119,"config":1120},"Please contribute",{"href":1121,"dataGaName":1122,"dataGaLocation":1112},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1124,"facebook":1125,"youtube":1126,"linkedin":1127},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1129,1176,1230,1274,1306],{"title":819,"links":1130,"subMenu":1145},[1131,1135,1140],{"text":1132,"config":1133},"View plans",{"href":821,"dataGaName":1134,"dataGaLocation":1112},"view plans",{"text":1136,"config":1137},"Why Premium?",{"href":1138,"dataGaName":1139,"dataGaLocation":1112},"/pricing/premium/","why premium",{"text":1141,"config":1142},"Why Ultimate?",{"href":1143,"dataGaName":1144,"dataGaLocation":1112},"/pricing/ultimate/","why ultimate",[1146],{"title":1147,"links":1148},"Contact Us",[1149,1152,1154,1156,1161,1166,1171],{"text":1150,"config":1151},"Contact sales",{"href":1002,"dataGaName":682,"dataGaLocation":1112},{"text":1005,"config":1153},{"href":1007,"dataGaName":1008,"dataGaLocation":1112},{"text":1010,"config":1155},{"href":1012,"dataGaName":1013,"dataGaLocation":1112},{"text":1157,"config":1158},"Status",{"href":1159,"dataGaName":1160,"dataGaLocation":1112},"https://status.gitlab.com/","status",{"text":1162,"config":1163},"Terms of use",{"href":1164,"dataGaName":1165,"dataGaLocation":1112},"/terms/","terms of use",{"text":1167,"config":1168},"Privacy statement",{"href":1169,"dataGaName":1170,"dataGaLocation":1112},"/privacy/","privacy statement",{"text":1172,"config":1173},"Cookie preferences",{"dataGaName":1174,"dataGaLocation":1112,"id":1175,"isOneTrustButton":262},"cookie preferences","ot-sdk-btn",{"title":719,"links":1177,"subMenu":1186},[1178,1182],{"text":1179,"config":1180},"DevSecOps platform",{"href":701,"dataGaName":1181,"dataGaLocation":1112},"devsecops platform",{"text":1183,"config":1184},"AI-Assisted Development",{"href":708,"dataGaName":1185,"dataGaLocation":1112},"ai-assisted development",[1187],{"title":1188,"links":1189},"Topics",[1190,1195,1200,1205,1210,1215,1220,1225],{"text":1191,"config":1192},"CICD",{"href":1193,"dataGaName":1194,"dataGaLocation":1112},"/topics/ci-cd/","cicd",{"text":1196,"config":1197},"GitOps",{"href":1198,"dataGaName":1199,"dataGaLocation":1112},"/topics/gitops/","gitops",{"text":1201,"config":1202},"DevOps",{"href":1203,"dataGaName":1204,"dataGaLocation":1112},"/topics/devops/","devops",{"text":1206,"config":1207},"Version Control",{"href":1208,"dataGaName":1209,"dataGaLocation":1112},"/topics/version-control/","version control",{"text":1211,"config":1212},"DevSecOps",{"href":1213,"dataGaName":1214,"dataGaLocation":1112},"/topics/devsecops/","devsecops",{"text":1216,"config":1217},"Cloud Native",{"href":1218,"dataGaName":1219,"dataGaLocation":1112},"/topics/cloud-native/","cloud native",{"text":1221,"config":1222},"AI for Coding",{"href":1223,"dataGaName":1224,"dataGaLocation":1112},"/topics/devops/ai-for-coding/","ai for coding",{"text":1226,"config":1227},"Agentic AI",{"href":1228,"dataGaName":1229,"dataGaLocation":1112},"/topics/agentic-ai/","agentic ai",{"title":1231,"links":1232},"Solutions",[1233,1235,1237,1242,1246,1249,1253,1256,1258,1261,1264,1269],{"text":763,"config":1234},{"href":758,"dataGaName":763,"dataGaLocation":1112},{"text":752,"config":1236},{"href":735,"dataGaName":736,"dataGaLocation":1112},{"text":1238,"config":1239},"Agile development",{"href":1240,"dataGaName":1241,"dataGaLocation":1112},"/solutions/agile-delivery/","agile delivery",{"text":1243,"config":1244},"SCM",{"href":748,"dataGaName":1245,"dataGaLocation":1112},"source code management",{"text":1191,"config":1247},{"href":741,"dataGaName":1248,"dataGaLocation":1112},"continuous integration & delivery",{"text":1250,"config":1251},"Value stream management",{"href":791,"dataGaName":1252,"dataGaLocation":1112},"value stream management",{"text":1196,"config":1254},{"href":1255,"dataGaName":1199,"dataGaLocation":1112},"/solutions/gitops/",{"text":801,"config":1257},{"href":804,"dataGaName":805,"dataGaLocation":1112},{"text":1259,"config":1260},"Small business",{"href":810,"dataGaName":811,"dataGaLocation":1112},{"text":1262,"config":1263},"Public sector",{"href":816,"dataGaName":817,"dataGaLocation":1112},{"text":1265,"config":1266},"Education",{"href":1267,"dataGaName":1268,"dataGaLocation":1112},"/solutions/education/","education",{"text":1270,"config":1271},"Financial services",{"href":1272,"dataGaName":1273,"dataGaLocation":1112},"/solutions/finance/","financial services",{"title":824,"links":1275},[1276,1278,1280,1282,1285,1287,1290,1292,1294,1296,1298,1300,1302,1304],{"text":837,"config":1277},{"href":839,"dataGaName":840,"dataGaLocation":1112},{"text":842,"config":1279},{"href":844,"dataGaName":845,"dataGaLocation":1112},{"text":847,"config":1281},{"href":849,"dataGaName":850,"dataGaLocation":1112},{"text":852,"config":1283},{"href":854,"dataGaName":1284,"dataGaLocation":1112},"docs",{"text":875,"config":1286},{"href":877,"dataGaName":614,"dataGaLocation":1112},{"text":1288,"config":1289},"What's new",{"href":934,"dataGaName":935,"dataGaLocation":1112},{"text":870,"config":1291},{"href":872,"dataGaName":873,"dataGaLocation":1112},{"text":888,"config":1293},{"href":890,"dataGaName":891,"dataGaLocation":1112},{"text":896,"config":1295},{"href":898,"dataGaName":899,"dataGaLocation":1112},{"text":901,"config":1297},{"href":903,"dataGaName":904,"dataGaLocation":1112},{"text":906,"config":1299},{"href":908,"dataGaName":909,"dataGaLocation":1112},{"text":911,"config":1301},{"href":913,"dataGaName":914,"dataGaLocation":1112},{"text":916,"config":1303},{"href":918,"dataGaName":919,"dataGaLocation":1112},{"text":921,"config":1305},{"href":923,"dataGaName":924,"dataGaLocation":1112},{"title":937,"links":1307},[1308,1310,1312,1314,1316,1318,1322,1327,1329,1331,1333],{"text":945,"config":1309},{"href":947,"dataGaName":939,"dataGaLocation":1112},{"text":950,"config":1311},{"href":952,"dataGaName":953,"dataGaLocation":1112},{"text":958,"config":1313},{"href":960,"dataGaName":961,"dataGaLocation":1112},{"text":963,"config":1315},{"href":965,"dataGaName":966,"dataGaLocation":1112},{"text":968,"config":1317},{"href":970,"dataGaName":971,"dataGaLocation":1112},{"text":1319,"config":1320},"Sustainability",{"href":1321,"dataGaName":1319,"dataGaLocation":1112},"/sustainability/",{"text":1323,"config":1324},"Diversity, inclusion and belonging (DIB)",{"href":1325,"dataGaName":1326,"dataGaLocation":1112},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":973,"config":1328},{"href":975,"dataGaName":976,"dataGaLocation":1112},{"text":983,"config":1330},{"href":985,"dataGaName":986,"dataGaLocation":1112},{"text":988,"config":1332},{"href":990,"dataGaName":991,"dataGaLocation":1112},{"text":1334,"config":1335},"Modern Slavery Transparency Statement",{"href":1336,"dataGaName":1337,"dataGaLocation":1112},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1339},[1340,1343,1346],{"text":1341,"config":1342},"Terms",{"href":1164,"dataGaName":1165,"dataGaLocation":1112},{"text":1344,"config":1345},"Cookies",{"dataGaName":1174,"dataGaLocation":1112,"id":1175,"isOneTrustButton":262},{"text":1347,"config":1348},"Privacy",{"href":1169,"dataGaName":1170,"dataGaLocation":1112},[1350],{"id":1351,"title":7,"body":652,"config":1352,"content":1354,"description":652,"extension":210,"meta":1358,"navigation":262,"path":1359,"seo":1360,"stem":1361,"__hash__":1362},"blogAuthors/en-us/blog/authors/austin-regnery.yml",{"template":1353},"BlogAuthor",{"name":7,"config":1355},{"headshot":1356,"ctfId":1357},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679497/Blog/Author%20Headshots/aregnery-headshot.jpg","aregnery",{},"/en-us/blog/authors/austin-regnery",{},"en-us/blog/authors/austin-regnery","illyQYBF_rHu4XKiADks81Qo7pAarIevuxK6SeX-pxs",[1364,1373,1381],{"title":1365,"description":1366,"heroImage":1367,"category":648,"date":1368,"authors":1369,"slug":1372,"externalUrl":652},"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",[1370,1371],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1374,"description":1375,"heroImage":1376,"category":648,"date":1377,"authors":1378,"slug":1380,"externalUrl":652},"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",[1379],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1382,"description":1383,"heroImage":1384,"category":648,"date":1385,"authors":1386,"slug":1388,"externalUrl":652},"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",[1387],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1390},[1391,1405,1417,1429],{"id":1392,"categories":1393,"header":1395,"text":1396,"button":1397,"image":1402},"ai-modernization",[1394],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1398,"config":1399},"Get your AI maturity score",{"href":1400,"dataGaName":1401,"dataGaLocation":614},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1403},{"src":1404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1406,"categories":1407,"header":1409,"text":1396,"button":1410,"image":1414},"devops-modernization",[1408,1214],"product","Are you just managing tools or shipping innovation?",{"text":1411,"config":1412},"Get your DevOps maturity score",{"href":1413,"dataGaName":1401,"dataGaLocation":614},"/assessments/devops-modernization-assessment/",{"config":1415},{"src":1416},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1418,"categories":1419,"header":1421,"text":1396,"button":1422,"image":1426},"security-modernization",[1420],"security","Are you trading speed for security?",{"text":1423,"config":1424},"Get your security maturity score",{"href":1425,"dataGaName":1401,"dataGaLocation":614},"/assessments/security-modernization-assessment/",{"config":1427},{"src":1428},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1430,"paths":1431,"header":1434,"text":1435,"button":1436,"image":1441},"github-azure-migration",[1432,1433],"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":1437,"config":1438},"See how GitLab compares to GitHub",{"href":1439,"dataGaName":1440,"dataGaLocation":614},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1442},{"src":1416},{"header":1444,"blurb":1445,"button":1446,"secondaryButton":1450},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1447,"config":1448},"Get your free trial",{"href":1449,"dataGaName":677,"dataGaLocation":34},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/",{"text":1150,"config":1451},{"href":1002,"dataGaName":682,"dataGaLocation":34},1786803748435]