README.md 16.8 KB
Newer Older
Kamil Trzcinski's avatar
Kamil Trzcinski committed
1 2
# GitLab Pages

3 4 5
> **Note:**
> This feature was [introduced][ee-80] in GitLab EE 8.3.
> Custom CNAMEs with TLS support were [introduced][ee-173] in GitLab EE 8.5.
Kamil Trzcinski's avatar
Kamil Trzcinski committed
6

7 8 9 10
> **Note:**
> This document is about the user guide. To learn how to enable GitLab Pages
> across your GitLab instance, visit the [administrator documentation](administration.md).

11
With GitLab Pages you can host for free your static websites on GitLab.
12
Combined with the power of [GitLab CI] and the help of [GitLab Runner] you can
13
deploy static pages for your individual projects, your user or your group.
14

15 16 17 18 19 20
---

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*

Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
21
- [Getting started with GitLab Pages](#getting-started-with-gitlab-pages)
22
    - [GitLab Pages requirements](#gitlab-pages-requirements)
23 24
    - [User or group Pages](#user-or-group-pages)
    - [Project Pages](#project-pages)
25
    - [Explore the contents of `.gitlab-ci.yml`](#explore-the-contents-of-gitlab-ciyml)
26
        - [How `.gitlab-ci.yml` looks like when the static content is in your repository](#how-gitlab-ciyml-looks-like-when-the-static-content-is-in-your-repository)
27
        - [How `.gitlab-ci.yml` looks like when using a static generator](#how-gitlab-ciyml-looks-like-when-using-a-static-generator)
28
        - [How to set up GitLab Pages in a repository where there's also actual code](#how-to-set-up-gitlab-pages-in-a-repository-where-there-s-also-actual-code)
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
29
- [Next steps](#next-steps)
30
    - [Example projects](#example-projects)
31 32
    - [Add a custom domain to your Pages website](#add-a-custom-domain-to-your-pages-website)
    - [Secure your custom domain website with TLS](#secure-your-custom-domain-website-with-tls)
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
33
    - [Custom error codes pages](#custom-error-codes-pages)
34
    - [Remove the contents of your pages](#remove-the-contents-of-your-pages)
35 36
- [Limitations](#limitations)
- [Frequently Asked Questions](#frequently-asked-questions)
37 38 39
    - [Can I download my generated pages?](#can-i-download-my-generated-pages)
    - [Can I use GitLab Pages if my project is private?](#can-i-use-gitlab-pages-if-my-project-is-private)
    - [Q: Do I have to create a project named `username.example.io` in order to host a project website?](#q-do-i-have-to-create-a-project-named-username-example-io-in-order-to-host-a-project-website)
40 41 42

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
43
## Getting started with GitLab Pages
44

45 46
> **Note:**
> In the rest of this document we will assume that the general domain name that
47 48
> is used for GitLab Pages is `example.io`. If you are using GitLab.com to
> host your website, replace `example.io` with `gitlab.io`.
49

50
In general there are two types of pages one might create:
51

52 53
- Pages per user (`username.example.io`) or per group (`groupname.example.io`)
- Pages per project (`username.example.io/projectname` or `groupname.example.io/projectname`)
54

55
In GitLab, usernames and groupnames are unique and we often refer to them
56 57 58 59
as namespaces. There can be only one namespace in a GitLab instance. Below you
can see the connection between the type of GitLab Pages, what the project name
that is created on GitLab looks like and the website URL it will be ultimately
be served on.
60

61
| Type of GitLab Pages | The name of the project created in GitLab | Website URL |
62
| -------------------- | ------------ | ----------- |
63 64 65 66
| User pages  | `username.example.io`  | `http(s)://username.example.io`  |
| Group pages | `groupname.example.io` | `http(s)://groupname.example.io` |
| Project pages owned by a user  | `projectname` | `http(s)://username.example.io/projectname` |
| Project pages owned by a group | `projectname` | `http(s)://groupname.example.io/projectname`|
67

68 69 70 71
> **Warning:**
> There are some known [limitations](#limitations) regarding namespaces served
> under the general domain name and HTTPS. Make sure to read that section.

72 73 74 75 76 77 78 79
### GitLab Pages requirements

In brief, this is what you need to upload your website in GitLab Pages:

1. Find out the general domain name that is used for GitLab Pages
   (ask your administrator). This is very important, so you should first make
   sure you get that right.
1. Create a project
80 81 82
1. Push a [`.gitlab-ci.yml` file](../ci/yaml/README.md) in the root directory
   of your repository with a specific job named [`pages`][pages].
1. Set up a GitLab Runner to build your website
83

84 85 86
> **Note:**
> If [shared runners](../ci/runners/README.md) are enabled by your GitLab
> administrator, you should be able to use them instead of bringing your own.
87

88
### User or group Pages
89

90 91
For user and group pages, the name of the project should be specific to the
username or groupname and the general domain name that is used for GitLab Pages.
92 93
Head over your GitLab instance that supports GitLab Pages and create a
repository named `username.example.io`, where `username` is your username on
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
94
GitLab. If the first part of the project name doesn't match exactly your
95 96
username, it won’t work, so make sure to get it right.

97
To create a group page, the steps are the same like when creating a website for
98 99 100
users. Just make sure that you are creating the project within the group's
namespace.

101 102 103 104
![Create a user-based pages project](img/pages_create_user_page.png)

---

105 106 107
After you push some static content to your repository and GitLab Runner uploads
the artifacts to GitLab CI, you will be able to access your website under
`http(s)://username.example.io`. Keep reading to find out how.
108

109 110 111 112
>**Note:**
If your username/groupname contains a dot, for example `foo.bar`, you will not
be able to use the wildcard domain HTTPS, read more at [limitations](#limitations).

113
### Project Pages
114

115 116 117 118 119 120 121 122 123 124
GitLab Pages for projects can be created by both user and group accounts.
The steps to create a project page for a user or a group are identical:

1. Create a new project
1. Push a [`.gitlab-ci.yml` file](../ci/yaml/README.md) in the root directory
   of your repository with a specific job named [`pages`][pages].
1. Set up a GitLab Runner to build your website

A user's project will be served under `http(s)://username.example.io/projectname`
whereas a group's project under `http(s)://groupname.example.io/projectname`.
125

126
### Explore the contents of `.gitlab-ci.yml`
127

128 129 130
The key thing about GitLab Pages is the `.gitlab-ci.yml` file, something that
gives you absolute control over the build process. You can actually watch your
website being built live by following the CI build traces.
131

132 133 134 135
> **Note:**
> Before reading this section, make sure you familiarize yourself with GitLab CI
> and the specific syntax of[`.gitlab-ci.yml`](../ci/yaml/README.md) by
> following our [quick start guide](../ci/quick_start/README.md).
136

137 138
To make use of GitLab Pages, the contents of `.gitlab-ci.yml` must follow the
rules below:
139

140 141 142
1. A special job named [`pages`][pages] must be defined
1. Any static content which will be served by GitLab Pages must be placed under
   a `public/` directory
143 144
1. `artifacts` with a path to the `public/` directory must be defined

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
In its simplest form, `.gitlab-ci.yml` looks like:

```yaml
pages:
  script:
  - my_commands
  artifacts:
    paths:
    - public
```

When the Runner reaches to build the `pages` job, it executes whatever is
defined in the `script` parameter and if the build completes with a non-zero
exit status, it then uploads the `public/` directory to GitLab Pages.

The `public/` directory should contain all the static content of your website.
Depending on how you plan to publish your website, the steps defined in the
[`script` parameter](../ci/yaml/README.md#script) may differ.

164
Be aware that Pages are by default branch/tag agnostic and their deployment
165
relies solely on what you specify in `.gitlab-ci.yml`. If you don't limit the
166 167
`pages` job with the [`only` parameter](../ci/yaml/README.md#only-and-except),
whenever a new commit is pushed to whatever branch or tag, the Pages will be
168 169
overwritten. In the example below, we limit the Pages to be deployed whenever
a commit is pushed only on the `master` branch:
Kamil Trzcinski's avatar
Kamil Trzcinski committed
170

171 172
```yaml
pages:
173
  script:
174
  - my_commands
175 176 177
  artifacts:
    paths:
    - public
178 179
  only:
  - master
180 181
```

182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
We then tell the Runner to treat the `public/` directory as `artifacts` and
upload it to GitLab. And since all these parameters were all under a `pages`
job, the contents of the `public` directory will be served by GitLab Pages.

#### How `.gitlab-ci.yml` looks like when the static content is in your repository

Supposedly your repository contained the following files:

```
├── index.html
├── css
│   └── main.css
└── js
    └── main.js
```

Then the `.gitlab-ci.yml` example below simply moves all files from the root
directory of the project to the `public/` directory. The `.public` workaround
is so `cp` doesn't also copy `public/` to itself in an infinite loop:
201 202 203 204 205 206 207 208 209 210 211 212 213 214

```yaml
pages:
  script:
  - mkdir .public
  - cp -r * .public
  - mv .public public
  artifacts:
    paths:
    - public
  only:
  - master
```

215
#### How `.gitlab-ci.yml` looks like when using a static generator
216

217 218
In general, GitLab Pages support any kind of [static site generator][staticgen],
since the Runner can be configured to run any possible command.
219

220 221 222 223 224 225 226
In the root directory of your Git repository, place the source files of your
favorite static generator. Then provide a `.gitlab-ci.yml` file which is
specific to your static generator.

The example below, uses [Jekyll] to build the static site:

```yaml
227 228 229
image: ruby:2.1             # the script will run in Ruby 2.1 using the Docker image ruby:2.1

pages:                      # the build job must be named pages
230
  script:
231 232
  - gem install jekyll      # we install jekyll
  - jekyll build -d public/ # we tell jekyll to build the site for us
233 234
  artifacts:
    paths:
235
    - public                # this is where the site will live and the Runner uploads it in GitLab
236
  only:
237
  - master                  # this script is only affecting the master branch
238 239 240 241 242 243 244 245
```

Here, we used the Docker executor and in the first line we specified the base
image against which our builds will run.

You have to make sure that the generated static files are ultimately placed
under the `public` directory, that's why in the `script` section we run the
`jekyll` command that builds the website and puts all content in the `public/`
246 247 248 249 250
directory. Depending on the static generator of your choice, this command will
differ. Search in the documentation of the static generator you will use if
there is an option to explicitly set the output directory. If there is not
such an option, you can always add one more line under `script` to rename the
resulting directory in `public/`.
251 252 253 254 255 256 257 258 259

We then tell the Runner to treat the `public/` directory as `artifacts` and
upload it to GitLab.

---

See the [jekyll example project][pages-jekyll] to better understand how this
works.

260 261
For a list of Pages projects, see the [example projects](#example-projects) to
get you started.
262 263 264

#### How to set up GitLab Pages in a repository where there's also actual code

265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
Remember that GitLab Pages are by default branch/tag agnostic and their
deployment relies solely on what you specify in `.gitlab-ci.yml`. You can limit
the `pages` job with the [`only` parameter](../ci/yaml/README.md#only-and-except),
whenever a new commit is pushed to a branch that will be used specifically for
your pages.

That way, you can have your project's code in the `master` branch and use an
orphan branch (let's name it `pages`) that will host your static generator site.

You can create a new empty branch like this:

```bash
git checkout --orphan pages
```

The first commit made on this new branch will have no parents and it will be
the root of a new history totally disconnected from all the other branches and
commits. Push the source files of your static generator in the `pages` branch.

Below is a copy of `.gitlab-ci.yml` where the most significant line is the last
one, specifying to execute everything in the `pages` branch:

```
288 289
image: ruby:2.1

290 291
pages:
  script:
292
  - gem install jekyll
293 294 295 296 297 298 299 300 301 302 303 304 305 306
  - jekyll build -d public/
  artifacts:
    paths:
    - public
  only:
  - pages
```

See an example that has different files in the [`master` branch][jekyll-master]
and the source files for Jekyll are in a [`pages` branch][jekyll-pages] which
also includes `.gitlab-ci.yml`.

[jekyll-master]: https://gitlab.com/gitlab-examples/pages-jekyll-branched/tree/master
[jekyll-pages]: https://gitlab.com/gitlab-examples/pages-jekyll-branched/tree/pages
307

Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
308 309
## Next steps

310 311 312
So you have successfully deployed your website, congratulations! Let's check
what more you can do with GitLab Pages.

313 314 315 316 317 318 319 320 321 322 323 324 325 326
### Example projects

Below is a list of example projects for GitLab Pages with a plain HTML website
or various static site generators. Contributions are very welcome.

- [Plain HTML](https://gitlab.com/gitlab-examples/pages-plain-html)
- [Jekyll](https://gitlab.com/gitlab-examples/pages-jekyll)
- [Hugo](https://gitlab.com/gitlab-examples/pages-hugo)
- [Middleman](https://gitlab.com/gitlab-examples/pages-middleman)
- [Hexo](https://gitlab.com/gitlab-examples/pages-hexo)
- [Brunch](https://gitlab.com/gitlab-examples/pages-brunch)
- [Metalsmith](https://gitlab.com/gitlab-examples/pages-metalsmith)
- [Harp](https://gitlab.com/gitlab-examples/pages-harp)

327 328 329
Visit the gitlab-examples group for a full list of projects:
<https://gitlab.com/groups/gitlab-examples>.

330
### Add a custom domain to your Pages website
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
331

332 333
If this setting is enabled by your GitLab administrator, you should be able to
see the **New Domain** button when visiting your project's **Settings > Pages**.
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
334

335
![New domain button](img/pages_new_domain_button.png)
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
336

337 338
---

339 340 341 342 343 344 345 346 347 348 349 350
You can add multiple domains pointing to your website hosted under GitLab.
Once the domain is added, you can see it listed under the **Domains** section.

![Pages multiple domains](img/pages_multiple_domains.png)

---

As a last step, you need to configure your DNS and add a CNAME pointing to your
user/group page. Click on the **Details** button of a domain for further
instructions.

![Pages DNS details](img/pages_dns_details.png)
351 352 353

### Secure your custom domain website with TLS

354 355 356 357 358 359
When you add a new custom domain, you also have the chance to add a TLS
certificate. If this setting is enabled by your GitLab administrator, you
should be able to see the option to upload the public certificate and the
private key when adding a new domain.

![Pages upload cert](img/pages_upload_cert.png)
360

Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
361
### Custom error codes pages
362

363
You can provide your own 403 and 404 error pages by creating the `403.html` and
364
`404.html` files respectively in the root directory of the `public/` directory
365 366 367
that will be included in the artifacts. Usually this is the root directory of
your project, but that may differ depending on your static generator
configuration.
368 369 370 371 372 373 374 375 376 377

If the case of `404.html`, there are different scenarios. For example:

- If you use project Pages (served under `/projectname/`) and try to access
  `/projectname/non/exsiting_file`, GitLab Pages will try to serve first
  `/projectname/404.html`, and then `/404.html`.
- If you use user/group Pages (served under `/`) and try to access
  `/non/existing_file` GitLab Pages will try to serve `/404.html`.
- If you use a custom domain and try to access `/non/existing_file`, GitLab
  Pages will try to server only `/404.html`.
378

379 380 381 382 383 384 385
### Remove the contents of your pages

If you ever feel the need to purge your Pages content, you can do so by going
to your project's **Settings > Pages** and hit **Remove pages**. Simple as that.

![Remove pages](img/pages_remove.png)

386 387 388 389 390 391 392 393 394 395 396
## Limitations

When using Pages under the general domain of a GitLab instance (`*.example.io`),
you _cannot_ use HTTPS with sub-subdomains. That means that if your
username/groupname contains a dot, for example `foo.bar`, the domain
`https://foo.bar.example.io` will _not_ work. This is a limitation of the
[HTTP Over TLS protocol][rfc]. HTTP pages will continue to work provided you
don't redirect HTTP to HTTPS.

[rfc]: https://tools.ietf.org/html/rfc2818#section-3.1 "HTTP Over TLS RFC"

397 398
## Frequently Asked Questions

399
### Can I download my generated pages?
400

401
Sure. All you need to do is download the artifacts archive from the build page.
402

403
### Can I use GitLab Pages if my project is private?
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
404

405
Yes. GitLab Pages don't care whether you set your project's visibility level
Achilleas Pipinellis's avatar
Achilleas Pipinellis committed
406 407
to private, internal or public.

408 409 410 411 412 413
### Q: Do I have to create a project named `username.example.io` in order to host a project website?

No. You can create a new project named `foo` and have it served under
`http(s)://username.example.io/foo` without having previously created a
user page.

414
---
415 416

[jekyll]: http://jekyllrb.com/
417
[ee-80]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/80
418 419
[ee-173]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/173
[pages-daemon]: https://gitlab.com/gitlab-org/gitlab-pages
420 421
[gitlab ci]: https://about.gitlab.com/gitlab-ci
[gitlab runner]: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner
422
[pages]: ../ci/yaml/README.md#pages
423
[staticgen]: https://www.staticgen.com/
424
[pages-jekyll]: https://gitlab.com/gitlab-examples/pages-jekyll