Deploy no GitLab Pages
Export estático do Next.js e pipeline de CI/CD para publicar a documentação no GitLab Pages.
O GitLab Pages serve arquivos estáticos a partir de um diretório chamado
public, gerado por um job de CI com nome pages. O trabalho, então, é fazer o
Next.js gerar HTML estático e entregar esse HTML no lugar certo.
1. Export estático do Next.js
import { createMDX } from 'fumadocs-mdx/next';
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export',
// Gera `/rota/index.html` para que o host estático sirva links diretos após um refresh.
trailingSlash: true,
};
export default withMDX(nextConfig);output: 'export'faznext buildescrever o site pronto na pastaout/.trailingSlash: truegerarota/index.htmlem vez derota.html. Sem isso, atualizar a página em uma URL profunda dá 404 no GitLab Pages.
O que não sobrevive ao export
No modo estático não existe servidor: rotas dinâmicas, revalidate com tempo,
middleware e otimização de imagem sob demanda ficam de fora. Por isso a busca
deste projeto é estática (staticGET em app/api/search/route.ts) e o
proxy.ts só funciona em desenvolvimento.
2. O pipeline
stages:
- build
- deploy
build:
stage: build
image: oven/bun
script:
- bun install
- bun run build
artifacts:
paths:
- out
pages:
stage: deploy
script:
- echo "Deploying to GitLab Pages..."
- mv out public
artifacts:
paths:
- public
expire_in: 30 daysComo isso funciona:
- O job
buildroda na imagemoven/bun, instala as dependências e geraout/. artifacts: paths: [out]guarda o resultado — sem isso, o próximo estágio começaria com o diretório vazio.- O job precisa se chamar
pages: é esse nome que o GitLab reconhece como publicação. mv out publicrenomeia o diretório para o único nome que o Pages serve.- O artefato
publicé o que vai para o ar.
Nome do job e nome da pasta
Os dois são convenções fixas do GitLab: job pages, pasta public. Errar um
dos dois faz o pipeline passar em verde sem publicar nada.
3. Publicando
git add .
git commit -m "docs: nova página"
git pushAcompanhe em Build → Pipelines e, quando terminar, a URL aparece em Deploy → Pages.
Ajustes que costumam aparecer
O site sobe sem CSS ou com links quebrados
Acontece quando o projeto é servido em um subcaminho, como
https://<grupo>.gitlab.io/<projeto>/. Nesse caso o Next.js precisa saber o
prefixo:
const nextConfig = {
output: 'export',
trailingSlash: true,
basePath: '/fumadocs-gitlab-pages',
};Se o projeto usa o domínio único do GitLab Pages (uma URL própria do tipo
https://<projeto>-<hash>.gitlab.io/, hoje o padrão) ou um domínio
personalizado, o site fica na raiz e basePath não é necessário.
Publicar só a partir da branch principal
Por padrão o pipeline roda em qualquer branch. Para publicar apenas o que entra
na main:
pages:
stage: deploy
script:
- mv out public
artifacts:
paths:
- public
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCHO build demora a cada push
Vale guardar o cache das dependências entre execuções:
build:
stage: build
image: oven/bun
cache:
key:
files:
- bun.lock
paths:
- node_modules
script:
- bun install
- bun run build
artifacts:
paths:
- out