[{"data":1,"prerenderedAt":759},["ShallowReactive",2],{"/en-us/blog/mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane":3,"navigation-en-us":37,"banner-en-us":465,"footer-en-us":482,"Darby Frey":725,"next-steps-en-us":738,"footer-source-/en-us/blog/mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane/":753},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":27,"_id":30,"_type":31,"title":32,"_source":33,"_file":34,"_stem":35,"_extension":36},"/en-us/blog/mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Mobile DevOps: iOS code signing with GitLab CI & Fastlane","Learn how to use Project-level Secure Files with Fastlane Match to sign an iOS app.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749668568/Blog/Hero%20Images/vinicius-amnx-amano-IPemgbj9aDY-unsplash.jpg","https://about.gitlab.com/blog/mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Mobile DevOps with GitLab, Part 3 - Code signing for iOS with GitLab CI and Fastlane\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Darby Frey\"}],\n        \"datePublished\": \"2022-10-03\",\n      }",{"title":17,"description":10,"authors":18,"heroImage":11,"date":20,"body":21,"category":22,"tags":23},"Mobile DevOps with GitLab, Part 3 - Code signing for iOS with GitLab CI and Fastlane",[19],"Darby Frey","2022-10-03","This post is the third in a series of three blog posts showing how GitLab\nmakes code signing easier using a new feature called Project-level Secure\nFiles.\n\n\n- [Part 1](/blog/mobile-devops-with-gitlab-part-1/) introduces\nthe Project-level Secure Files feature and the basics of getting started.\n\n- [Part 2](/blog/mobile-devops-with-gitlab-part-2/) shows an\nexample of how to use Project-level Secure Files to sign an Android app.\n\n- This post shows how to use the integration with Fastlane Match to sign an\niOS app.\n\n\nCode signing for iOS projects is\n[notoriously](https://twitter.com/davidcrawshaw/status/1159083791232765953)\n[difficult](https://twitter.com/bc3tech/status/692778139517255680) and can\nlead to a lot of time spent debugging errors, but a tool called Fastlane\nmakes it much easier. [Fastlane](https://fastlane.tools/) is an open source\ntool that greatly simplifies the complexity of the code signing process for\niOS development.\n\n\nIn [Fastlane 2.207.2](https://github.com/fastlane/fastlane/pull/20386) we\nreleased support for Project-level Secure Files as a storage backend for\nFastlane Match, making it even easier for mobile projects to manage their\nsigning certificates and provisioning profiles within GitLab. Now, we will\ncover a couple of ways to get started using Project-level Secure Files in a\nFastlane project.\n\n\n## Set up Fastlane Match\n\n\nIf your project doesn't have a Fastlane Matchfile yet, you can generate one\nby running the following:\n\n\n```\n\nbundle exec fastlane match init\n\n```\n\n\nThis command will prompt you to choose which storage backend you want to use\n(select `gitlab_secure_files`) and to input your project path (for example:\n`gitlab-org/gitlab`). It will then generate a Fastlane Matchfile configured\nto use your project's secure files for Fastlane Match.\n\n\n![Initialize Fastlane\nMatch](https://about.gitlab.com/images/blogimages/2022-09-19-mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane/match-init.png)\n\n\n## Generate a Personal Access Token\n\n\nNext, you'll need a GitLab Personal Access Token to use Fastlane Match from\nyour local machine. To create a Personal Access Token, visit the Access\nTokens section in your GitLab profile (for example:\n[https://gitlab.com/-/profile/personal_access_tokens](https://gitlab.com/-/profile/personal_access_tokens)).\nCreate a new token with the “api” scope. Take note of the token you just\ncreated, we'll be using it later.\n\n\n## Generate and upload \n\n\nIf you have not created signing certificates or provisioning profiles yet\nfor your project, running Fastlane Match will do all of the work for you.\nRun the command below with your Personal Access Token:\n\n\n```\n\nPRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match \n\n```\n\n\nYou may be prompted to log in with your Apple developer account. Once\nauthenticated, this command will generate development certificates and\nprofiles in the Apple Developer portal and upload those files to GitLab.\nYou'll be able to view the files in your project's CI/CD settings as soon as\nthe command completes.\n\n\nYou can also generate other certificate types by specifying the type in the\ncommand, for example:\n\n\n```\n\nPRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match appstore\n\n```\n\n\n## Upload-only\n\n\nIf you have already created signing certificates and provisioning profiles\nfor your project, you can use Fastlane Match Import to load your existing\nfiles into Project-level Secure Files. Simply run:\n\n\n```\n\nPRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match import\n\n```\n\n\nYou'll be prompted to input the path to your files. Once those options are\nprovided, your files will be uploaded and visible in your project's CI/CD\nsettings. (Note: If you are prompted for the git_url during the import, it\nis safe to leave it blank and hit enter.)\n\n\n![Fastlane Match\nImport](https://about.gitlab.com/images/blogimages/2022-09-19-mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane/match-import.png)\n\n\n## CI/CD pipelines\n\n\nWith your signing certificates and provisioning profiles loaded in\nProject-level Secure Files, it's now easy to use those files in your [CI/CD\npipelines](/topics/ci-cd/). No access tokens are needed when running jobs in\nGitLab, so you can load your files into a CI/CD job by adding the fastlane\ncommand to a CI job script. For example:\n\n\n```\n\ntest:\n  stage: test\n  script:\n    bundle exec fastlane match –readonly\n```\n\n\nUsing the –readonly flag on CI is suggested to prevent any unintended\nchanges to signing certificates by Fastlane. The Fastlane Match command will\nsync the certificates to the machine, but does not build the application. To\nrun match and build, configure a lane in your project's Fastfile to do both\nsteps. For example:\n\n\n**Fastfile**\n\n\n```\n\ndefault_platform(:ios)\n\n\nplatform :ios do\n  desc \"Build the App\"\n  lane :build do\n    setup_ci\n    match(type: 'appstore', readonly: is_ci)\n    build_app(\n      clean: true,\n      project: \"ios_demo.xcodeproj\", \n      scheme: \"ios_demo\"\n    )\n  end\nend\n\n```\n\n\n**Matchfile**\n\n\n```\n\ngitlab_project(\"gitlab-org/incubation-engineering/mobile-devops/ios_demo\")\n\nstorage_mode(\"gitlab_secure_files\")\n\ntype(\"appstore\")\n\n```\n\n\n**.gitlab-ci.yml File**\n\n\n```\n\nbuild:\n  stage: build\n  script:\n    - bundle exec fastlane build\n```\n\n\nWith all of that in place, you'll have a CI pipeline that runs a single\nbuild job. That job will use the `:build` lane from fastlane to run\n`setup_ci`, `match`, and `build_app`. The result from that job will be a\nbuild of your app, signed with the certificates stored in your project with\nProject-level Secure Files. You could then extend fastlane to push that\nbuild to Test Flight or the App Store.\n\n\nFastlane does a good job of handling the complexity associated with\ncertificate management, so you don't have to worry about it, but there is a\nbit of a learning curve to getting used to Fastlane. Take a look at [this\nbranch](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/ios_demo/-/tree/fastlane_build)\nin the ios_demo project to for a full working example. Please add any\nfeedback you have in the [feedback\nissue](https://gitlab.com/gitlab-org/gitlab/-/issues/362407).\n\n\n## Better Mobile DevOps\n\n\nWith Project-level Secure Files, you no longer need to rely on hacks or\nworkarounds to automate code signing, and it can be easily added to new or\nexisting [CI/CD pipelines](/topics/ci-cd/).\n\n\nFor more about how we are working to make better Mobile DevOps at GitLab,\ncheck out the [Mobile DevOps\nDocs](https://docs.gitlab.com/ee/ci/mobile_devops.html), [SaaS runners on\nmacOS](https://docs.gitlab.com/ee/ci/runners/saas/macos_saas_runner.html),\nand the [Mobile DevOps\nPlaylist](https://www.youtube.com/playlist?list=PL05JrBw4t0KoVEdembEIySgiciCuZj7Zl)\non GitLab Unfiltered.\n\n\nCover image by \u003Ca\nhref=\"https://unsplash.com/@viniciusamano?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText\">Vinicius\n\"amnx\" Amano\u003C/a> on \u003Ca\nhref=\"https://unsplash.com/s/photos/complex-to-simple?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText\">Unsplash\u003C/a>\n","devsecops",[24,25,26],"agile","DevOps","security",{"slug":28,"featured":6,"template":29},"mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane","BlogPost","content:en-us:blog:mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane.yml","yaml","Mobile Devops With Gitlab Part 3 Code Signing For Ios With Gitlab And Fastlane","content","en-us/blog/mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane.yml","en-us/blog/mobile-devops-with-gitlab-part-3-code-signing-for-ios-with-gitlab-and-fastlane","yml",{"_path":38,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"data":40,"_id":461,"_type":31,"title":462,"_source":33,"_file":463,"_stem":464,"_extension":36},"/shared/en-us/main-navigation","en-us",{"logo":41,"freeTrial":46,"sales":51,"login":56,"items":61,"search":392,"minimal":423,"duo":442,"pricingDeployment":451},{"config":42},{"href":43,"dataGaName":44,"dataGaLocation":45},"/","gitlab logo","header",{"text":47,"config":48},"Get free trial",{"href":49,"dataGaName":50,"dataGaLocation":45},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":52,"config":53},"Talk to sales",{"href":54,"dataGaName":55,"dataGaLocation":45},"/sales/","sales",{"text":57,"config":58},"Sign in",{"href":59,"dataGaName":60,"dataGaLocation":45},"https://gitlab.com/users/sign_in/","sign in",[62,106,203,208,313,373],{"text":63,"config":64,"cards":66,"footer":89},"Platform",{"dataNavLevelOne":65},"platform",[67,73,81],{"title":63,"description":68,"link":69},"The most comprehensive AI-powered DevSecOps Platform",{"text":70,"config":71},"Explore our Platform",{"href":72,"dataGaName":65,"dataGaLocation":45},"/platform/",{"title":74,"description":75,"link":76},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":77,"config":78},"Meet GitLab Duo",{"href":79,"dataGaName":80,"dataGaLocation":45},"/gitlab-duo/","gitlab duo ai",{"title":82,"description":83,"link":84},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":85,"config":86},"Learn more",{"href":87,"dataGaName":88,"dataGaLocation":45},"/why-gitlab/","why gitlab",{"title":90,"items":91},"Get started with",[92,97,102],{"text":93,"config":94},"Platform Engineering",{"href":95,"dataGaName":96,"dataGaLocation":45},"/solutions/platform-engineering/","platform engineering",{"text":98,"config":99},"Developer Experience",{"href":100,"dataGaName":101,"dataGaLocation":45},"/developer-experience/","Developer experience",{"text":103,"config":104},"MLOps",{"href":105,"dataGaName":103,"dataGaLocation":45},"/topics/devops/the-role-of-ai-in-devops/",{"text":107,"left":108,"config":109,"link":111,"lists":115,"footer":185},"Product",true,{"dataNavLevelOne":110},"solutions",{"text":112,"config":113},"View all Solutions",{"href":114,"dataGaName":110,"dataGaLocation":45},"/solutions/",[116,141,164],{"title":117,"description":118,"link":119,"items":124},"Automation","CI/CD and automation to accelerate deployment",{"config":120},{"icon":121,"href":122,"dataGaName":123,"dataGaLocation":45},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[125,129,133,137],{"text":126,"config":127},"CI/CD",{"href":128,"dataGaLocation":45,"dataGaName":126},"/solutions/continuous-integration/",{"text":130,"config":131},"AI-Assisted Development",{"href":79,"dataGaLocation":45,"dataGaName":132},"AI assisted development",{"text":134,"config":135},"Source Code Management",{"href":136,"dataGaLocation":45,"dataGaName":134},"/solutions/source-code-management/",{"text":138,"config":139},"Automated Software Delivery",{"href":122,"dataGaLocation":45,"dataGaName":140},"Automated software delivery",{"title":142,"description":143,"link":144,"items":149},"Security","Deliver code faster without compromising security",{"config":145},{"href":146,"dataGaName":147,"dataGaLocation":45,"icon":148},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[150,154,159],{"text":151,"config":152},"Application Security Testing",{"href":146,"dataGaName":153,"dataGaLocation":45},"Application security testing",{"text":155,"config":156},"Software Supply Chain Security",{"href":157,"dataGaLocation":45,"dataGaName":158},"/solutions/supply-chain/","Software supply chain security",{"text":160,"config":161},"Software Compliance",{"href":162,"dataGaName":163,"dataGaLocation":45},"/solutions/software-compliance/","software compliance",{"title":165,"link":166,"items":171},"Measurement",{"config":167},{"icon":168,"href":169,"dataGaName":170,"dataGaLocation":45},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[172,176,180],{"text":173,"config":174},"Visibility & Measurement",{"href":169,"dataGaLocation":45,"dataGaName":175},"Visibility and Measurement",{"text":177,"config":178},"Value Stream Management",{"href":179,"dataGaLocation":45,"dataGaName":177},"/solutions/value-stream-management/",{"text":181,"config":182},"Analytics & Insights",{"href":183,"dataGaLocation":45,"dataGaName":184},"/solutions/analytics-and-insights/","Analytics and insights",{"title":186,"items":187},"GitLab for",[188,193,198],{"text":189,"config":190},"Enterprise",{"href":191,"dataGaLocation":45,"dataGaName":192},"/enterprise/","enterprise",{"text":194,"config":195},"Small Business",{"href":196,"dataGaLocation":45,"dataGaName":197},"/small-business/","small business",{"text":199,"config":200},"Public Sector",{"href":201,"dataGaLocation":45,"dataGaName":202},"/solutions/public-sector/","public sector",{"text":204,"config":205},"Pricing",{"href":206,"dataGaName":207,"dataGaLocation":45,"dataNavLevelOne":207},"/pricing/","pricing",{"text":209,"config":210,"link":212,"lists":216,"feature":300},"Resources",{"dataNavLevelOne":211},"resources",{"text":213,"config":214},"View all resources",{"href":215,"dataGaName":211,"dataGaLocation":45},"/resources/",[217,250,272],{"title":218,"items":219},"Getting started",[220,225,230,235,240,245],{"text":221,"config":222},"Install",{"href":223,"dataGaName":224,"dataGaLocation":45},"/install/","install",{"text":226,"config":227},"Quick start guides",{"href":228,"dataGaName":229,"dataGaLocation":45},"/get-started/","quick setup checklists",{"text":231,"config":232},"Learn",{"href":233,"dataGaLocation":45,"dataGaName":234},"https://university.gitlab.com/","learn",{"text":236,"config":237},"Product documentation",{"href":238,"dataGaName":239,"dataGaLocation":45},"https://docs.gitlab.com/","product documentation",{"text":241,"config":242},"Best practice videos",{"href":243,"dataGaName":244,"dataGaLocation":45},"/getting-started-videos/","best practice videos",{"text":246,"config":247},"Integrations",{"href":248,"dataGaName":249,"dataGaLocation":45},"/integrations/","integrations",{"title":251,"items":252},"Discover",[253,258,262,267],{"text":254,"config":255},"Customer success stories",{"href":256,"dataGaName":257,"dataGaLocation":45},"/customers/","customer success stories",{"text":259,"config":260},"Blog",{"href":261,"dataGaName":5,"dataGaLocation":45},"/blog/",{"text":263,"config":264},"Remote",{"href":265,"dataGaName":266,"dataGaLocation":45},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":268,"config":269},"TeamOps",{"href":270,"dataGaName":271,"dataGaLocation":45},"/teamops/","teamops",{"title":273,"items":274},"Connect",[275,280,285,290,295],{"text":276,"config":277},"GitLab Services",{"href":278,"dataGaName":279,"dataGaLocation":45},"/services/","services",{"text":281,"config":282},"Community",{"href":283,"dataGaName":284,"dataGaLocation":45},"/community/","community",{"text":286,"config":287},"Forum",{"href":288,"dataGaName":289,"dataGaLocation":45},"https://forum.gitlab.com/","forum",{"text":291,"config":292},"Events",{"href":293,"dataGaName":294,"dataGaLocation":45},"/events/","events",{"text":296,"config":297},"Partners",{"href":298,"dataGaName":299,"dataGaLocation":45},"/partners/","partners",{"backgroundColor":301,"textColor":302,"text":303,"image":304,"link":308},"#2f2a6b","#fff","Insights for the future of software development",{"altText":305,"config":306},"the source promo card",{"src":307},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":309,"config":310},"Read the latest",{"href":311,"dataGaName":312,"dataGaLocation":45},"/the-source/","the source",{"text":314,"config":315,"lists":317},"Company",{"dataNavLevelOne":316},"company",[318],{"items":319},[320,325,331,333,338,343,348,353,358,363,368],{"text":321,"config":322},"About",{"href":323,"dataGaName":324,"dataGaLocation":45},"/company/","about",{"text":326,"config":327,"footerGa":330},"Jobs",{"href":328,"dataGaName":329,"dataGaLocation":45},"/jobs/","jobs",{"dataGaName":329},{"text":291,"config":332},{"href":293,"dataGaName":294,"dataGaLocation":45},{"text":334,"config":335},"Leadership",{"href":336,"dataGaName":337,"dataGaLocation":45},"/company/team/e-group/","leadership",{"text":339,"config":340},"Team",{"href":341,"dataGaName":342,"dataGaLocation":45},"/company/team/","team",{"text":344,"config":345},"Handbook",{"href":346,"dataGaName":347,"dataGaLocation":45},"https://handbook.gitlab.com/","handbook",{"text":349,"config":350},"Investor relations",{"href":351,"dataGaName":352,"dataGaLocation":45},"https://ir.gitlab.com/","investor relations",{"text":354,"config":355},"Trust Center",{"href":356,"dataGaName":357,"dataGaLocation":45},"/security/","trust center",{"text":359,"config":360},"AI Transparency Center",{"href":361,"dataGaName":362,"dataGaLocation":45},"/ai-transparency-center/","ai transparency center",{"text":364,"config":365},"Newsletter",{"href":366,"dataGaName":367,"dataGaLocation":45},"/company/contact/","newsletter",{"text":369,"config":370},"Press",{"href":371,"dataGaName":372,"dataGaLocation":45},"/press/","press",{"text":374,"config":375,"lists":376},"Contact us",{"dataNavLevelOne":316},[377],{"items":378},[379,382,387],{"text":52,"config":380},{"href":54,"dataGaName":381,"dataGaLocation":45},"talk to sales",{"text":383,"config":384},"Support portal",{"href":385,"dataGaName":386,"dataGaLocation":45},"https://support.gitlab.com","support portal",{"text":388,"config":389},"Customer portal",{"href":390,"dataGaName":391,"dataGaLocation":45},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":393,"login":394,"suggestions":401},"Close",{"text":395,"link":396},"To search repositories and projects, login to",{"text":397,"config":398},"gitlab.com",{"href":59,"dataGaName":399,"dataGaLocation":400},"search login","search",{"text":402,"default":403},"Suggestions",[404,406,410,412,416,420],{"text":74,"config":405},{"href":79,"dataGaName":74,"dataGaLocation":400},{"text":407,"config":408},"Code Suggestions (AI)",{"href":409,"dataGaName":407,"dataGaLocation":400},"/solutions/code-suggestions/",{"text":126,"config":411},{"href":128,"dataGaName":126,"dataGaLocation":400},{"text":413,"config":414},"GitLab on AWS",{"href":415,"dataGaName":413,"dataGaLocation":400},"/partners/technology-partners/aws/",{"text":417,"config":418},"GitLab on Google Cloud",{"href":419,"dataGaName":417,"dataGaLocation":400},"/partners/technology-partners/google-cloud-platform/",{"text":421,"config":422},"Why GitLab?",{"href":87,"dataGaName":421,"dataGaLocation":400},{"freeTrial":424,"mobileIcon":429,"desktopIcon":434,"secondaryButton":437},{"text":425,"config":426},"Start free trial",{"href":427,"dataGaName":50,"dataGaLocation":428},"https://gitlab.com/-/trials/new/","nav",{"altText":430,"config":431},"Gitlab Icon",{"src":432,"dataGaName":433,"dataGaLocation":428},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":430,"config":435},{"src":436,"dataGaName":433,"dataGaLocation":428},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":438,"config":439},"Get Started",{"href":440,"dataGaName":441,"dataGaLocation":428},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":443,"mobileIcon":447,"desktopIcon":449},{"text":444,"config":445},"Learn more about GitLab Duo",{"href":79,"dataGaName":446,"dataGaLocation":428},"gitlab duo",{"altText":430,"config":448},{"src":432,"dataGaName":433,"dataGaLocation":428},{"altText":430,"config":450},{"src":436,"dataGaName":433,"dataGaLocation":428},{"freeTrial":452,"mobileIcon":457,"desktopIcon":459},{"text":453,"config":454},"Back to pricing",{"href":206,"dataGaName":455,"dataGaLocation":428,"icon":456},"back to pricing","GoBack",{"altText":430,"config":458},{"src":432,"dataGaName":433,"dataGaLocation":428},{"altText":430,"config":460},{"src":436,"dataGaName":433,"dataGaLocation":428},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":466,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"title":467,"button":468,"image":473,"config":477,"_id":479,"_type":31,"_source":33,"_file":480,"_stem":481,"_extension":36},"/shared/en-us/banner","is now in public beta!",{"text":469,"config":470},"Try the Beta",{"href":471,"dataGaName":472,"dataGaLocation":45},"/gitlab-duo/agent-platform/","duo banner",{"altText":474,"config":475},"GitLab Duo Agent Platform",{"src":476},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":478},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":483,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"data":484,"_id":721,"_type":31,"title":722,"_source":33,"_file":723,"_stem":724,"_extension":36},"/shared/en-us/main-footer",{"text":485,"source":486,"edit":492,"contribute":497,"config":502,"items":507,"minimal":713},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":487,"config":488},"View page source",{"href":489,"dataGaName":490,"dataGaLocation":491},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":493,"config":494},"Edit this page",{"href":495,"dataGaName":496,"dataGaLocation":491},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":498,"config":499},"Please contribute",{"href":500,"dataGaName":501,"dataGaLocation":491},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":503,"facebook":504,"youtube":505,"linkedin":506},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[508,555,606,650,679],{"title":204,"links":509,"subMenu":524},[510,514,519],{"text":511,"config":512},"View plans",{"href":206,"dataGaName":513,"dataGaLocation":491},"view plans",{"text":515,"config":516},"Why Premium?",{"href":517,"dataGaName":518,"dataGaLocation":491},"/pricing/premium/","why premium",{"text":520,"config":521},"Why Ultimate?",{"href":522,"dataGaName":523,"dataGaLocation":491},"/pricing/ultimate/","why ultimate",[525],{"title":526,"links":527},"Contact Us",[528,531,533,535,540,545,550],{"text":529,"config":530},"Contact sales",{"href":54,"dataGaName":55,"dataGaLocation":491},{"text":383,"config":532},{"href":385,"dataGaName":386,"dataGaLocation":491},{"text":388,"config":534},{"href":390,"dataGaName":391,"dataGaLocation":491},{"text":536,"config":537},"Status",{"href":538,"dataGaName":539,"dataGaLocation":491},"https://status.gitlab.com/","status",{"text":541,"config":542},"Terms of use",{"href":543,"dataGaName":544,"dataGaLocation":491},"/terms/","terms of use",{"text":546,"config":547},"Privacy statement",{"href":548,"dataGaName":549,"dataGaLocation":491},"/privacy/","privacy statement",{"text":551,"config":552},"Cookie preferences",{"dataGaName":553,"dataGaLocation":491,"id":554,"isOneTrustButton":108},"cookie preferences","ot-sdk-btn",{"title":107,"links":556,"subMenu":564},[557,561],{"text":558,"config":559},"DevSecOps platform",{"href":72,"dataGaName":560,"dataGaLocation":491},"devsecops platform",{"text":130,"config":562},{"href":79,"dataGaName":563,"dataGaLocation":491},"ai-assisted development",[565],{"title":566,"links":567},"Topics",[568,573,578,582,587,591,596,601],{"text":569,"config":570},"CICD",{"href":571,"dataGaName":572,"dataGaLocation":491},"/topics/ci-cd/","cicd",{"text":574,"config":575},"GitOps",{"href":576,"dataGaName":577,"dataGaLocation":491},"/topics/gitops/","gitops",{"text":25,"config":579},{"href":580,"dataGaName":581,"dataGaLocation":491},"/topics/devops/","devops",{"text":583,"config":584},"Version Control",{"href":585,"dataGaName":586,"dataGaLocation":491},"/topics/version-control/","version control",{"text":588,"config":589},"DevSecOps",{"href":590,"dataGaName":22,"dataGaLocation":491},"/topics/devsecops/",{"text":592,"config":593},"Cloud Native",{"href":594,"dataGaName":595,"dataGaLocation":491},"/topics/cloud-native/","cloud native",{"text":597,"config":598},"AI for Coding",{"href":599,"dataGaName":600,"dataGaLocation":491},"/topics/devops/ai-for-coding/","ai for coding",{"text":602,"config":603},"Agentic AI",{"href":604,"dataGaName":605,"dataGaLocation":491},"/topics/agentic-ai/","agentic ai",{"title":607,"links":608},"Solutions",[609,611,613,618,622,625,629,632,634,637,640,645],{"text":151,"config":610},{"href":146,"dataGaName":151,"dataGaLocation":491},{"text":140,"config":612},{"href":122,"dataGaName":123,"dataGaLocation":491},{"text":614,"config":615},"Agile development",{"href":616,"dataGaName":617,"dataGaLocation":491},"/solutions/agile-delivery/","agile delivery",{"text":619,"config":620},"SCM",{"href":136,"dataGaName":621,"dataGaLocation":491},"source code management",{"text":569,"config":623},{"href":128,"dataGaName":624,"dataGaLocation":491},"continuous integration & delivery",{"text":626,"config":627},"Value stream management",{"href":179,"dataGaName":628,"dataGaLocation":491},"value stream management",{"text":574,"config":630},{"href":631,"dataGaName":577,"dataGaLocation":491},"/solutions/gitops/",{"text":189,"config":633},{"href":191,"dataGaName":192,"dataGaLocation":491},{"text":635,"config":636},"Small business",{"href":196,"dataGaName":197,"dataGaLocation":491},{"text":638,"config":639},"Public sector",{"href":201,"dataGaName":202,"dataGaLocation":491},{"text":641,"config":642},"Education",{"href":643,"dataGaName":644,"dataGaLocation":491},"/solutions/education/","education",{"text":646,"config":647},"Financial services",{"href":648,"dataGaName":649,"dataGaLocation":491},"/solutions/finance/","financial services",{"title":209,"links":651},[652,654,656,658,661,663,665,667,669,671,673,675,677],{"text":221,"config":653},{"href":223,"dataGaName":224,"dataGaLocation":491},{"text":226,"config":655},{"href":228,"dataGaName":229,"dataGaLocation":491},{"text":231,"config":657},{"href":233,"dataGaName":234,"dataGaLocation":491},{"text":236,"config":659},{"href":238,"dataGaName":660,"dataGaLocation":491},"docs",{"text":259,"config":662},{"href":261,"dataGaName":5,"dataGaLocation":491},{"text":254,"config":664},{"href":256,"dataGaName":257,"dataGaLocation":491},{"text":263,"config":666},{"href":265,"dataGaName":266,"dataGaLocation":491},{"text":276,"config":668},{"href":278,"dataGaName":279,"dataGaLocation":491},{"text":268,"config":670},{"href":270,"dataGaName":271,"dataGaLocation":491},{"text":281,"config":672},{"href":283,"dataGaName":284,"dataGaLocation":491},{"text":286,"config":674},{"href":288,"dataGaName":289,"dataGaLocation":491},{"text":291,"config":676},{"href":293,"dataGaName":294,"dataGaLocation":491},{"text":296,"config":678},{"href":298,"dataGaName":299,"dataGaLocation":491},{"title":314,"links":680},[681,683,685,687,689,691,693,697,702,704,706,708],{"text":321,"config":682},{"href":323,"dataGaName":316,"dataGaLocation":491},{"text":326,"config":684},{"href":328,"dataGaName":329,"dataGaLocation":491},{"text":334,"config":686},{"href":336,"dataGaName":337,"dataGaLocation":491},{"text":339,"config":688},{"href":341,"dataGaName":342,"dataGaLocation":491},{"text":344,"config":690},{"href":346,"dataGaName":347,"dataGaLocation":491},{"text":349,"config":692},{"href":351,"dataGaName":352,"dataGaLocation":491},{"text":694,"config":695},"Sustainability",{"href":696,"dataGaName":694,"dataGaLocation":491},"/sustainability/",{"text":698,"config":699},"Diversity, inclusion and belonging (DIB)",{"href":700,"dataGaName":701,"dataGaLocation":491},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":354,"config":703},{"href":356,"dataGaName":357,"dataGaLocation":491},{"text":364,"config":705},{"href":366,"dataGaName":367,"dataGaLocation":491},{"text":369,"config":707},{"href":371,"dataGaName":372,"dataGaLocation":491},{"text":709,"config":710},"Modern Slavery Transparency Statement",{"href":711,"dataGaName":712,"dataGaLocation":491},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":714},[715,717,719],{"text":541,"config":716},{"href":543,"dataGaName":544,"dataGaLocation":491},{"text":546,"config":718},{"href":548,"dataGaName":549,"dataGaLocation":491},{"text":551,"config":720},{"dataGaName":553,"dataGaLocation":491,"id":554,"isOneTrustButton":108},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[726],{"_path":727,"_dir":728,"_draft":6,"_partial":6,"_locale":7,"content":729,"config":733,"_id":735,"_type":31,"title":19,"_source":33,"_file":736,"_stem":737,"_extension":36},"/en-us/blog/authors/darby-frey","authors",{"name":19,"config":730},{"headshot":731,"ctfId":732},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749668565/Blog/Author%20Headshots/darbyfrey-headshot.png","darbyfrey",{"template":734},"BlogAuthor","content:en-us:blog:authors:darby-frey.yml","en-us/blog/authors/darby-frey.yml","en-us/blog/authors/darby-frey",{"_path":739,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"header":740,"eyebrow":741,"blurb":742,"button":743,"secondaryButton":747,"_id":749,"_type":31,"title":750,"_source":33,"_file":751,"_stem":752,"_extension":36},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":47,"config":744},{"href":745,"dataGaName":50,"dataGaLocation":746},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":52,"config":748},{"href":54,"dataGaName":55,"dataGaLocation":746},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":754,"content":755,"config":758,"_id":30,"_type":31,"title":32,"_source":33,"_file":34,"_stem":35,"_extension":36},{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},{"title":17,"description":10,"authors":756,"heroImage":11,"date":20,"body":21,"category":22,"tags":757},[19],[24,25,26],{"slug":28,"featured":6,"template":29},1761814433749]