[{"data":1,"prerenderedAt":1317},["ShallowReactive",2],{"/blog/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects":3,"navigation-en-us":531,"banner-en-us":957,"footer-en-us":967,"blog-post-authors-en-us-Achilleas Pipinellis":1212,"blog-related-posts-en-us-how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects":1227,"blog-promotions-en-us":1253,"next-steps-en-us":1307},{"id":4,"title":5,"authors":6,"body":8,"category":504,"date":505,"description":506,"extension":507,"externalUrl":508,"faq":508,"featured":509,"heroImage":510,"meta":511,"navigation":521,"path":522,"seo":523,"slug":527,"stem":528,"tags":508,"template":529,"updatedDate":508,"__hash__":530},"blogPosts/en-us/blog/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects.md","How to use GitLab CI and MacStadium to build your macOS or iOS projects",[7],"Achilleas Pipinellis",{"type":9,"value":10,"toc":487},"minimark",[11,29,55,58,63,70,72,77,86,89,109,132,135,139,142,156,173,177,187,190,226,229,232,236,247,269,272,276,286,292,296,299,369,372,376,379,401,403,406,410,413,429,433,452,456,462,465,467,473,475,483],[12,13,14,15,22,23,28],"p",{},"In this article, we will see how to get started with\n",[16,17,21],"a",{"href":18,"rel":19,"title":20},"https://www.macstadium.com",[],"MacStadium website","MacStadium",",\na provider that offers dedicated Mac hardware which you can use with\n",[16,24,27],{"href":25,"title":26},"/solutions/continuous-integration/","GitLab CI/CD feature page","GitLab CI","\nand build your macOS or iOS application.",[12,30,31,36,37,43,44,54],{},[16,32,35],{"href":33,"title":34},"/blog/continuous-integration-delivery-and-deployment-with-gitlab/","Blog on CI/CD with GitLab","Continuous Integration and Delivery with GitLab","\nis easier if you are developing your application on Linux. All you need to do is\nfind a provider, spin up a VM, install ",[16,38,42],{"href":39,"rel":40,"title":41},"https://docs.gitlab.com/runner/",[],"GitLab Runner docs","GitLab Runner","\non it and configure your project's ",[16,45,49,53],{"href":46,"rel":47,"title":48},"https://docs.gitlab.com/ci/yaml/",[],".gitlab-ci.yml reference guide",[50,51,52],"code",{},".gitlab-ci.yml"," file",".\nOn macOS on the other hand, things may not be that easy. Finding a provider that\noffers a Mac machine that will be online 24/7 can be hard. MacStadium is here to\nhelp achieve that goal and offers a discount to all GitLab users. Let's see how\nto make this happen.",[56,57],"hr",{},[59,60,62],"h3",{"id":61},"on-this-page","On this page",[64,65,66],"ul",{},[67,68,69],"li",{},"TOC",[56,71],{},[73,74,76],"h2",{"id":75},"choosing-a-mac-mini-plan","Choosing a Mac mini plan",[12,78,79,80,85],{},"The first step is to choose a plan. MacStadium offers many options, so you can\npick whatever fits your needs. A ",[16,81,84],{"href":82,"rel":83},"https://www.macstadium.com/mac-mini/#products",[],"Mac mini","\nis perfect to test things out and is a good first choice. It should be enough\nto get you started, but depending on your needs you may have to upgrade to a\nmore beefy machine.",[12,87,88],{},"Depending on your location and project needs, you have to:",[90,91,92,95,98,101],"ol",{},[67,93,94],{},"Choose the datacenter",[67,96,97],{},"Choose the Mac mini",[67,99,100],{},"Choose the macOS version",[67,102,103,104,108],{},"Click ",[105,106,107],"strong",{},"Start Trial"," (24 hours) on the Mac mini of your choice to get going\nin a few steps",[12,110,111,112,118,119,122,123,127,128,131],{},"At first you'll be asked to ",[16,113,117],{"href":114,"rel":115,"title":116},"http://help.macstadium.com/accounts-and-billing/how-to-create-an-account.html",[],"How to create an account on MacStadium","create a MacStadium account","\nFill in your information and when in the ",[105,120,121],{},"Secure Checkout"," page, be sure to\ncheck the ",[124,125,126],"em",{},"I want to use a coupon code"," option and use ",[50,129,130],{},"GITLAB10"," for 10% off.",[12,133,134],{},"At the time of this writing, the staged machines come with macOS 10.12.2. As\nnew releases com from Apple, MacStadium tests them thoroughly and then update\ntheir staged machines. Of course, as a customer you can run the OS update on\nyour own machine anytime.",[73,136,138],{"id":137},"connecting-to-the-mac-mini","Connecting to the Mac mini",[12,140,141],{},"When you sign up, you'll receive an email with two important pieces of\ninformation:",[90,143,144,150],{},[67,145,146,149],{},[105,147,148],{},"The static IP address of your Mac.","\nThis will allow you to find your Mac mini from anywhere in the world, and\nyou can also point domain names to this IP address so it's easier to remember.",[67,151,152,155],{},[105,153,154],{},"The username and password to access the machine.","\nThe user is standard for all installs, but the password is randomly\ngenerated. Upon the first login, you can and are encouraged to change it.",[12,157,158,159,165,166,172],{},"After you have this information, there are two ways of connecting to your Mac mini:\n",[16,160,164],{"href":161,"rel":162,"title":163},"https://en.wikipedia.org/wiki/Virtual_Network_Computing",[],"VNC article on Wikipedia","VNC","\nand ",[16,167,171],{"href":168,"rel":169,"title":170},"https://en.wikipedia.org/wiki/Secure_Shell",[],"SSH article on Wikipedia","SSH",".",[59,174,176],{"id":175},"connecting-with-vnc","Connecting with VNC",[12,178,179,180,186],{},"If connecting from a Mac, ",[16,181,185],{"href":182,"rel":183,"title":184},"https://support.apple.com/kb/PH25554",[],"macOS Sierra: Set up and use screen sharing","Apple's Screen Sharing","\nis ideal. It's installed on every Mac and can you can connect on your MacStadium\nMac mini easily with the username and password that was sent to you via email.",[12,188,189],{},"If you don't have a favorite VNC client already, there are a number of options\nto choose from:",[64,191,192,201,210,218],{},[67,193,194,200],{},[16,195,199],{"href":196,"rel":197,"title":198},"http://tigervnc.org/",[],"TigerVNC website","TigerVNC"," (Multi-platform)",[67,202,203,209],{},[16,204,208],{"href":205,"rel":206,"title":207},"https://wiki.gnome.org/Apps/Vinagre",[],"Vinagre website","Vinagre"," (GNU/Linux)",[67,211,212,209],{},[16,213,217],{"href":214,"rel":215,"title":216},"https://remmina.org/",[],"Remmina website","Remmina",[67,219,220,200],{},[16,221,225],{"href":222,"rel":223,"title":224},"https://www.realvnc.com/",[],"RealVNC website","RealVNC",[12,227,228],{},"When you connect with VNC, you can use the same password that is set up for the\nuser on the Mac mini.",[12,230,231],{},"macOS has that as a separate setting, but MacStadium's provision scripts\nenable VNC connections by default.",[59,233,235],{"id":234},"connecting-with-ssh","Connecting with SSH",[12,237,238,239,242,243,246],{},"You can SSH into your machine using the username and password. For example, if\nthe username is ",[50,240,241],{},"administrator"," and the IP address of your machine ",[50,244,245],{},"1.2.3.4",":",[248,249,254],"pre",{"className":250,"code":251,"language":252,"meta":253,"style":253},"language-bash shiki shiki-themes github-light","ssh administrator@1.2.3.4\n","bash","",[50,255,256],{"__ignoreMap":253},[257,258,261,265],"span",{"class":259,"line":260},"line",1,[257,262,264],{"class":263},"s7eDp","ssh",[257,266,268],{"class":267},"sYBdl"," administrator@1.2.3.4\n",[12,270,271],{},"Enter the password when asked (you won't be able to see it), hit Enter and\nyou're in!",[73,273,275],{"id":274},"setting-up-the-development-environment","Setting up the development environment",[12,277,278,279,285],{},"The following steps are to be performed to the remote Mac machine. We need to\ninstall ",[16,280,284],{"href":281,"rel":282,"title":283},"https://developer.apple.com/xcode/",[],"Xcode on Apple's website","Xcode","\nand the command line tools that contain the SDKs and UNIX development applications\nlike the LLVM compiler, etc.",[12,287,288,289,172],{},"Apart from the needed toolset, the screensaver needs to be disabled otherwise\nthe machine will be put to sleep, thus disrupting the workflow of CI.\nThankfully, all the machines hosted on MacStadium are set to never sleep by\ndefault. It's just done in ",[105,290,291],{},"System Preferences > Energy Saver",[59,293,295],{"id":294},"installing-xcode","Installing Xcode",[12,297,298],{},"There are two ways to install Xcode. You can either download it from Apple's\ndeveloper portal or use the App Store where you might be asked to fill in your\ncredit card information. To avoid that, manually download Xcode:",[90,300,301,304,311,314,328,357,360,363,366],{},[67,302,303],{},"Connect via VNC to the remote Mac machine",[67,305,306,307],{},"Open a browser and go to ",[16,308,309],{"href":309,"rel":310},"https://developer.apple.com/download/more",[],[67,312,313],{},"Login with your existing AppleID or create one",[67,315,316,317,320,325,327],{},"Select the Xcode version you wish to install",[318,319],"br",{},[321,322],"img",{"alt":323,"src":324},"Download latest stable Xcode","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398538/blog/Content%20Images/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects/download-xcode-without-cc-info.png",[318,326],{},"This should download the Xcode package in your Downloads folder and\ndecompress it automatically. After a couple of minutes it should finish.",[67,329,330,331,334,335,338,339],{},"Open a terminal and move ",[50,332,333],{},"Xcode.app"," to ",[50,336,337],{},"/Applications"," so that it can be\nfound by Launchpad:",[248,340,344],{"className":341,"code":342,"language":343,"meta":253,"style":253},"language-shell shiki shiki-themes github-light","mv ~/Downloads/Xcode.app /Applications\n","shell",[50,345,346],{"__ignoreMap":253},[257,347,348,351,354],{"class":259,"line":260},[257,349,350],{"class":263},"mv",[257,352,353],{"class":267}," ~/Downloads/Xcode.app",[257,355,356],{"class":267}," /Applications\n",[67,358,359],{},"Go to your Applications, and double click on Xcode in order to install it.\nThe verification will begin, that should take a minute.",[67,361,362],{},"Answer \"Open\" when you are asked if you are sure you want to open it.",[67,364,365],{},"Select \"Agree\" in the License Agreement and provide your administrator\npassword.",[67,367,368],{},"The installation process should begin and after a while you will have Xcode\ninstalled and ready to be used.",[12,370,371],{},"In the next step we will install the command line developer tools.",[59,373,375],{"id":374},"installing-the-command-line-tools","Installing the command line tools",[12,377,378],{},"The command line tools are a subsection of Xcode, so if you installed Xcode,\nyou may skip this part.",[90,380,381,398],{},[67,382,383,384],{},"Open the Terminal app or run this command via SSH:",[248,385,387],{"className":250,"code":386,"language":252,"meta":253,"style":253},"xcode-select --install\n",[50,388,389],{"__ignoreMap":253},[257,390,391,394],{"class":259,"line":260},[257,392,393],{"class":263},"xcode-select",[257,395,397],{"class":396},"sYu0t"," --install\n",[67,399,400],{},"Accept the License Agreement and the installation will begin",[56,402],{},[12,404,405],{},"Now that all development tools are installed, it's time to install GitLab\nRunner.",[73,407,409],{"id":408},"installing-and-configuring-the-gitlab-runner","Installing and configuring the GitLab Runner",[12,411,412],{},"GitLab Runner is responsible for running your jobs in macOS and then it\nreports the results back to GitLab.",[12,414,415,416,422,423,172],{},"To install it, ",[16,417,421],{"href":418,"rel":419,"title":420},"https://docs.gitlab.com/runner/install/osx/#installation",[],"Documentation on installing GitLab Runner on macOS","follow the instructions in the Runner's documentation",".\nMake sure to also carefully read the ",[16,424,428],{"href":425,"rel":426,"title":427},"https://docs.gitlab.com/runner/install/osx/#limitations-on-macos",[],"Limitations of macOS Runner","current limitations",[73,430,432],{"id":431},"testing-a-project-with-ci","Testing a project with CI",[12,434,435,436,440,441,445,446,451],{},"The final piece of this puzzle is to set up a project in GitLab (your own\n",[16,437,439],{"href":438},"/stages-devops-lifecycle/","CE/EE instance "," or even ",[16,442,444],{"href":443},"/pricing/","GitLab.com"," ) and hook it up\nwith Mac mini. We will not expand on that, but you can follow this nice blog post\nby Angelo Stavrow on ",[16,447,450],{"href":448,"title":449},"/blog/setting-up-gitlab-ci-for-ios-projects/","Blog on setting up CI for iOS projects","Setting up GitLab CI for iOS projects",".\nIt includes comprehensive steps to get you started.",[73,453,455],{"id":454},"conclusion","Conclusion",[12,457,458,459,461],{},"Having a dedicated Mac machine for your development can save you precious time\nwhen you follow the Continuous Integration workflow with your team. In this\ntutorial, you've seen how to quickly get a remote Mac mini up and running\nfor your needs. Be sure to add the promo code ",[50,460,130],{}," on checkout for 10% off!",[12,463,464],{},"Happy building!",[56,466],{},[12,468,469,470,472],{},"Get 10% off of all MacStadium plans by using ",[105,471,130],{}," at checkout.\nThe coupon can only be applied when signing up hardware, but if you are an\nexisting customer who is using Gitlab and makes a change in hardware, you can\nalways apply it again or request the discount in a ticket.",[56,474],{},[12,476,477,478,172],{},"Cover image ",[16,479,482],{"href":480,"rel":481},"https://gitlab.com/gitlab-com/www-gitlab-com/merge_requests/3324#note_29314223",[],"provided by MacStadium",[484,485,486],"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 .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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":253,"searchDepth":488,"depth":488,"links":489},2,[490,492,493,497,501,502,503],{"id":61,"depth":491,"text":62},3,{"id":75,"depth":488,"text":76},{"id":137,"depth":488,"text":138,"children":494},[495,496],{"id":175,"depth":491,"text":176},{"id":234,"depth":491,"text":235},{"id":274,"depth":488,"text":275,"children":498},[499,500],{"id":294,"depth":491,"text":295},{"id":374,"depth":491,"text":375},{"id":408,"depth":488,"text":409},{"id":431,"depth":488,"text":432},{"id":454,"depth":488,"text":455},"engineering","2017-05-15","Learn how to use GitLab CI on MacStadium's mini servers to build your macOS or iOS projects.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749671709/Blog/Hero%20Images/macstadium-datacenter.jpg",{"excerpt":512},{"type":9,"value":513},[514],[12,515,14,516,22,519,28],{},[16,517,21],{"href":18,"rel":518,"title":20},[],[16,520,27],{"href":25,"title":26},true,"/en-us/blog/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects",{"title":5,"description":506,"ogTitle":5,"ogDescription":506,"noIndex":509,"ogImage":510,"ogUrl":524,"ogSiteName":525,"ogType":526,"canonicalUrls":524},"https://about.gitlab.com/blog/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects","https://about.gitlab.com","article","how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects","en-us/blog/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects","BlogPost","MhQOvFbv0kx4bvMdS4v4oELBYk9oBqgR2GUyioIIybs",{"logo":532,"freeTrial":537,"sales":542,"login":547,"items":552,"search":877,"minimal":908,"duo":927,"switchNav":936,"pricingDeployment":947},{"config":533},{"href":534,"dataGaName":535,"dataGaLocation":536},"/","gitlab logo","header",{"text":538,"config":539},"Get free trial",{"href":540,"dataGaName":541,"dataGaLocation":536},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":543,"config":544},"Request a demo",{"href":545,"dataGaName":546,"dataGaLocation":536},"/sales/?contact-topic=request-demo","sales",{"text":548,"config":549},"Sign in",{"href":550,"dataGaName":551,"dataGaLocation":536},"https://gitlab.com/users/sign_in/","sign in",[553,582,681,685,799,855],{"text":554,"config":555,"menu":557},"Platform",{"dataNavLevelOne":556},"platform",{"type":558,"columns":559},"cards",[560,566,574],{"title":554,"description":561,"link":562},"The intelligent orchestration platform for DevSecOps",{"text":563,"config":564},"Explore our Platform",{"href":565,"dataGaName":556,"dataGaLocation":536},"/platform/",{"title":567,"description":568,"link":569},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":570,"config":571},"Meet GitLab Duo",{"href":572,"dataGaName":573,"dataGaLocation":536},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":575,"description":576,"link":577},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":578,"config":579},"Learn more",{"href":580,"dataGaName":581,"dataGaLocation":536},"/why-gitlab/","why gitlab",{"text":583,"left":521,"config":584,"menu":586},"Product",{"dataNavLevelOne":585},"solutions",{"type":587,"link":588,"columns":592,"feature":660},"lists",{"text":589,"config":590},"View all Solutions",{"href":591,"dataGaName":585,"dataGaLocation":536},"/solutions/",[593,616,639],{"title":594,"description":595,"link":596,"items":601},"Automation","CI/CD and automation to accelerate deployment",{"config":597},{"icon":598,"href":599,"dataGaName":600,"dataGaLocation":536},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[602,605,608,612],{"text":603,"config":604},"CI/CD",{"href":25,"dataGaLocation":536,"dataGaName":603},{"text":567,"config":606},{"href":572,"dataGaLocation":536,"dataGaName":607},"gitlab duo agent platform - product menu",{"text":609,"config":610},"Source Code Management",{"href":611,"dataGaLocation":536,"dataGaName":609},"/solutions/source-code-management/",{"text":613,"config":614},"Automated Software Delivery",{"href":599,"dataGaLocation":536,"dataGaName":615},"Automated software delivery",{"title":617,"description":618,"link":619,"items":624},"Security","Deliver code faster without compromising security",{"config":620},{"href":621,"dataGaName":622,"dataGaLocation":536,"icon":623},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[625,629,634],{"text":626,"config":627},"Application Security Testing",{"href":621,"dataGaName":628,"dataGaLocation":536},"Application security testing",{"text":630,"config":631},"Software Supply Chain Security",{"href":632,"dataGaLocation":536,"dataGaName":633},"/solutions/supply-chain/","Software supply chain security",{"text":635,"config":636},"Software Compliance",{"href":637,"dataGaName":638,"dataGaLocation":536},"/solutions/software-compliance/","software compliance",{"title":640,"link":641,"items":646},"Measurement",{"config":642},{"icon":643,"href":644,"dataGaName":645,"dataGaLocation":536},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[647,651,655],{"text":648,"config":649},"Visibility & Measurement",{"href":644,"dataGaLocation":536,"dataGaName":650},"Visibility and Measurement",{"text":652,"config":653},"Value Stream Management",{"href":654,"dataGaLocation":536,"dataGaName":652},"/solutions/value-stream-management/",{"text":656,"config":657},"Analytics & Insights",{"href":658,"dataGaLocation":536,"dataGaName":659},"/solutions/analytics-and-insights/","Analytics and insights",{"title":661,"type":587,"items":662},"GitLab for",[663,669,675],{"text":664,"config":665},"Enterprise",{"icon":666,"href":667,"dataGaLocation":536,"dataGaName":668},"Building","/enterprise/","enterprise",{"text":670,"config":671},"Small Business",{"icon":672,"href":673,"dataGaLocation":536,"dataGaName":674},"Work","/small-business/","small business",{"text":676,"config":677},"Public Sector",{"icon":678,"href":679,"dataGaLocation":536,"dataGaName":680},"Organization","/solutions/public-sector/","public sector",{"text":682,"config":683},"Pricing",{"href":443,"dataGaName":684,"dataGaLocation":536,"dataNavLevelOne":684},"pricing",{"text":686,"config":687,"menu":689},"Resources",{"dataNavLevelOne":688},"resources",{"type":587,"link":690,"columns":694,"feature":788},{"text":691,"config":692},"View all resources",{"href":693,"dataGaName":688,"dataGaLocation":536},"/resources/",[695,728,755],{"title":696,"items":697},"Getting started",[698,703,708,713,718,723],{"text":699,"config":700},"Install",{"href":701,"dataGaName":702,"dataGaLocation":536},"/install/","install",{"text":704,"config":705},"Quick start guides",{"href":706,"dataGaName":707,"dataGaLocation":536},"/get-started/","quick setup checklists",{"text":709,"config":710},"Learn",{"href":711,"dataGaLocation":536,"dataGaName":712},"https://university.gitlab.com/","learn",{"text":714,"config":715},"Product documentation",{"href":716,"dataGaName":717,"dataGaLocation":536},"https://docs.gitlab.com/","product documentation",{"text":719,"config":720},"Best practice videos",{"href":721,"dataGaName":722,"dataGaLocation":536},"/getting-started-videos/","best practice videos",{"text":724,"config":725},"Integrations",{"href":726,"dataGaName":727,"dataGaLocation":536},"/integrations/","integrations",{"title":729,"items":730},"Discover",[731,736,741,746,750],{"text":732,"config":733},"Customer success stories",{"href":734,"dataGaName":735,"dataGaLocation":536},"/customers/","customer success stories",{"text":737,"config":738},"Blog",{"href":739,"dataGaName":740,"dataGaLocation":536},"/blog/","blog",{"text":742,"config":743},"Demo Hub",{"href":744,"dataGaName":745,"dataGaLocation":536},"/demo-hub/","demo hub",{"text":747,"config":748},"The Source",{"href":749,"dataGaName":740,"dataGaLocation":536},"/the-source/",{"text":751,"config":752},"Remote",{"href":753,"dataGaName":754,"dataGaLocation":536},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":756,"items":757},"Connect",[758,763,768,773,778,783],{"text":759,"config":760},"GitLab Services",{"href":761,"dataGaName":762,"dataGaLocation":536},"/services/","services",{"text":764,"config":765},"Contribute",{"href":766,"dataGaName":767,"dataGaLocation":536},"https://contributors.gitlab.com","contribute",{"text":769,"config":770},"Community",{"href":771,"dataGaName":772,"dataGaLocation":536},"/community/","community",{"text":774,"config":775},"Forum",{"href":776,"dataGaName":777,"dataGaLocation":536},"https://forum.gitlab.com/","forum",{"text":779,"config":780},"Events",{"href":781,"dataGaName":782,"dataGaLocation":536},"/events/","events",{"text":784,"config":785},"Partners",{"href":786,"dataGaName":787,"dataGaLocation":536},"/partners/","partners",{"config":789,"title":792,"text":793,"link":794},{"background":790,"textColor":791},"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":795,"config":796},"Read the latest",{"href":797,"dataGaName":798,"dataGaLocation":536},"/whats-new/","whats new",{"text":800,"config":801,"menu":803},"Company",{"dataNavLevelOne":802},"company",{"type":587,"columns":804},[805],{"items":806},[807,812,818,820,825,830,835,840,845,850],{"text":808,"config":809},"About",{"href":810,"dataGaName":811,"dataGaLocation":536},"/company/","about",{"text":813,"config":814,"footerGa":817},"Jobs",{"href":815,"dataGaName":816,"dataGaLocation":536},"/jobs/","jobs",{"dataGaName":816},{"text":779,"config":819},{"href":781,"dataGaName":782,"dataGaLocation":536},{"text":821,"config":822},"Leadership",{"href":823,"dataGaName":824,"dataGaLocation":536},"/company/team/e-group/","leadership",{"text":826,"config":827},"Handbook",{"href":828,"dataGaName":829,"dataGaLocation":536},"https://handbook.gitlab.com/","handbook",{"text":831,"config":832},"Investor relations",{"href":833,"dataGaName":834,"dataGaLocation":536},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":836,"config":837},"Trust Center",{"href":838,"dataGaName":839,"dataGaLocation":536},"/security/","trust center",{"text":841,"config":842},"AI Transparency Center",{"href":843,"dataGaName":844,"dataGaLocation":536},"/ai-transparency-center/","ai transparency center",{"text":846,"config":847},"Newsletter",{"href":848,"dataGaName":849,"dataGaLocation":536},"/company/contact/#contact-forms","newsletter",{"text":851,"config":852},"Press",{"href":853,"dataGaName":854,"dataGaLocation":536},"/press/","press",{"text":856,"config":857,"menu":858},"Contact us",{"dataNavLevelOne":802},{"type":587,"columns":859},[860],{"items":861},[862,867,872],{"text":863,"config":864},"Talk to sales",{"href":865,"dataGaName":866,"dataGaLocation":536},"/sales/","talk to sales",{"text":868,"config":869},"Support portal",{"href":870,"dataGaName":871,"dataGaLocation":536},"https://support.gitlab.com/hc/en-us","support portal",{"text":873,"config":874},"Customer portal",{"href":875,"dataGaName":876,"dataGaLocation":536},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":878,"login":879,"suggestions":886},"Close",{"text":880,"link":881},"To search repositories and projects, login to",{"text":882,"config":883},"gitlab.com",{"href":550,"dataGaName":884,"dataGaLocation":885},"search login","search",{"text":887,"default":888},"Suggestions",[889,891,895,897,901,905],{"text":567,"config":890},{"href":572,"dataGaName":567,"dataGaLocation":885},{"text":892,"config":893},"Code Suggestions (AI)",{"href":894,"dataGaName":892,"dataGaLocation":885},"/solutions/code-suggestions/",{"text":603,"config":896},{"href":25,"dataGaName":603,"dataGaLocation":885},{"text":898,"config":899},"GitLab on AWS",{"href":900,"dataGaName":898,"dataGaLocation":885},"/partners/technology-partners/aws/",{"text":902,"config":903},"GitLab on Google Cloud",{"href":904,"dataGaName":902,"dataGaLocation":885},"/partners/technology-partners/google-cloud-platform/",{"text":906,"config":907},"Why GitLab?",{"href":580,"dataGaName":906,"dataGaLocation":885},{"freeTrial":909,"mobileIcon":914,"desktopIcon":919,"secondaryButton":922},{"text":910,"config":911},"Start free trial",{"href":912,"dataGaName":541,"dataGaLocation":913},"https://gitlab.com/-/trials/new/","nav",{"altText":915,"config":916},"Gitlab Icon",{"src":917,"dataGaName":918,"dataGaLocation":913},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":915,"config":920},{"src":921,"dataGaName":918,"dataGaLocation":913},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":923,"config":924},"Get Started",{"href":925,"dataGaName":926,"dataGaLocation":913},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":928,"mobileIcon":932,"desktopIcon":934},{"text":929,"config":930},"Learn more about GitLab Duo",{"href":572,"dataGaName":931,"dataGaLocation":913},"gitlab duo",{"altText":915,"config":933},{"src":917,"dataGaName":918,"dataGaLocation":913},{"altText":915,"config":935},{"src":921,"dataGaName":918,"dataGaLocation":913},{"button":937,"mobileIcon":942,"desktopIcon":944},{"text":938,"config":939},"/switch",{"href":940,"dataGaName":941,"dataGaLocation":913},"#contact","switch",{"altText":915,"config":943},{"src":917,"dataGaName":918,"dataGaLocation":913},{"altText":915,"config":945},{"src":946,"dataGaName":918,"dataGaLocation":913},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":948,"mobileIcon":953,"desktopIcon":955},{"text":949,"config":950},"Back to pricing",{"href":443,"dataGaName":951,"dataGaLocation":913,"icon":952},"back to pricing","GoBack",{"altText":915,"config":954},{"src":917,"dataGaName":918,"dataGaLocation":913},{"altText":915,"config":956},{"src":921,"dataGaName":918,"dataGaLocation":913},{"title":958,"titleMobile":959,"button":960,"config":965},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":578,"config":961},{"href":962,"dataGaName":963,"dataGaLocation":964},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":966,"disabled":509},"release",{"data":968},{"text":969,"source":970,"edit":976,"contribute":981,"config":986,"items":991,"minimal":1201},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":971,"config":972},"View page source",{"href":973,"dataGaName":974,"dataGaLocation":975},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":977,"config":978},"Edit this page",{"href":979,"dataGaName":980,"dataGaLocation":975},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":982,"config":983},"Please contribute",{"href":984,"dataGaName":985,"dataGaLocation":975},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":987,"facebook":988,"youtube":989,"linkedin":990},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[992,1039,1093,1137,1169],{"title":682,"links":993,"subMenu":1008},[994,998,1003],{"text":995,"config":996},"View plans",{"href":443,"dataGaName":997,"dataGaLocation":975},"view plans",{"text":999,"config":1000},"Why Premium?",{"href":1001,"dataGaName":1002,"dataGaLocation":975},"/pricing/premium/","why premium",{"text":1004,"config":1005},"Why Ultimate?",{"href":1006,"dataGaName":1007,"dataGaLocation":975},"/pricing/ultimate/","why ultimate",[1009],{"title":1010,"links":1011},"Contact Us",[1012,1015,1017,1019,1024,1029,1034],{"text":1013,"config":1014},"Contact sales",{"href":865,"dataGaName":546,"dataGaLocation":975},{"text":868,"config":1016},{"href":870,"dataGaName":871,"dataGaLocation":975},{"text":873,"config":1018},{"href":875,"dataGaName":876,"dataGaLocation":975},{"text":1020,"config":1021},"Status",{"href":1022,"dataGaName":1023,"dataGaLocation":975},"https://status.gitlab.com/","status",{"text":1025,"config":1026},"Terms of use",{"href":1027,"dataGaName":1028,"dataGaLocation":975},"/terms/","terms of use",{"text":1030,"config":1031},"Privacy statement",{"href":1032,"dataGaName":1033,"dataGaLocation":975},"/privacy/","privacy statement",{"text":1035,"config":1036},"Cookie preferences",{"dataGaName":1037,"dataGaLocation":975,"id":1038,"isOneTrustButton":521},"cookie preferences","ot-sdk-btn",{"title":583,"links":1040,"subMenu":1049},[1041,1045],{"text":1042,"config":1043},"DevSecOps platform",{"href":565,"dataGaName":1044,"dataGaLocation":975},"devsecops platform",{"text":1046,"config":1047},"AI-Assisted Development",{"href":572,"dataGaName":1048,"dataGaLocation":975},"ai-assisted development",[1050],{"title":1051,"links":1052},"Topics",[1053,1058,1063,1068,1073,1078,1083,1088],{"text":1054,"config":1055},"CICD",{"href":1056,"dataGaName":1057,"dataGaLocation":975},"/topics/ci-cd/","cicd",{"text":1059,"config":1060},"GitOps",{"href":1061,"dataGaName":1062,"dataGaLocation":975},"/topics/gitops/","gitops",{"text":1064,"config":1065},"DevOps",{"href":1066,"dataGaName":1067,"dataGaLocation":975},"/topics/devops/","devops",{"text":1069,"config":1070},"Version Control",{"href":1071,"dataGaName":1072,"dataGaLocation":975},"/topics/version-control/","version control",{"text":1074,"config":1075},"DevSecOps",{"href":1076,"dataGaName":1077,"dataGaLocation":975},"/topics/devsecops/","devsecops",{"text":1079,"config":1080},"Cloud Native",{"href":1081,"dataGaName":1082,"dataGaLocation":975},"/topics/cloud-native/","cloud native",{"text":1084,"config":1085},"AI for Coding",{"href":1086,"dataGaName":1087,"dataGaLocation":975},"/topics/devops/ai-for-coding/","ai for coding",{"text":1089,"config":1090},"Agentic AI",{"href":1091,"dataGaName":1092,"dataGaLocation":975},"/topics/agentic-ai/","agentic ai",{"title":1094,"links":1095},"Solutions",[1096,1098,1100,1105,1109,1112,1116,1119,1121,1124,1127,1132],{"text":626,"config":1097},{"href":621,"dataGaName":626,"dataGaLocation":975},{"text":615,"config":1099},{"href":599,"dataGaName":600,"dataGaLocation":975},{"text":1101,"config":1102},"Agile development",{"href":1103,"dataGaName":1104,"dataGaLocation":975},"/solutions/agile-delivery/","agile delivery",{"text":1106,"config":1107},"SCM",{"href":611,"dataGaName":1108,"dataGaLocation":975},"source code management",{"text":1054,"config":1110},{"href":25,"dataGaName":1111,"dataGaLocation":975},"continuous integration & delivery",{"text":1113,"config":1114},"Value stream management",{"href":654,"dataGaName":1115,"dataGaLocation":975},"value stream management",{"text":1059,"config":1117},{"href":1118,"dataGaName":1062,"dataGaLocation":975},"/solutions/gitops/",{"text":664,"config":1120},{"href":667,"dataGaName":668,"dataGaLocation":975},{"text":1122,"config":1123},"Small business",{"href":673,"dataGaName":674,"dataGaLocation":975},{"text":1125,"config":1126},"Public sector",{"href":679,"dataGaName":680,"dataGaLocation":975},{"text":1128,"config":1129},"Education",{"href":1130,"dataGaName":1131,"dataGaLocation":975},"/solutions/education/","education",{"text":1133,"config":1134},"Financial services",{"href":1135,"dataGaName":1136,"dataGaLocation":975},"/solutions/finance/","financial services",{"title":686,"links":1138},[1139,1141,1143,1145,1148,1150,1153,1155,1157,1159,1161,1163,1165,1167],{"text":699,"config":1140},{"href":701,"dataGaName":702,"dataGaLocation":975},{"text":704,"config":1142},{"href":706,"dataGaName":707,"dataGaLocation":975},{"text":709,"config":1144},{"href":711,"dataGaName":712,"dataGaLocation":975},{"text":714,"config":1146},{"href":716,"dataGaName":1147,"dataGaLocation":975},"docs",{"text":737,"config":1149},{"href":739,"dataGaName":740,"dataGaLocation":975},{"text":1151,"config":1152},"What's new",{"href":797,"dataGaName":798,"dataGaLocation":975},{"text":732,"config":1154},{"href":734,"dataGaName":735,"dataGaLocation":975},{"text":751,"config":1156},{"href":753,"dataGaName":754,"dataGaLocation":975},{"text":759,"config":1158},{"href":761,"dataGaName":762,"dataGaLocation":975},{"text":764,"config":1160},{"href":766,"dataGaName":767,"dataGaLocation":975},{"text":769,"config":1162},{"href":771,"dataGaName":772,"dataGaLocation":975},{"text":774,"config":1164},{"href":776,"dataGaName":777,"dataGaLocation":975},{"text":779,"config":1166},{"href":781,"dataGaName":782,"dataGaLocation":975},{"text":784,"config":1168},{"href":786,"dataGaName":787,"dataGaLocation":975},{"title":800,"links":1170},[1171,1173,1175,1177,1179,1181,1185,1190,1192,1194,1196],{"text":808,"config":1172},{"href":810,"dataGaName":802,"dataGaLocation":975},{"text":813,"config":1174},{"href":815,"dataGaName":816,"dataGaLocation":975},{"text":821,"config":1176},{"href":823,"dataGaName":824,"dataGaLocation":975},{"text":826,"config":1178},{"href":828,"dataGaName":829,"dataGaLocation":975},{"text":831,"config":1180},{"href":833,"dataGaName":834,"dataGaLocation":975},{"text":1182,"config":1183},"Sustainability",{"href":1184,"dataGaName":1182,"dataGaLocation":975},"/sustainability/",{"text":1186,"config":1187},"Diversity, inclusion and belonging (DIB)",{"href":1188,"dataGaName":1189,"dataGaLocation":975},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":836,"config":1191},{"href":838,"dataGaName":839,"dataGaLocation":975},{"text":846,"config":1193},{"href":848,"dataGaName":849,"dataGaLocation":975},{"text":851,"config":1195},{"href":853,"dataGaName":854,"dataGaLocation":975},{"text":1197,"config":1198},"Modern Slavery Transparency Statement",{"href":1199,"dataGaName":1200,"dataGaLocation":975},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1202},[1203,1206,1209],{"text":1204,"config":1205},"Terms",{"href":1027,"dataGaName":1028,"dataGaLocation":975},{"text":1207,"config":1208},"Cookies",{"dataGaName":1037,"dataGaLocation":975,"id":1038,"isOneTrustButton":521},{"text":1210,"config":1211},"Privacy",{"href":1032,"dataGaName":1033,"dataGaLocation":975},[1213],{"id":1214,"title":7,"body":508,"config":1215,"content":1217,"description":508,"extension":1221,"meta":1222,"navigation":521,"path":1223,"seo":1224,"stem":1225,"__hash__":1226},"blogAuthors/en-us/blog/authors/achilleas-pipinellis.yml",{"template":1216},"BlogAuthor",{"name":7,"config":1218},{"headshot":1219,"ctfId":1220},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749671703/Blog/Author%20Headshots/axil-headshot.jpg","Achilleas-Pipinellis","yml",{},"/en-us/blog/authors/achilleas-pipinellis",{},"en-us/blog/authors/achilleas-pipinellis","vSsnKACisBQ6cIWVfVkuQ4WeAp0ylxXfqK5oJMhxEEg",[1228,1237,1245],{"title":1229,"description":1230,"heroImage":1231,"category":504,"date":1232,"authors":1233,"slug":1236,"externalUrl":508},"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",[1234,1235],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1238,"description":1239,"heroImage":1240,"category":504,"date":1241,"authors":1242,"slug":1244,"externalUrl":508},"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",[1243],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1246,"description":1247,"heroImage":1248,"category":504,"date":1249,"authors":1250,"slug":1252,"externalUrl":508},"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",[1251],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1254},[1255,1269,1281,1293],{"id":1256,"categories":1257,"header":1259,"text":1260,"button":1261,"image":1266},"ai-modernization",[1258],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1262,"config":1263},"Get your AI maturity score",{"href":1264,"dataGaName":1265,"dataGaLocation":740},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1267},{"src":1268},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1270,"categories":1271,"header":1273,"text":1260,"button":1274,"image":1278},"devops-modernization",[1272,1077],"product","Are you just managing tools or shipping innovation?",{"text":1275,"config":1276},"Get your DevOps maturity score",{"href":1277,"dataGaName":1265,"dataGaLocation":740},"/assessments/devops-modernization-assessment/",{"config":1279},{"src":1280},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1282,"categories":1283,"header":1285,"text":1260,"button":1286,"image":1290},"security-modernization",[1284],"security","Are you trading speed for security?",{"text":1287,"config":1288},"Get your security maturity score",{"href":1289,"dataGaName":1265,"dataGaLocation":740},"/assessments/security-modernization-assessment/",{"config":1291},{"src":1292},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1294,"paths":1295,"header":1298,"text":1299,"button":1300,"image":1305},"github-azure-migration",[1296,1297],"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":1301,"config":1302},"See how GitLab compares to GitHub",{"href":1303,"dataGaName":1304,"dataGaLocation":740},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1306},{"src":1280},{"header":1308,"blurb":1309,"button":1310,"secondaryButton":1315},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1311,"config":1312},"Get your free trial",{"href":1313,"dataGaName":541,"dataGaLocation":1314},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1013,"config":1316},{"href":865,"dataGaName":546,"dataGaLocation":1314},1786803735151]