Este guia explica o pipeline do GitLab: lint → test → build → release → image_create → create-pages. Também lista as variáveis necessárias e como acionar cada etapa.
cache:
paths:
- node_modules
stages:
- lint
- test
- build
- release
- image_create
- create-pages
lint-job:
image: $CI_REGISTRY/ademir/node-custom:latest
stage: lint
script:
- ln -s /ci-modules/backend_node_modules backend/node_modules
- cd backend
- pnpm lint
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
test-job:
image: $CI_REGISTRY/ademir/node-custom:latest
stage: test
script:
- ln -s /ci-modules/backend_node_modules backend/node_modules
- cd backend
- pnpm exec tsc && pnpm exec jest --ci --forceExit --detectOpenHandles --runInBand --silent --verbose=false
variables:
NODE_ENV: testing
DB_SGBD: ${DB_SGBD}
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
DB_HOST: ${DB_HOST}
DB_PORT: ${DB_PORT}
DB_NAME: ${DB_NAME}
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
build-job:
image: $CI_REGISTRY/ademir/node-custom:latest
stage: build
script:
- ln -s /ci-modules/frontend_node_modules frontend/node_modules
- cd frontend
- pnpm run build
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
create_release:
stage: release
image: $CI_REGISTRY/ademir/release-cli
script:
- |
LAST_TAG=$(git tag --sort=-creatordate | sed -n 2p)
if [ -z "$LAST_TAG" ]; then
git log --pretty=format:"%s (%an)" | grep -v "^Merge branch" | sed 's/^/- /' > release_notes.md
else
git log "${LAST_TAG}"..HEAD --pretty=format:"%s (%an)" | grep -v "^Merge branch" | sed 's/^/- /' > release_notes.md
fi
echo "Versão: $CI_COMMIT_TAG" > full_release.md
echo "" >> full_release.md
echo "Mudanças:" >> full_release.md
cat release_notes.md >> full_release.md
release:
tag_name: $CI_COMMIT_TAG
name: "Release $CI_COMMIT_TAG"
description: full_release.md
rules:
- if: '$CI_COMMIT_TAG'
image_create:
stage: image_create
image:
name: $CI_REGISTRY/ademir/buildah
script:
- buildah login -u "$HARBOR_LOGIN" -p "$HARBOR_PASSWORD" "$CI_REGISTRY"
- buildah build --layers --build-arg NEXT_PUBLIC_API_BASE_URL="$NEXT_PUBLIC_API_BASE_URL" --file frontend/Containerfile --tag $CI_REGISTRY/ademir/frontend:$CI_COMMIT_TAG --cache-from=$CI_REGISTRY/ademir/frontend --cache-to=$CI_REGISTRY/ademir/frontend frontend
- buildah push harbor.c3sl.ufpr.br/ademir/frontend:$CI_COMMIT_TAG
- buildah build --layers --file backend/Containerfile --tag harbor.c3sl.ufpr.br/ademir/backend:$CI_COMMIT_TAG --cache-from=$CI_REGISTRY/ademir/backend --cache-to=$CI_REGISTRY/ademir/backend backend
- buildah push harbor.c3sl.ufpr.br/ademir/backend:$CI_COMMIT_TAG
rules:
- if: '$CI_COMMIT_TAG'
# deploy (k8s) — desativado
#deploy:
# stage: deploy
# image: bitnami/kubectl:latest
# script:
# - kubectl --kubeconfig $KUBECONFIG rollout restart deploy ademir -n ademir
# rules:
# - if: '$CI_COMMIT_TAG'
create-pages:
image: hugomods/hugo:ci
variables:
GIT_SUBMODULE_STRATEGY: recursive
before_script:
- cd docs
- npm i -D postcss postcss-cli autoprefixer
script:
- hugo --minify -D -d public
- mv public ..
pages: true
artifacts:
paths:
- public
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
changes:
- docs/**/*
environment: production
Observação: os blocos estão sem linguagem para manter compatibilidade com a diretriz de apenas blocos de código Markdown.
rules: if: $CI_PIPELINE_SOURCE == "merge_request_event"
).rules: if: $CI_COMMIT_TAG
).develop
) quando houver mudanças em docs/
.v1.2.3
) → roda create_release e image_create (gera release e imagens e faz push no registry).docs/
na branch padrão → roda create-pages e publica a documentação.Crie/atualize em Settings → CI/CD → Variables no GitLab:
Backend / Testes
DB_SGBD
DB_USER
DB_PASSWORD
DB_HOST
DB_PORT
DB_NAME
Release / Imagens
HARBOR_LOGIN
— login no registryHARBOR_PASSWORD
— senha/token do registryNEXT_PUBLIC_API_BASE_URL
— base URL injetada no build do frontendCI_REGISTRY
, CI_REGISTRY_USER
, CI_REGISTRY_PASSWORD
se o runner exigir login explícitoOutras
CI_DEFAULT_BRANCH
(já fornecida pelo GitLab)KUBECONFIG
(se reativar o job de deploy)Boas práticas: marque variáveis sensíveis como masked e protected; ligue Protect para usar apenas em branches/tags protegidas.
lint-job
backend/node_modules
apontando para /ci-modules/backend_node_modules
(cache aquecido da imagem).pnpm lint
no diretório backend
.test-job
lint-job
.pnpm exec tsc
) e executa testes com Jest/Supertest.build-job
frontend/node_modules
via symlink.pnpm run build
em frontend
(Next.js + Tailwind + shadcn).create_release
git log
(desde a última tag) e cria um Release associado à tag atual ($CI_COMMIT_TAG
).image_create
buildah login
).NEXT_PUBLIC_API_BASE_URL
por --build-arg
; faz push para harbor.c3sl.ufpr.br/ademir/frontend:$CI_COMMIT_TAG
.harbor.c3sl.ufpr.br/ademir/backend:$CI_COMMIT_TAG
.--layers
, --cache-from/--cache-to
).create-pages
postcss
, postcss-cli
e autoprefixer
para o tema.hugo --minify -D
) e publica artefatos para Pages.v1.2.3
).create_release
e image_create
.docs/
.create-pages
e publica o site (GitLab Pages).pnpm lint
e pnpm exec jest
no diretório correspondente e verifique versões do Node.pnpm install
) e teste pnpm build localmente.image_create
: valide HARBOR_LOGIN
/HARBOR_PASSWORD
e permissão de push no registry. Confirme o nome das imagens e tags.create-pages
não dispara: confirme a branch padrão e se houve mudanças dentro de docs/
.vX.Y.Z
) para releases..env
reais.