[{"data":1,"prerenderedAt":2388},["ShallowReactive",2],{"/blog/gitlab-pages-setup":3,"navigation-en-us":1605,"banner-en-us":2031,"footer-en-us":2041,"blog-post-authors-en-us-Marcia Ramos":2283,"blog-related-posts-en-us-gitlab-pages-setup":2298,"blog-promotions-en-us":2324,"next-steps-en-us":2378},{"id":4,"title":5,"authors":6,"body":8,"category":1551,"date":1552,"description":1553,"extension":1554,"externalUrl":1555,"faq":1555,"featured":1556,"heroImage":1557,"meta":1558,"navigation":709,"path":1596,"seo":1597,"slug":1601,"stem":1602,"tags":1555,"template":1603,"updatedDate":1555,"__hash__":1604},"blogPosts/en-us/blog/gitlab-pages-setup.md","Hosting on GitLab.com with GitLab Pages",[7],"Marcia Ramos",{"type":9,"value":10,"toc":1518},"minimark",[11,29,32,70,79,82,87,94,96,101,104,115,118,130,154,158,161,170,177,181,194,206,216,220,235,261,279,301,314,331,338,348,352,355,378,382,391,395,398,442,452,458,461,465,477,585,643,646,650,662,669,681,690,767,803,836,840,856,862,972,1014,1039,1043,1046,1074,1080,1088,1101,1105,1115,1124,1132,1137,1185,1190,1235,1241,1253,1259,1281,1287,1290,1299,1302,1305,1312,1343,1348,1352,1356,1378,1385,1392,1398,1402,1410,1414,1425,1429,1435,1443,1446,1450,1463,1468,1472,1481,1490,1493,1498,1502,1514],[12,13,14,15,21,22,28],"p",{},"In this article we provide you with detailed information about using ",[16,17,20],"a",{"href":18,"rel":19},"https://pages.gitlab.io",[],"GitLab Pages"," to\nhost your website for free on ",[16,23,27],{"href":24,"rel":25,"title":26},"https://gitlab.com/users/sign_in",[],"Sign Up, it's free!","GitLab.com",".",[12,30,31],{},"We've prepared a step-by-step tutorial on creating a new project for GitLab Pages so you won't get lost in the process.",[12,33,34,35,40,41,45,46,51,52,56,57,56,60,56,63,66,67,28],{},"GitLab Pages supports ",[16,36,39],{"href":37,"rel":38},"https://en.wikipedia.org/wiki/Static_web_page",[],"static websites"," and builds ",[42,43,44],"strong",{},"any"," ",[16,47,50],{"href":48,"rel":49},"https://www.staticgen.com/",[],"Static Site Generator (SSG)",",\nsuch as ",[53,54,55],"span",{},"Jekyll",", ",[53,58,59],{},"Hugo",[53,61,62],{},"Hexo",[53,64,65],{},"Middleman"," and ",[53,68,69],{},"Pelican",[12,71,72,73,78],{},"We are assuming that you are familiar with ",[16,74,77],{"href":75,"rel":76},"https://git-scm.com/about",[],"Git"," and with the web development process, from creation to publishing.",[80,81],"hr",{},[83,84,86],"h3",{"id":85},"whats-in-this-tutorial","What's in this tutorial?",[88,89,90],"ul",{},[91,92,93],"li",{},"TOC",[80,95],{},[97,98,100],"h2",{"id":99},"getting-started","Getting Started",[12,102,103],{},"There are two ways of getting started with GitLab Pages: either you fork an existing project, or you create a new one for yourself.",[12,105,106,107,111,112,114],{},"On the ",[16,108,110],{"href":18,"rel":109},[],"GitLab Pages Quick Start Guide",", which is, by the way, a site built with ",[53,113,65],{},",\nyou will find the steps for forking an existing project from a list of examples prepared for you.\nThere are some popular SSGs, like Jekyll, Hugo, Hexo, Brunch, etc.",[12,116,117],{},"However, if you want to understand the process of creating a new project from scratch, this post is for you.",[12,119,120,121,125,126,129],{},"On the official documentation you can learn about ",[16,122,20],{"href":123,"rel":124},"https://docs.gitlab.com/pages/README/#getting-started-with-gitlab-pages",[],", but here we will focus on the ",[42,127,128],{},"steps","\nfor creating your own project.",[12,131,132,45,135,139,140,66,143,147,148,153],{},[42,133,134],{},"Note:",[16,136,138],{"href":137},"/blog/gitlab-pages-get-started/","GitLab Pages was introduced in GitLab EE 8.3",".\nIt is available for ",[16,141,27],{"href":24,"rel":142,"title":26},[],[16,144,146],{"href":145},"/pricing/feature-comparison/","GitLab Enterprise Edition"," users.\nUpdate: ",[16,149,152],{"href":150,"rel":151},"https://docs.gitlab.com/releases/#gitlab-pages-in-community-edition",[],"GitLab 8.17","\nbrought GitLab Pages to GitLab Community Edition! Enjoy!",[97,155,157],{"id":156},"website-types","Website Types",[12,159,160],{},"In general, you are allowed to create and host two sorts of websites with GitLab Pages:",[162,163,164,167],"ol",{},[91,165,166],{},"User/Group Websites - a single site per user or group",[91,168,169],{},"Project Websites - as many sites you want",[12,171,172,173,28],{},"You can find out more about them on the ",[16,174,176],{"href":123,"rel":175},[],"docs",[83,178,180],{"id":179},"a-note-regarding-gitlab-groups-and-namespaces","A note regarding GitLab Groups and Namespaces",[12,182,183,184,189,190,193],{},"Creating a ",[16,185,188],{"href":186,"rel":187},"https://docs.gitlab.com/workflow/groups/",[],"group"," on GitLab is very useful when you have several projects with the same subject.\nA group has its own ",[42,191,192],{},"namespace",", which is unique for each group (and for each user).",[12,195,196,197,201,202,205],{},"The important matter is, when you create your account on GitLab, it's better to choose a username for\nyourself as a person, not as a company. You can create your \"company username\" later, as a group\nnamespace. For example, let's say your name is \"John Doe\" and your company is called \"Foo Main\".\nFirst, register yourself as ",[198,199,200],"code",{},"johndoe"," and later create a group called Foo Main within the namespace of\n",[198,203,204],{},"foomain",". This will allow you to separate your personal projects from your company ones.",[12,207,208,209,212,213,28],{},"If you follow this tip, you will be able to access your personal site under ",[198,210,211],{},"https://username.gitlab.io","\nand your company site under ",[198,214,215],{},"https://groupname.gitlab.io",[97,217,219],{"id":218},"about-gitlab-ci-for-gitlab-pages","About GitLab CI for GitLab Pages",[12,221,222,223,231,232,28],{},"The key to having everything up and running as expected is the ",[16,224,227,230],{"href":225,"rel":226},"https://docs.gitlab.com/ci/quick_start/README/#creating-a-.gitlab-ci.yml-file",[],[42,228,229],{},"GitLab CI"," configuration file",", called ",[198,233,234],{},".gitlab-ci.yml",[12,236,237,238,243,244,252,253,256,257,260],{},"This file ",[16,239,242],{"href":240,"rel":241},"https://docs.gitlab.com/ci/yaml/README/",[],"configures"," how your website will be built by a ",[245,246,247],"em",{},[16,248,251],{"href":249,"rel":250},"https://docs.gitlab.com/ci/quick_start/README/#configuring-a-runner",[],"Runner",".\nIt is written in ",[53,254,255],{},"YAML",", which has its own syntax, so we recommend you\nfollow this ",[53,258,259],{},"quick start guide"," before setting it up.\nIt needs to be placed at your root directory.",[12,262,263,264,56,267,270,271,274,275,278],{},"The most important fact is that with ",[16,265,229],{"href":266},"/solutions/continuous-integration/",[42,268,269],{},"you"," take control over your builds.\nThey won't be in an invisible black box where you don't know what is going on!\nYou can actually ",[42,272,273],{},"see"," any build running live by navigating to your project's ",[42,276,277],{},"Pipelines > Builds > Build ID",".\nYou can also add any command to your script. This is far beyond useful as it allows you to do\npretty much anything you do on your local machine!",[12,280,281,282,285,286,289,290,293,294,293,297,300],{},"For example, you can add any ",[53,283,284],{},"Jekyll Plugin"," to your Jekyll site,\nyou can require any ",[198,287,288],{},"gem"," you need in your ",[198,291,292],{},"Gemfile",", run ",[198,295,296],{},"npm",[198,298,299],{},"bundle"," and much more.\nBottom line, it's as handy as having your own command line on your GitLab UI.",[12,302,303,304,306,307,310,311,313],{},"Additionally, you can have a distinct ",[198,305,234],{}," for each repository - even for each branch.\nThis means you can test your script in parallel branches before pushing to your ",[198,308,309],{},"main"," branch.\nIf the build succeeds, you merge. If it doesn't, you can make adjustments and try building\nagain without messing up your ",[198,312,309],{}," branch.",[12,315,316,317,319,320,326,327,330],{},"Before you push any ",[198,318,234],{}," to your project, you can\nvalidate its syntax with the tool called ",[16,321,325],{"href":322,"rel":323,"title":324},"https://gitlab.com/ci/lint",[],"Try me!","CI Lint",".\nYou need to be logged into your account to have access to this tool.\nIt's found by navigating to your project's ",[42,328,329],{},"Pipelines",": there is a button at the top-right of your screen.",[12,332,333],{},[334,335],"img",{"alt":336,"src":337},"CI-Lint","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398421/blog/Content%20Images/gitlab-pages/gitlab-ci-lint.png",[12,339,340,341,347],{},"You can read through the ",[16,342,344,345],{"href":240,"rel":343},[],"full documentation for ",[198,346,234],{}," for more information.",[97,349,351],{"id":350},"creating-new-gitlab-pages-projects","Creating new GitLab Pages projects",[12,353,354],{},"Here is an overview of the steps we'll take, assuming you already have your GitLab.com account:",[162,356,357,360,366,369,375],{},[91,358,359],{},"Create a new project",[91,361,362,363,365],{},"Add the configuration file (",[198,364,234],{},")",[91,367,368],{},"Upload your website content",[91,370,371,372],{},"Add your custom domain ",[245,373,374],{},"(optional)",[91,376,377],{},"Done!",[97,379,381],{"id":380},"step-by-step","Step-by-step",[12,383,384,385,390],{},"Now we will go through this process step-by-step. Update: watch the video tutorial on\n",[16,386,389],{"href":387,"rel":388},"https://youtu.be/TWqh9MtT4Bg",[],"How to Publish a Website with GitLab Pages on GitLab.com from a forked project","!",[83,392,394],{"id":393},"step-1-create-a-new-project","Step 1: Create a new project",[12,396,397],{},"This is as straight-forward as you can imagine:",[88,399,400,411],{},[91,401,402,403,406,407,410],{},"On your ",[42,404,405],{},"dashboard"," you will see a big green button called ",[42,408,409],{},"+ New Project",". Click on it.",[91,412,413,414],{},"Set the first things up:\n",[88,415,416,425],{},[91,417,418,421,422],{},[42,419,420],{},"Project path"," - your project's name, accessed via ",[198,423,424],{},"https://gitlab.com/namespace/projectname",[91,426,427,430,431,434,435,438,439,365],{},[42,428,429],{},"Privacy"," - choose if you want your project to be visible and accessible just for you (",[198,432,433],{},"private","),\njust for GitLab.com users (",[198,436,437],{},"internal",") or free to anyone to view, clone, fork and download it (",[198,440,441],{},"public",[12,443,444,447,448,451],{},[42,445,446],{},"Note",": you can host your website on ",[16,449,27],{"href":450},"/pricing/"," even if it is stored in a private repository.\nIf you do so, you can have your project protected - only the static site will be visible\nto the public - via \"Inspect Element\" or \"View-Source\" from their web browsers.",[83,453,455,456],{"id":454},"step-2-add-the-configuration-file-gitlab-ciyml","Step 2: Add the configuration file: ",[198,457,234],{},[12,459,460],{},"Now we can have some fun! Let's tell GitLab CI how to build the site.\nYou will see a few examples below (options A, B, and C) to understand how they work.",[83,462,464],{"id":463},"option-a-gitlab-ci-for-plain-html-websites","Option A: GitLab CI for plain HTML websites",[12,466,467,468,473,474,476],{},"In order to build your ",[16,469,472],{"href":470,"rel":471},"https://docs.gitlab.com/pages/README/#how-.gitlab-ci.yml-looks-like-when-the-static-content-is-in-your-repository",[],"plain HTML site"," with GitLab Pages,\nyour ",[198,475,234],{}," file doesn't need much:",[478,479,484],"pre",{"className":480,"code":481,"language":482,"meta":483,"style":483},"language-yaml shiki shiki-themes github-light","pages:\n  stage: deploy\n  script:\n  - mkdir .public\n  - cp -r * .public\n  - mv .public public\n  artifacts:\n    paths:\n    - public\n  only:\n  - main\n\n","yaml","",[198,485,486,498,511,519,528,536,544,552,560,569,577],{"__ignoreMap":483},[53,487,490,494],{"class":488,"line":489},"line",1,[53,491,493],{"class":492},"shJU0","pages",[53,495,497],{"class":496},"sgsFI",":\n",[53,499,501,504,507],{"class":488,"line":500},2,[53,502,503],{"class":492},"  stage",[53,505,506],{"class":496},": ",[53,508,510],{"class":509},"sYBdl","deploy\n",[53,512,514,517],{"class":488,"line":513},3,[53,515,516],{"class":492},"  script",[53,518,497],{"class":496},[53,520,522,525],{"class":488,"line":521},4,[53,523,524],{"class":496},"  - ",[53,526,527],{"class":509},"mkdir .public\n",[53,529,531,533],{"class":488,"line":530},5,[53,532,524],{"class":496},[53,534,535],{"class":509},"cp -r * .public\n",[53,537,539,541],{"class":488,"line":538},6,[53,540,524],{"class":496},[53,542,543],{"class":509},"mv .public public\n",[53,545,547,550],{"class":488,"line":546},7,[53,548,549],{"class":492},"  artifacts",[53,551,497],{"class":496},[53,553,555,558],{"class":488,"line":554},8,[53,556,557],{"class":492},"    paths",[53,559,497],{"class":496},[53,561,563,566],{"class":488,"line":562},9,[53,564,565],{"class":496},"    - ",[53,567,568],{"class":509},"public\n",[53,570,572,575],{"class":488,"line":571},10,[53,573,574],{"class":492},"  only",[53,576,497],{"class":496},[53,578,580,582],{"class":488,"line":579},11,[53,581,524],{"class":496},[53,583,584],{"class":509},"main\n",[12,586,587,588,595,596,602,603,609,610,617,618,625,626,632,633,640,641,313],{},"What this code is doing is creating a ",[245,589,590],{},[16,591,594],{"href":592,"rel":593},"https://docs.gitlab.com/ce/ci/yaml/README/#jobs",[],"job"," called ",[245,597,598],{},[16,599,493],{"href":600,"rel":601},"https://docs.gitlab.com/pages/README/#explore-the-contents-of-.gitlab-ci.yml",[],"\ntelling the ",[245,604,605],{},[16,606,251],{"href":607,"rel":608},"https://docs.gitlab.com/ci/quick_start/README/#shared-runners",[]," to ",[245,611,612],{},[16,613,616],{"href":614,"rel":615},"https://docs.gitlab.com/ce/ci/yaml/README/#stages",[],"deploy"," the website ",[245,619,620],{},[16,621,624],{"href":622,"rel":623},"https://docs.gitlab.com/ci/yaml/README/#artifacts",[],"artifacts","\nto a ",[245,627,628],{},[16,629,631],{"href":600,"rel":630},[],"public path",",\nwhenever a commit is pushed ",[245,634,635],{},[16,636,639],{"href":637,"rel":638},"https://docs.gitlab.com/ci/yaml/README/#only-and-except",[],"only"," to the ",[198,642,309],{},[12,644,645],{},"All pages are created after the build completes successfully\nand the artifacts for the pages job are uploaded to GitLab.",[83,647,649],{"id":648},"option-b-gitlab-ci-for-jekyll-websites","Option B: GitLab CI for Jekyll websites",[12,651,652,653,656,657,661],{},"Jekyll is so far the most popular ",[16,654,50],{"href":48,"rel":655},[]," available, that's why we'll use it as a first example\nfor configuring our GitLab CI. On the next section you'll find more ",[16,658,660],{"href":659},"#examples","examples"," for SSGs already tested with GitLab Pages.",[12,663,664,665,668],{},"Jekyll is written in ",[53,666,667],{},"Ruby"," and generates static blog-aware websites.\nBlog-aware means a website generator will create blog-style content, such as lists of\ncontent in reverse chronological order, archive lists, and\nother common blog-style features.",[12,670,671,672,56,675,66,678,680],{},"We can write dynamically with ",[53,673,674],{},"Liquid",[53,676,677],{},"Markdown",[53,679,255],{}," and\nJekyll builds the static site (HTML, CSS, JS) for us.\nYou will find the same functionality for every SSG,\nyet each of them uses its own environment, template system, markup language, etc.",[12,682,683,684,689],{},"If you want GitLab Pages to ",[16,685,688],{"href":686,"rel":687},"https://docs.gitlab.com/pages/README/#how-.gitlab-ci.yml-looks-like-when-using-a-static-generator",[],"build your Jekyll website",",\nyou can start with the simple script below:",[478,691,693],{"className":480,"code":692,"language":482,"meta":483,"style":483},"image: ruby:2.1\n\npages:\n  script:\n  - gem install jekyll\n  - jekyll build -d public/\n  artifacts:\n    paths:\n    - public\n  only:\n  - main\n\n",[198,694,695,705,711,717,723,730,737,743,749,755,761],{"__ignoreMap":483},[53,696,697,700,702],{"class":488,"line":489},[53,698,699],{"class":492},"image",[53,701,506],{"class":496},[53,703,704],{"class":509},"ruby:2.1\n",[53,706,707],{"class":488,"line":500},[53,708,710],{"emptyLinePlaceholder":709},true,"\n",[53,712,713,715],{"class":488,"line":513},[53,714,493],{"class":492},[53,716,497],{"class":496},[53,718,719,721],{"class":488,"line":521},[53,720,516],{"class":492},[53,722,497],{"class":496},[53,724,725,727],{"class":488,"line":530},[53,726,524],{"class":496},[53,728,729],{"class":509},"gem install jekyll\n",[53,731,732,734],{"class":488,"line":538},[53,733,524],{"class":496},[53,735,736],{"class":509},"jekyll build -d public/\n",[53,738,739,741],{"class":488,"line":546},[53,740,549],{"class":492},[53,742,497],{"class":496},[53,744,745,747],{"class":488,"line":554},[53,746,557],{"class":492},[53,748,497],{"class":496},[53,750,751,753],{"class":488,"line":562},[53,752,565],{"class":496},[53,754,568],{"class":509},[53,756,757,759],{"class":488,"line":571},[53,758,574],{"class":492},[53,760,497],{"class":496},[53,762,763,765],{"class":488,"line":579},[53,764,524],{"class":496},[53,766,584],{"class":509},[12,768,769,770,777,778,785,786,788,789,794,795,800,801,28],{},"This code requires the ",[245,771,772],{},[16,773,776],{"href":774,"rel":775},"https://docs.gitlab.com/ci/yaml/README/#script",[],"script"," to run on\nthe ",[245,779,780],{},[16,781,784],{"href":782,"rel":783},"https://docs.gitlab.com/ci/yaml/README/#image-and-services",[],"environment"," of ",[53,787,667],{}," 2.1.x,\ninstalls the Jekyll gem, and builds the site\nto the ",[245,790,791],{},[16,792,631],{"href":600,"rel":793},[],".\nThe result affects ",[245,796,797],{},[16,798,639],{"href":637,"rel":799},[]," the main branch.\nFor building a regular Jekyll site, you can just\ncopy this code and paste it into your ",[198,802,234],{},[12,804,805,806,809,810,815,816,820,821,826,827,832,833],{},"If you are familiar with Jekyll, you will probably want to use ",[53,807,808],{},"Bundler"," to build your Jekyll site.\nWe've prepared an ",[16,811,814],{"href":812,"rel":813},"https://gitlab.com/jekyll-themes/default-bundler",[],"example"," for that. Also, if you want to use a specific Jekyll version, you can\nfind an ",[16,817,814],{"href":818,"rel":819},"https://gitlab.com/jekyll-themes/carte-noire",[]," in the ",[16,822,825],{"href":823,"rel":824},"https://gitlab.com/groups/jekyll-themes",[],"Jekyll Themes","\ngroup I set up for the purposes of this post.\nAnd of course, since you are the one who controls how GitLab CI builds your site,\nyou are free to use any ",[16,828,831],{"href":829,"rel":830},"https://jekyllrb.com/docs/plugins/",[],"Jekyll Plugins",". ",[245,834,835],{},"Yep!",[83,837,839],{"id":838},"option-c-gitlab-ci-for-hexo-websites","Option C: GitLab CI for Hexo websites",[12,841,842,843,845,846,851,852,855],{},"Let's see another example. ",[53,844,62],{}," is a powerful blog-aware framework built with ",[16,847,850],{"href":848,"rel":849},"https://nodejs.org/en/",[],"NodeJS",",\na server-side JavaScript environment based on ",[53,853,854],{},"Google V8"," high-performance engine.",[12,857,858,859,861],{},"To build our Hexo site, we can start with this ",[198,860,234],{},":",[478,863,865],{"className":480,"code":864,"language":482,"meta":483,"style":483},"image: node:4.2.2\n\npages:\n  cache:\n    paths:\n    - node_modules/\n\n  script:\n  - npm install hexo-cli -g\n  - npm install\n  - hexo deploy\n  artifacts:\n    paths:\n    - public\n  only:\n    - main\n\n",[198,866,867,876,880,886,893,899,906,910,916,923,930,937,944,951,958,965],{"__ignoreMap":483},[53,868,869,871,873],{"class":488,"line":489},[53,870,699],{"class":492},[53,872,506],{"class":496},[53,874,875],{"class":509},"node:4.2.2\n",[53,877,878],{"class":488,"line":500},[53,879,710],{"emptyLinePlaceholder":709},[53,881,882,884],{"class":488,"line":513},[53,883,493],{"class":492},[53,885,497],{"class":496},[53,887,888,891],{"class":488,"line":521},[53,889,890],{"class":492},"  cache",[53,892,497],{"class":496},[53,894,895,897],{"class":488,"line":530},[53,896,557],{"class":492},[53,898,497],{"class":496},[53,900,901,903],{"class":488,"line":538},[53,902,565],{"class":496},[53,904,905],{"class":509},"node_modules/\n",[53,907,908],{"class":488,"line":546},[53,909,710],{"emptyLinePlaceholder":709},[53,911,912,914],{"class":488,"line":554},[53,913,516],{"class":492},[53,915,497],{"class":496},[53,917,918,920],{"class":488,"line":562},[53,919,524],{"class":496},[53,921,922],{"class":509},"npm install hexo-cli -g\n",[53,924,925,927],{"class":488,"line":571},[53,926,524],{"class":496},[53,928,929],{"class":509},"npm install\n",[53,931,932,934],{"class":488,"line":579},[53,933,524],{"class":496},[53,935,936],{"class":509},"hexo deploy\n",[53,938,940,942],{"class":488,"line":939},12,[53,941,549],{"class":492},[53,943,497],{"class":496},[53,945,947,949],{"class":488,"line":946},13,[53,948,557],{"class":492},[53,950,497],{"class":496},[53,952,954,956],{"class":488,"line":953},14,[53,955,565],{"class":496},[53,957,568],{"class":509},[53,959,961,963],{"class":488,"line":960},15,[53,962,574],{"class":492},[53,964,497],{"class":496},[53,966,968,970],{"class":488,"line":967},16,[53,969,565],{"class":496},[53,971,584],{"class":509},[12,973,974,975,980,981,984,985,987,988,991,992,995,996,999,1000,1002,1003,1005,1006,1008,1009,1011,1012,313],{},"Note that the ",[16,976,979],{"href":977,"rel":978},"https://hub.docker.com/_/node/",[],"Docker image"," we require is ",[198,982,983],{},"node:4.2.2",".\nWe are archiving ",[198,986,296],{}," modules into the ",[198,989,990],{},"cache",", installing ",[198,993,994],{},"hexo-cli"," and deploying\nour ",[198,997,998],{},"hexo"," site to the default ",[198,1001,441],{}," directory, uploaded to GitLab as ",[198,1004,624],{},".\nThe ",[198,1007,493],{}," job is ",[198,1010,639],{}," affecting the ",[198,1013,309],{},[12,1015,106,1016,1021,1022,1027,1028,1033,1034,1038],{},[16,1017,1020],{"href":1018,"rel":1019},"https://gitlab.com/groups/pages",[],"Pages"," group you will find a default ",[16,1023,1026],{"href":1024,"rel":1025},"https://gitlab.com/pages/hexo",[],"Hexo site","\ndeployed with GitLab Pages, and on ",[16,1029,1032],{"href":1030,"rel":1031},"https://gitlab.com/themes-templates",[],"this group",", another ",[16,1035,814],{"href":1036,"rel":1037},"https://gitlab.com/themes-templates/hexo",[],"\nwith a slightly different configuration.",[83,1040,1042],{"id":1041},"step-3-upload-your-website-content","Step 3: Upload your website content",[12,1044,1045],{},"Push the content to your remote project and keep an eye on the build!",[12,1047,1048,1051,1052,1055,1056,1058,1059,1062,1063,1058,1065,1055,1067,1069,1070,1073],{},[42,1049,1050],{},"Don't forget:"," when you are using GitLab Pages with a Static Site Generator,\ndo not upload the directory which your SSG generated locally,\notherwise you'll have duplicated contents and you might face build errors.\nFor example, do not commit the ",[198,1053,1054],{},"_site"," directory (",[53,1057,55],{},") or the ",[198,1060,1061],{},"build"," directory\n(",[53,1064,65],{},[198,1066,441],{},[53,1068,62],{},"). You can do this automatically by adding\nthem to a ",[198,1071,1072],{},".gitignore"," file, placed at your project's root directory.",[12,1075,1076,1077,1079],{},"E.g., if you are building a Jekyll site, your ",[198,1078,1072],{}," will have this line:",[478,1081,1086],{"className":1082,"code":1084,"language":1085,"meta":483},[1083],"language-text","_site\n","text",[198,1087,1084],{"__ignoreMap":483},[12,1089,1090,1091,1093,1094,28],{},"A ",[198,1092,1072],{}," is very useful to avoid uploading to your remote repository any file or folder within your project.\nIf you want to know more about it, check the ",[16,1095,1098,1100],{"href":1096,"rel":1097},"https://git-scm.com/docs/gitignore",[],[198,1099,1072],{}," official docs",[83,1102,1104],{"id":1103},"step-4-add-your-custom-domain","Step 4: Add your custom domain",[12,1106,1107,1109,1110,28],{},[42,1108,134],{}," Custom CNAMEs with TLS support were introduced in ",[16,1111,1114],{"href":1112,"rel":1113},"https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/173",[],"GitLab EE 8.5",[12,1116,1117,1118,1123],{},"If you want, you are free to ",[16,1119,1122],{"href":1120,"rel":1121},"https://docs.gitlab.com/pages/README/#add-a-custom-domain-to-your-pages-website",[],"add your own domain(s) name"," to your website hosted by GitLab.com.",[12,1125,1126,1127,28],{},"It's not required though, you can always use the standard\n",[16,1128,1131],{"href":1129,"rel":1130},"https://docs.gitlab.com/user/project/pages/getting_started_part_one/#gitlab-pages-default-domain-names",[],"GitLab Pages default domain names",[12,1133,1134],{},[245,1135,1136],{},"Features",[88,1138,1139,1149,1178],{},[91,1140,1141,1142,1145,1146,365],{},"Besides including your own domain, you can add your custom ",[42,1143,1144],{},"subdomain"," to your GitLab Pages project (e.g., ",[198,1147,1148],{},"subdomain.example.com",[91,1150,1151,1152,1155,1156,1159,1160,45,1163,66,1166,1169,1170,1173,1174,1177],{},"You can enter more than one domain alias ",[42,1153,1154],{},"per project"," (e.g., ",[198,1157,1158],{},"example.com",",\n",[198,1161,1162],{},"example.net",[198,1164,1165],{},"my.example.org",[198,1167,1168],{},"another-example.com"," pointing to your project under ",[198,1171,1172],{},"mynamespace.gitlab.io"," or\n",[198,1175,1176],{},"mynamespace.gitlab.io/myproject","). A domain alias is like having multiple front doors to one location.",[91,1179,1180,1181,1184],{},"If you want to enable an HTTPS secure connection to your domains, you can affix your own SSL/TLS digital\ncertificate to ",[42,1182,1183],{},"each"," custom domain or subdomain you've added to your projects.",[12,1186,1187],{},[245,1188,1189],{},"Steps to set up a custom domain",[88,1191,1192,1202,1208,1211,1217],{},[91,1193,1194,1195,1198,1199],{},"From your project's dashboard, go to ",[42,1196,1197],{},"Settings"," () ",[42,1200,1201],{},"> Pages > New Domain",[91,1203,1204,1205],{},"Add your domain to the first field: ",[198,1206,1207],{},"mydomain.com",[91,1209,1210],{},"If you have an SSL/TLS digital certificate and its key, add them to their respective fields.\nIf you don't, just leave the fields blank.",[91,1212,1213,1214,28],{},"Click on ",[42,1215,1216],{},"Create New Domain",[91,1218,1219,1220,1229,1230,861],{},"Finally, access your domain control panel and create a new ",[16,1221,1224,1225,1228],{"href":1222,"rel":1223},"https://support.dnsimple.com/articles/a-record/",[],"DNS ",[198,1226,1227],{},"A"," record"," pointing\nto the ",[16,1231,1234],{"href":1232,"rel":1233},"https://docs.gitlab.com/user/gitlab_com/#gitlab-pages",[],"IP of GitLab Pages server",[478,1236,1239],{"className":1237,"code":1238,"language":1085,"meta":483},[1083],"mydomain.com A 35.185.44.232\n",[198,1240,1238],{"__ignoreMap":483},[12,1242,1243,1245,1246,609,1249,1252],{},[42,1244,134],{}," This GitLab Pages IP address for GitLab.com changed from ",[198,1247,1248],{},"52.167.214.135",[198,1250,1251],{},"35.185.44.232"," in August 2018.",[12,1254,1255,1256,861],{},"Alternatively, a similar procedure can be applied for ",[42,1257,1258],{},"custom subdomains",[88,1260,1261,1267],{},[91,1262,1263,1264],{},"Add the subdomain to the first field: ",[198,1265,1266],{},"subdomain.mydomain.com",[91,1268,1269,1270,1277,1278,861],{},"Then create a new ",[16,1271,1224,1274,1228],{"href":1272,"rel":1273},"https://en.wikipedia.org/wiki/CNAME_record",[],[198,1275,1276],{},"CNAME"," pointing to ",[198,1279,1280],{},"myusername.gitlab.io",[478,1282,1285],{"className":1283,"code":1284,"language":1085,"meta":483},[1083],"subdomain.mydomain.com CNAME myusername.gitlab.io\n",[198,1286,1284],{"__ignoreMap":483},[12,1288,1289],{},"Repeat these steps for any additional domain aliases.",[12,1291,1292,1293,1298],{},"Note that how you set up your DNS records will depend upon which company you\nused to register your domain name. Every company has its own methods for DNS Zone Management.\nOn this link you can find an ",[16,1294,1297],{"href":1295,"rel":1296},"http://docs.businesscatalyst.com/user-manual/site-settings/site-domains/updating-dns-records-with-a-domain-registrar-external-dns",[],"overview for some providers",",\nit might help you to follow through. Please contact your provider directly if you need some extra help.",[12,1300,1301],{},"Ordinarily, DNS propagation needs some time to take effect, so don't worry if you can't access your\nwebsite under your custom domain instantaneously. Wait a few minutes and check it again.",[97,1303,1304],{"id":660},"Examples",[12,1306,1307,1308,1311],{},"Check out the ",[16,1309,1020],{"href":1018,"rel":1310},[]," official group for a list of example projects,\nwhere you can explore some good options for Static Site Generators for Ruby, NodeJS and Python environments.\nYou can also find more specific examples on the following groups, which I prepared for the purposes of this post:",[88,1313,1314,1320,1328,1335],{},[91,1315,1316,1319],{},[16,1317,825],{"href":823,"rel":1318},[]," (Ruby/Jekyll)",[91,1321,1322,1327],{},[16,1323,1326],{"href":1324,"rel":1325},"https://gitlab.com/groups/middleman-themes",[],"Middleman Themes"," (Ruby/Middleman)",[91,1329,1330,1334],{},[16,1331,1333],{"href":1030,"rel":1332},[],"Themes and Templates"," (Miscellaneous)",[91,1336,1337,1342],{},[16,1338,1341],{"href":1339,"rel":1340},"https://gitlab.com/groups/html-themes",[],"HTML Themes"," (plain HTML)",[12,1344,1345,1347],{},[42,1346,134],{}," these themes, templates and SSGs were casually chosen and listed on this\npost to provide you with some distinct GitLab CI configurations.",[97,1349,1351],{"id":1350},"faq","FAQ",[83,1353,1355],{"id":1354},"is-all-of-this-really-free-to-use","Is all of this really free to use?",[12,1357,1358,1359,1362,1363,1366,1367,1371,1372,1377],{},"Yes, it is! On ",[16,1360,27],{"href":24,"rel":1361,"title":26},[]," you can create your free account\nand enjoy all its ",[16,1364,1365],{"href":450},"features",", including unlimited private repositories,\nprojects, websites, and contributors. Also, you'll have 10GB disk space per project, ",[16,1368,1370],{"href":1232,"rel":1369},[],"1GB per Pages artifacts",",\nand unlimited total disk space. Awesome, isn't it? Why don't you take a peek at the ",[16,1373,1376],{"href":1374,"rel":1375},"https://gitlab.com/explore",[],"public projects","?",[83,1379,1381,1382,1384],{"id":1380},"where-is-the-public-folder","Where is the ",[198,1383,441],{}," folder?",[12,1386,1387,1388,1391],{},"When a build succeeds, you'll find your static site at your project's ",[42,1389,1390],{},"Pipelines > Builds > Build ID > Browse",".\nYou can download the artifacts from the same screen.",[12,1393,1394],{},[334,1395],{"alt":1396,"src":1397},"Build Artifacts - Browse or Download","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398421/blog/Content%20Images/gitlab-pages/gitlab-browse-download-artifacts.png",[83,1399,1401],{"id":1400},"can-i-really-use-any-static-site-generator","Can I really use any Static Site Generator?",[12,1403,1404,1405,1409],{},"Yes, you can use any ",[16,1406,1408],{"href":48,"rel":1407},[],"Static Site Generator"," available.",[83,1411,1413],{"id":1412},"can-i-use-free-ssltls-digital-certificates","Can I use free SSL/TLS digital certificates?",[12,1415,1416,1417,1421,1422,28],{},"Yes, absolutely! Need a suggestion? Try ",[16,1418,1420],{"href":1419},"/blog/tutorial-securing-your-gitlab-pages-with-tls-and-letsencrypt/","Let's Encrypt"," or ",[53,1423,1424],{},"Cloudflare",[83,1426,1428],{"id":1427},"can-i-contribute-to-the-themes","Can I contribute to the themes?",[12,1430,1431,1432,1434],{},"Sure! You are very welcome to contribute to the groups mentioned above.\nTo do that, please set your website up and make sure it's working as you expected.\nThen, add an issue to the ",[16,1433,188],{"href":659}," you're interested in. Don't forget to include a link to your project.\nAfter a brief evaluation, we'll be glad to fork your project and present your theme to our community!",[83,1436,1438,1439,1442],{"id":1437},"can-i-use-php-pages-and-connect-databases-with-my-sites","Can I use ",[198,1440,1441],{},".php"," pages and connect databases with my sites?",[12,1444,1445],{},"No. GitLab Pages hosts static websites only (HTML, CSS and JS).",[97,1447,1449],{"id":1448},"getting-help","Getting Help",[12,1451,1452,1453,1457,1458,1462],{},"If you need some help regarding GitLab Pages on GitLab.com,\nfeel free to use one of ",[16,1454,1456],{"href":1455},"/get-help/","our channels",". You can also open an issue on the ",[16,1459,1020],{"href":1460,"rel":1461},"https://gitlab.com/pages/pages.gitlab.io/issues",[]," group.",[12,1464,1465],{},[16,1466],{"name":1467},"conclusions",[97,1469,1471],{"id":1470},"conclusion","Conclusion",[12,1473,1474,1475,1480],{},"Hopefully now you understand how ",[42,1476,1477],{},[16,1478,20],{"href":18,"rel":1479},[]," works and how to create your new site.",[12,1482,1483,1484,1489],{},"Follow ",[16,1485,1488],{"href":1486,"rel":1487},"https://twitter.com/gitlab",[],"@GitLab"," on Twitter and stay tuned for updates!",[12,1491,1492],{},"We're looking forward to seeing your sites!",[12,1494,1495,1497],{},[42,1496,134],{}," this post has been updated (June 17th, 2016) to match the new GitLab UI.",[97,1499,1501],{"id":1500},"about-guest-author-marcia-ramos","About guest author Marcia Ramos",[12,1503,1504,1509,1510,1513],{},[16,1505,1508],{"href":1506,"rel":1507},"https://gitlab.com/marcia",[],"Marcia"," is a backend web developer specialized in WordPress and Jekyll sites at ",[53,1511,1512],{},"Virtua Creative",",\nthough she does some frontend too. Her daily work is based on version-controlled systems for almost 15 years.\nShe is driven by her thirst for knowledge and her eagerness to continuously expand her horizons.\nWhen she is not coding, she is writing articles, studying, teaching or contributing to open source projects here and there.\nUpdate: she's joined the GitLab Team in May, 2016.",[1515,1516,1517],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .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);}",{"title":483,"searchDepth":500,"depth":500,"links":1519},[1520,1521,1522,1525,1526,1527,1537,1538,1548,1549,1550],{"id":85,"depth":513,"text":86},{"id":99,"depth":500,"text":100},{"id":156,"depth":500,"text":157,"children":1523},[1524],{"id":179,"depth":513,"text":180},{"id":218,"depth":500,"text":219},{"id":350,"depth":500,"text":351},{"id":380,"depth":500,"text":381,"children":1528},[1529,1530,1532,1533,1534,1535,1536],{"id":393,"depth":513,"text":394},{"id":454,"depth":513,"text":1531},"Step 2: Add the configuration file: .gitlab-ci.yml",{"id":463,"depth":513,"text":464},{"id":648,"depth":513,"text":649},{"id":838,"depth":513,"text":839},{"id":1041,"depth":513,"text":1042},{"id":1103,"depth":513,"text":1104},{"id":660,"depth":500,"text":1304},{"id":1350,"depth":500,"text":1351,"children":1539},[1540,1541,1543,1544,1545,1546],{"id":1354,"depth":513,"text":1355},{"id":1380,"depth":513,"text":1542},"Where is the public folder?",{"id":1400,"depth":513,"text":1401},{"id":1412,"depth":513,"text":1413},{"id":1427,"depth":513,"text":1428},{"id":1437,"depth":513,"text":1547},"Can I use .php pages and connect databases with my sites?",{"id":1448,"depth":500,"text":1449},{"id":1470,"depth":500,"text":1471},{"id":1500,"depth":500,"text":1501},"engineering","2016-04-07","Learn how to host your website on GitLab.com with GitLab Pages","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749671069/Blog/Hero%20Images/gitlab-pages-setup-cover.jpg",{"excerpt":1559},{"type":9,"value":1560},[1561,1569,1571,1591],[12,1562,14,1563,21,1566,28],{},[16,1564,20],{"href":18,"rel":1565},[],[16,1567,27],{"href":24,"rel":1568,"title":26},[],[12,1570,31],{},[12,1572,34,1573,40,1576,45,1578,51,1581,56,1583,56,1585,56,1587,66,1589,28],{},[16,1574,39],{"href":37,"rel":1575},[],[42,1577,44],{},[16,1579,50],{"href":48,"rel":1580},[],[53,1582,55],{},[53,1584,59],{},[53,1586,62],{},[53,1588,65],{},[53,1590,69],{},[12,1592,72,1593,78],{},[16,1594,77],{"href":75,"rel":1595},[],"/en-us/blog/gitlab-pages-setup",{"title":5,"description":1553,"ogTitle":5,"ogDescription":1553,"noIndex":1556,"ogImage":1557,"ogUrl":1598,"ogSiteName":1599,"ogType":1600,"canonicalUrls":1598},"https://about.gitlab.com/blog/gitlab-pages-setup","https://about.gitlab.com","article","gitlab-pages-setup","en-us/blog/gitlab-pages-setup","BlogPost","I5iLfXmU0fFEV14OigIKXl9zsQNNmkjyUSJnKVPC1IA",{"logo":1606,"freeTrial":1611,"sales":1616,"login":1621,"items":1626,"search":1951,"minimal":1982,"duo":2001,"switchNav":2010,"pricingDeployment":2021},{"config":1607},{"href":1608,"dataGaName":1609,"dataGaLocation":1610},"/","gitlab logo","header",{"text":1612,"config":1613},"Get free trial",{"href":1614,"dataGaName":1615,"dataGaLocation":1610},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1617,"config":1618},"Request a demo",{"href":1619,"dataGaName":1620,"dataGaLocation":1610},"/sales/?contact-topic=request-demo","sales",{"text":1622,"config":1623},"Sign in",{"href":1624,"dataGaName":1625,"dataGaLocation":1610},"https://gitlab.com/users/sign_in/","sign in",[1627,1656,1755,1759,1873,1929],{"text":1628,"config":1629,"menu":1631},"Platform",{"dataNavLevelOne":1630},"platform",{"type":1632,"columns":1633},"cards",[1634,1640,1648],{"title":1628,"description":1635,"link":1636},"The intelligent orchestration platform for DevSecOps",{"text":1637,"config":1638},"Explore our Platform",{"href":1639,"dataGaName":1630,"dataGaLocation":1610},"/platform/",{"title":1641,"description":1642,"link":1643},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1644,"config":1645},"Meet GitLab Duo",{"href":1646,"dataGaName":1647,"dataGaLocation":1610},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1649,"description":1650,"link":1651},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1652,"config":1653},"Learn more",{"href":1654,"dataGaName":1655,"dataGaLocation":1610},"/why-gitlab/","why gitlab",{"text":1657,"left":709,"config":1658,"menu":1660},"Product",{"dataNavLevelOne":1659},"solutions",{"type":1661,"link":1662,"columns":1666,"feature":1734},"lists",{"text":1663,"config":1664},"View all Solutions",{"href":1665,"dataGaName":1659,"dataGaLocation":1610},"/solutions/",[1667,1690,1713],{"title":1668,"description":1669,"link":1670,"items":1675},"Automation","CI/CD and automation to accelerate deployment",{"config":1671},{"icon":1672,"href":1673,"dataGaName":1674,"dataGaLocation":1610},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1676,1679,1682,1686],{"text":1677,"config":1678},"CI/CD",{"href":266,"dataGaLocation":1610,"dataGaName":1677},{"text":1641,"config":1680},{"href":1646,"dataGaLocation":1610,"dataGaName":1681},"gitlab duo agent platform - product menu",{"text":1683,"config":1684},"Source Code Management",{"href":1685,"dataGaLocation":1610,"dataGaName":1683},"/solutions/source-code-management/",{"text":1687,"config":1688},"Automated Software Delivery",{"href":1673,"dataGaLocation":1610,"dataGaName":1689},"Automated software delivery",{"title":1691,"description":1692,"link":1693,"items":1698},"Security","Deliver code faster without compromising security",{"config":1694},{"href":1695,"dataGaName":1696,"dataGaLocation":1610,"icon":1697},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1699,1703,1708],{"text":1700,"config":1701},"Application Security Testing",{"href":1695,"dataGaName":1702,"dataGaLocation":1610},"Application security testing",{"text":1704,"config":1705},"Software Supply Chain Security",{"href":1706,"dataGaLocation":1610,"dataGaName":1707},"/solutions/supply-chain/","Software supply chain security",{"text":1709,"config":1710},"Software Compliance",{"href":1711,"dataGaName":1712,"dataGaLocation":1610},"/solutions/software-compliance/","software compliance",{"title":1714,"link":1715,"items":1720},"Measurement",{"config":1716},{"icon":1717,"href":1718,"dataGaName":1719,"dataGaLocation":1610},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1721,1725,1729],{"text":1722,"config":1723},"Visibility & Measurement",{"href":1718,"dataGaLocation":1610,"dataGaName":1724},"Visibility and Measurement",{"text":1726,"config":1727},"Value Stream Management",{"href":1728,"dataGaLocation":1610,"dataGaName":1726},"/solutions/value-stream-management/",{"text":1730,"config":1731},"Analytics & Insights",{"href":1732,"dataGaLocation":1610,"dataGaName":1733},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1735,"type":1661,"items":1736},"GitLab for",[1737,1743,1749],{"text":1738,"config":1739},"Enterprise",{"icon":1740,"href":1741,"dataGaLocation":1610,"dataGaName":1742},"Building","/enterprise/","enterprise",{"text":1744,"config":1745},"Small Business",{"icon":1746,"href":1747,"dataGaLocation":1610,"dataGaName":1748},"Work","/small-business/","small business",{"text":1750,"config":1751},"Public Sector",{"icon":1752,"href":1753,"dataGaLocation":1610,"dataGaName":1754},"Organization","/solutions/public-sector/","public sector",{"text":1756,"config":1757},"Pricing",{"href":450,"dataGaName":1758,"dataGaLocation":1610,"dataNavLevelOne":1758},"pricing",{"text":1760,"config":1761,"menu":1763},"Resources",{"dataNavLevelOne":1762},"resources",{"type":1661,"link":1764,"columns":1768,"feature":1862},{"text":1765,"config":1766},"View all resources",{"href":1767,"dataGaName":1762,"dataGaLocation":1610},"/resources/",[1769,1802,1829],{"title":1770,"items":1771},"Getting started",[1772,1777,1782,1787,1792,1797],{"text":1773,"config":1774},"Install",{"href":1775,"dataGaName":1776,"dataGaLocation":1610},"/install/","install",{"text":1778,"config":1779},"Quick start guides",{"href":1780,"dataGaName":1781,"dataGaLocation":1610},"/get-started/","quick setup checklists",{"text":1783,"config":1784},"Learn",{"href":1785,"dataGaLocation":1610,"dataGaName":1786},"https://university.gitlab.com/","learn",{"text":1788,"config":1789},"Product documentation",{"href":1790,"dataGaName":1791,"dataGaLocation":1610},"https://docs.gitlab.com/","product documentation",{"text":1793,"config":1794},"Best practice videos",{"href":1795,"dataGaName":1796,"dataGaLocation":1610},"/getting-started-videos/","best practice videos",{"text":1798,"config":1799},"Integrations",{"href":1800,"dataGaName":1801,"dataGaLocation":1610},"/integrations/","integrations",{"title":1803,"items":1804},"Discover",[1805,1810,1815,1820,1824],{"text":1806,"config":1807},"Customer success stories",{"href":1808,"dataGaName":1809,"dataGaLocation":1610},"/customers/","customer success stories",{"text":1811,"config":1812},"Blog",{"href":1813,"dataGaName":1814,"dataGaLocation":1610},"/blog/","blog",{"text":1816,"config":1817},"Demo Hub",{"href":1818,"dataGaName":1819,"dataGaLocation":1610},"/demo-hub/","demo hub",{"text":1821,"config":1822},"The Source",{"href":1823,"dataGaName":1814,"dataGaLocation":1610},"/the-source/",{"text":1825,"config":1826},"Remote",{"href":1827,"dataGaName":1828,"dataGaLocation":1610},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1830,"items":1831},"Connect",[1832,1837,1842,1847,1852,1857],{"text":1833,"config":1834},"GitLab Services",{"href":1835,"dataGaName":1836,"dataGaLocation":1610},"/services/","services",{"text":1838,"config":1839},"Contribute",{"href":1840,"dataGaName":1841,"dataGaLocation":1610},"https://contributors.gitlab.com","contribute",{"text":1843,"config":1844},"Community",{"href":1845,"dataGaName":1846,"dataGaLocation":1610},"/community/","community",{"text":1848,"config":1849},"Forum",{"href":1850,"dataGaName":1851,"dataGaLocation":1610},"https://forum.gitlab.com/","forum",{"text":1853,"config":1854},"Events",{"href":1855,"dataGaName":1856,"dataGaLocation":1610},"/events/","events",{"text":1858,"config":1859},"Partners",{"href":1860,"dataGaName":1861,"dataGaLocation":1610},"/partners/","partners",{"config":1863,"title":1866,"text":1867,"link":1868},{"background":1864,"textColor":1865},"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":1869,"config":1870},"Read the latest",{"href":1871,"dataGaName":1872,"dataGaLocation":1610},"/whats-new/","whats new",{"text":1874,"config":1875,"menu":1877},"Company",{"dataNavLevelOne":1876},"company",{"type":1661,"columns":1878},[1879],{"items":1880},[1881,1886,1892,1894,1899,1904,1909,1914,1919,1924],{"text":1882,"config":1883},"About",{"href":1884,"dataGaName":1885,"dataGaLocation":1610},"/company/","about",{"text":1887,"config":1888,"footerGa":1891},"Jobs",{"href":1889,"dataGaName":1890,"dataGaLocation":1610},"/jobs/","jobs",{"dataGaName":1890},{"text":1853,"config":1893},{"href":1855,"dataGaName":1856,"dataGaLocation":1610},{"text":1895,"config":1896},"Leadership",{"href":1897,"dataGaName":1898,"dataGaLocation":1610},"/company/team/e-group/","leadership",{"text":1900,"config":1901},"Handbook",{"href":1902,"dataGaName":1903,"dataGaLocation":1610},"https://handbook.gitlab.com/","handbook",{"text":1905,"config":1906},"Investor relations",{"href":1907,"dataGaName":1908,"dataGaLocation":1610},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1910,"config":1911},"Trust Center",{"href":1912,"dataGaName":1913,"dataGaLocation":1610},"/security/","trust center",{"text":1915,"config":1916},"AI Transparency Center",{"href":1917,"dataGaName":1918,"dataGaLocation":1610},"/ai-transparency-center/","ai transparency center",{"text":1920,"config":1921},"Newsletter",{"href":1922,"dataGaName":1923,"dataGaLocation":1610},"/company/contact/#contact-forms","newsletter",{"text":1925,"config":1926},"Press",{"href":1927,"dataGaName":1928,"dataGaLocation":1610},"/press/","press",{"text":1930,"config":1931,"menu":1932},"Contact us",{"dataNavLevelOne":1876},{"type":1661,"columns":1933},[1934],{"items":1935},[1936,1941,1946],{"text":1937,"config":1938},"Talk to sales",{"href":1939,"dataGaName":1940,"dataGaLocation":1610},"/sales/","talk to sales",{"text":1942,"config":1943},"Support portal",{"href":1944,"dataGaName":1945,"dataGaLocation":1610},"https://support.gitlab.com/hc/en-us","support portal",{"text":1947,"config":1948},"Customer portal",{"href":1949,"dataGaName":1950,"dataGaLocation":1610},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1952,"login":1953,"suggestions":1960},"Close",{"text":1954,"link":1955},"To search repositories and projects, login to",{"text":1956,"config":1957},"gitlab.com",{"href":1624,"dataGaName":1958,"dataGaLocation":1959},"search login","search",{"text":1961,"default":1962},"Suggestions",[1963,1965,1969,1971,1975,1979],{"text":1641,"config":1964},{"href":1646,"dataGaName":1641,"dataGaLocation":1959},{"text":1966,"config":1967},"Code Suggestions (AI)",{"href":1968,"dataGaName":1966,"dataGaLocation":1959},"/solutions/code-suggestions/",{"text":1677,"config":1970},{"href":266,"dataGaName":1677,"dataGaLocation":1959},{"text":1972,"config":1973},"GitLab on AWS",{"href":1974,"dataGaName":1972,"dataGaLocation":1959},"/partners/technology-partners/aws/",{"text":1976,"config":1977},"GitLab on Google Cloud",{"href":1978,"dataGaName":1976,"dataGaLocation":1959},"/partners/technology-partners/google-cloud-platform/",{"text":1980,"config":1981},"Why GitLab?",{"href":1654,"dataGaName":1980,"dataGaLocation":1959},{"freeTrial":1983,"mobileIcon":1988,"desktopIcon":1993,"secondaryButton":1996},{"text":1984,"config":1985},"Start free trial",{"href":1986,"dataGaName":1615,"dataGaLocation":1987},"https://gitlab.com/-/trials/new/","nav",{"altText":1989,"config":1990},"Gitlab Icon",{"src":1991,"dataGaName":1992,"dataGaLocation":1987},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1989,"config":1994},{"src":1995,"dataGaName":1992,"dataGaLocation":1987},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1997,"config":1998},"Get Started",{"href":1999,"dataGaName":2000,"dataGaLocation":1987},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":2002,"mobileIcon":2006,"desktopIcon":2008},{"text":2003,"config":2004},"Learn more about GitLab Duo",{"href":1646,"dataGaName":2005,"dataGaLocation":1987},"gitlab duo",{"altText":1989,"config":2007},{"src":1991,"dataGaName":1992,"dataGaLocation":1987},{"altText":1989,"config":2009},{"src":1995,"dataGaName":1992,"dataGaLocation":1987},{"button":2011,"mobileIcon":2016,"desktopIcon":2018},{"text":2012,"config":2013},"/switch",{"href":2014,"dataGaName":2015,"dataGaLocation":1987},"#contact","switch",{"altText":1989,"config":2017},{"src":1991,"dataGaName":1992,"dataGaLocation":1987},{"altText":1989,"config":2019},{"src":2020,"dataGaName":1992,"dataGaLocation":1987},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2022,"mobileIcon":2027,"desktopIcon":2029},{"text":2023,"config":2024},"Back to pricing",{"href":450,"dataGaName":2025,"dataGaLocation":1987,"icon":2026},"back to pricing","GoBack",{"altText":1989,"config":2028},{"src":1991,"dataGaName":1992,"dataGaLocation":1987},{"altText":1989,"config":2030},{"src":1995,"dataGaName":1992,"dataGaLocation":1987},{"title":2032,"titleMobile":2033,"button":2034,"config":2039},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1652,"config":2035},{"href":2036,"dataGaName":2037,"dataGaLocation":2038},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":2040,"disabled":1556},"release",{"data":2042},{"text":2043,"source":2044,"edit":2050,"contribute":2055,"config":2060,"items":2064,"minimal":2273},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":2045,"config":2046},"View page source",{"href":2047,"dataGaName":2048,"dataGaLocation":2049},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2051,"config":2052},"Edit this page",{"href":2053,"dataGaName":2054,"dataGaLocation":2049},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2056,"config":2057},"Please contribute",{"href":2058,"dataGaName":2059,"dataGaLocation":2049},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1486,"facebook":2061,"youtube":2062,"linkedin":2063},"https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2065,2112,2166,2210,2241],{"title":1756,"links":2066,"subMenu":2081},[2067,2071,2076],{"text":2068,"config":2069},"View plans",{"href":450,"dataGaName":2070,"dataGaLocation":2049},"view plans",{"text":2072,"config":2073},"Why Premium?",{"href":2074,"dataGaName":2075,"dataGaLocation":2049},"/pricing/premium/","why premium",{"text":2077,"config":2078},"Why Ultimate?",{"href":2079,"dataGaName":2080,"dataGaLocation":2049},"/pricing/ultimate/","why ultimate",[2082],{"title":2083,"links":2084},"Contact Us",[2085,2088,2090,2092,2097,2102,2107],{"text":2086,"config":2087},"Contact sales",{"href":1939,"dataGaName":1620,"dataGaLocation":2049},{"text":1942,"config":2089},{"href":1944,"dataGaName":1945,"dataGaLocation":2049},{"text":1947,"config":2091},{"href":1949,"dataGaName":1950,"dataGaLocation":2049},{"text":2093,"config":2094},"Status",{"href":2095,"dataGaName":2096,"dataGaLocation":2049},"https://status.gitlab.com/","status",{"text":2098,"config":2099},"Terms of use",{"href":2100,"dataGaName":2101,"dataGaLocation":2049},"/terms/","terms of use",{"text":2103,"config":2104},"Privacy statement",{"href":2105,"dataGaName":2106,"dataGaLocation":2049},"/privacy/","privacy statement",{"text":2108,"config":2109},"Cookie preferences",{"dataGaName":2110,"dataGaLocation":2049,"id":2111,"isOneTrustButton":709},"cookie preferences","ot-sdk-btn",{"title":1657,"links":2113,"subMenu":2122},[2114,2118],{"text":2115,"config":2116},"DevSecOps platform",{"href":1639,"dataGaName":2117,"dataGaLocation":2049},"devsecops platform",{"text":2119,"config":2120},"AI-Assisted Development",{"href":1646,"dataGaName":2121,"dataGaLocation":2049},"ai-assisted development",[2123],{"title":2124,"links":2125},"Topics",[2126,2131,2136,2141,2146,2151,2156,2161],{"text":2127,"config":2128},"CICD",{"href":2129,"dataGaName":2130,"dataGaLocation":2049},"/topics/ci-cd/","cicd",{"text":2132,"config":2133},"GitOps",{"href":2134,"dataGaName":2135,"dataGaLocation":2049},"/topics/gitops/","gitops",{"text":2137,"config":2138},"DevOps",{"href":2139,"dataGaName":2140,"dataGaLocation":2049},"/topics/devops/","devops",{"text":2142,"config":2143},"Version Control",{"href":2144,"dataGaName":2145,"dataGaLocation":2049},"/topics/version-control/","version control",{"text":2147,"config":2148},"DevSecOps",{"href":2149,"dataGaName":2150,"dataGaLocation":2049},"/topics/devsecops/","devsecops",{"text":2152,"config":2153},"Cloud Native",{"href":2154,"dataGaName":2155,"dataGaLocation":2049},"/topics/cloud-native/","cloud native",{"text":2157,"config":2158},"AI for Coding",{"href":2159,"dataGaName":2160,"dataGaLocation":2049},"/topics/devops/ai-for-coding/","ai for coding",{"text":2162,"config":2163},"Agentic AI",{"href":2164,"dataGaName":2165,"dataGaLocation":2049},"/topics/agentic-ai/","agentic ai",{"title":2167,"links":2168},"Solutions",[2169,2171,2173,2178,2182,2185,2189,2192,2194,2197,2200,2205],{"text":1700,"config":2170},{"href":1695,"dataGaName":1700,"dataGaLocation":2049},{"text":1689,"config":2172},{"href":1673,"dataGaName":1674,"dataGaLocation":2049},{"text":2174,"config":2175},"Agile development",{"href":2176,"dataGaName":2177,"dataGaLocation":2049},"/solutions/agile-delivery/","agile delivery",{"text":2179,"config":2180},"SCM",{"href":1685,"dataGaName":2181,"dataGaLocation":2049},"source code management",{"text":2127,"config":2183},{"href":266,"dataGaName":2184,"dataGaLocation":2049},"continuous integration & delivery",{"text":2186,"config":2187},"Value stream management",{"href":1728,"dataGaName":2188,"dataGaLocation":2049},"value stream management",{"text":2132,"config":2190},{"href":2191,"dataGaName":2135,"dataGaLocation":2049},"/solutions/gitops/",{"text":1738,"config":2193},{"href":1741,"dataGaName":1742,"dataGaLocation":2049},{"text":2195,"config":2196},"Small business",{"href":1747,"dataGaName":1748,"dataGaLocation":2049},{"text":2198,"config":2199},"Public sector",{"href":1753,"dataGaName":1754,"dataGaLocation":2049},{"text":2201,"config":2202},"Education",{"href":2203,"dataGaName":2204,"dataGaLocation":2049},"/solutions/education/","education",{"text":2206,"config":2207},"Financial services",{"href":2208,"dataGaName":2209,"dataGaLocation":2049},"/solutions/finance/","financial services",{"title":1760,"links":2211},[2212,2214,2216,2218,2220,2222,2225,2227,2229,2231,2233,2235,2237,2239],{"text":1773,"config":2213},{"href":1775,"dataGaName":1776,"dataGaLocation":2049},{"text":1778,"config":2215},{"href":1780,"dataGaName":1781,"dataGaLocation":2049},{"text":1783,"config":2217},{"href":1785,"dataGaName":1786,"dataGaLocation":2049},{"text":1788,"config":2219},{"href":1790,"dataGaName":176,"dataGaLocation":2049},{"text":1811,"config":2221},{"href":1813,"dataGaName":1814,"dataGaLocation":2049},{"text":2223,"config":2224},"What's new",{"href":1871,"dataGaName":1872,"dataGaLocation":2049},{"text":1806,"config":2226},{"href":1808,"dataGaName":1809,"dataGaLocation":2049},{"text":1825,"config":2228},{"href":1827,"dataGaName":1828,"dataGaLocation":2049},{"text":1833,"config":2230},{"href":1835,"dataGaName":1836,"dataGaLocation":2049},{"text":1838,"config":2232},{"href":1840,"dataGaName":1841,"dataGaLocation":2049},{"text":1843,"config":2234},{"href":1845,"dataGaName":1846,"dataGaLocation":2049},{"text":1848,"config":2236},{"href":1850,"dataGaName":1851,"dataGaLocation":2049},{"text":1853,"config":2238},{"href":1855,"dataGaName":1856,"dataGaLocation":2049},{"text":1858,"config":2240},{"href":1860,"dataGaName":1861,"dataGaLocation":2049},{"title":1874,"links":2242},[2243,2245,2247,2249,2251,2253,2257,2262,2264,2266,2268],{"text":1882,"config":2244},{"href":1884,"dataGaName":1876,"dataGaLocation":2049},{"text":1887,"config":2246},{"href":1889,"dataGaName":1890,"dataGaLocation":2049},{"text":1895,"config":2248},{"href":1897,"dataGaName":1898,"dataGaLocation":2049},{"text":1900,"config":2250},{"href":1902,"dataGaName":1903,"dataGaLocation":2049},{"text":1905,"config":2252},{"href":1907,"dataGaName":1908,"dataGaLocation":2049},{"text":2254,"config":2255},"Sustainability",{"href":2256,"dataGaName":2254,"dataGaLocation":2049},"/sustainability/",{"text":2258,"config":2259},"Diversity, inclusion and belonging (DIB)",{"href":2260,"dataGaName":2261,"dataGaLocation":2049},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1910,"config":2263},{"href":1912,"dataGaName":1913,"dataGaLocation":2049},{"text":1920,"config":2265},{"href":1922,"dataGaName":1923,"dataGaLocation":2049},{"text":1925,"config":2267},{"href":1927,"dataGaName":1928,"dataGaLocation":2049},{"text":2269,"config":2270},"Modern Slavery Transparency Statement",{"href":2271,"dataGaName":2272,"dataGaLocation":2049},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2274},[2275,2278,2281],{"text":2276,"config":2277},"Terms",{"href":2100,"dataGaName":2101,"dataGaLocation":2049},{"text":2279,"config":2280},"Cookies",{"dataGaName":2110,"dataGaLocation":2049,"id":2111,"isOneTrustButton":709},{"text":429,"config":2282},{"href":2105,"dataGaName":2106,"dataGaLocation":2049},[2284],{"id":2285,"title":7,"body":1555,"config":2286,"content":2288,"description":1555,"extension":2292,"meta":2293,"navigation":709,"path":2294,"seo":2295,"stem":2296,"__hash__":2297},"blogAuthors/en-us/blog/authors/marcia-ramos.yml",{"template":2287},"BlogAuthor",{"name":7,"config":2289},{"headshot":2290,"ctfId":2291},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Marcia-Ramos","yml",{},"/en-us/blog/authors/marcia-ramos",{},"en-us/blog/authors/marcia-ramos","UrFu-iLS1mEkxVCheaz27cAjfZXeLI9U1n5dGSOHXY4",[2299,2308,2316],{"title":2300,"description":2301,"heroImage":2302,"category":1551,"date":2303,"authors":2304,"slug":2307,"externalUrl":1555},"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",[2305,2306],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":2309,"description":2310,"heroImage":2311,"category":1551,"date":2312,"authors":2313,"slug":2315,"externalUrl":1555},"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",[2314],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2317,"description":2318,"heroImage":2319,"category":1551,"date":2320,"authors":2321,"slug":2323,"externalUrl":1555},"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",[2322],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":2325},[2326,2340,2352,2364],{"id":2327,"categories":2328,"header":2330,"text":2331,"button":2332,"image":2337},"ai-modernization",[2329],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":2333,"config":2334},"Get your AI maturity score",{"href":2335,"dataGaName":2336,"dataGaLocation":1814},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":2338},{"src":2339},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2341,"categories":2342,"header":2344,"text":2331,"button":2345,"image":2349},"devops-modernization",[2343,2150],"product","Are you just managing tools or shipping innovation?",{"text":2346,"config":2347},"Get your DevOps maturity score",{"href":2348,"dataGaName":2336,"dataGaLocation":1814},"/assessments/devops-modernization-assessment/",{"config":2350},{"src":2351},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2353,"categories":2354,"header":2356,"text":2331,"button":2357,"image":2361},"security-modernization",[2355],"security","Are you trading speed for security?",{"text":2358,"config":2359},"Get your security maturity score",{"href":2360,"dataGaName":2336,"dataGaLocation":1814},"/assessments/security-modernization-assessment/",{"config":2362},{"src":2363},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2365,"paths":2366,"header":2369,"text":2370,"button":2371,"image":2376},"github-azure-migration",[2367,2368],"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":2372,"config":2373},"See how GitLab compares to GitHub",{"href":2374,"dataGaName":2375,"dataGaLocation":1814},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2377},{"src":2351},{"header":2379,"blurb":2380,"button":2381,"secondaryButton":2386},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2382,"config":2383},"Get your free trial",{"href":2384,"dataGaName":1615,"dataGaLocation":2385},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":2086,"config":2387},{"href":1939,"dataGaName":1620,"dataGaLocation":2385},1786803750895]