Variables, Rules y Environments
Variables, Rules y Environments
Variables
Variables predefinidas
GitLab inyecta automaticamente variables en cada job:
| Variable | Descripcion |
|---|---|
CI_COMMIT_SHA | Hash completo del commit |
CI_COMMIT_REF_NAME | Nombre de la rama o tag |
CI_COMMIT_REF_SLUG | Rama slugificada (safe para URLs) |
CI_PIPELINE_ID | ID unico del pipeline |
CI_JOB_ID | ID unico del job |
CI_PROJECT_DIR | Directorio del proyecto clonado |
CI_MERGE_REQUEST_IID | IID del Merge Request (si aplica) |
CI_REGISTRY_IMAGE | URL de la imagen en Container Registry |
Variables en .gitlab-ci.yml
variables:
NODE_ENV: production
API_URL: "https://api.example.com"
test:
variables:
NODE_ENV: test # Sobreescribe a nivel de job
script:
- echo $NODE_ENV # test
Variables en Settings (secretas)
Settings > CI/CD > Variables:
deploy:
script:
- echo $DEPLOY_KEY # Definida en Settings, no en el repo
Opciones al crear:
- Type: Variable o File (crea archivo temporal)
- Protected: Solo ramas/tags protegidos
- Masked: Oculta en logs (requiere formato especifico)
- Environment scope: Solo para un environment especifico
Rules
rules reemplaza a only/except (deprecated). Controla cuando se ejecuta un job.
Sintaxis basica
deploy:
script:
- ./deploy.sh
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: on_success
- if: $CI_COMMIT_TAG
when: manual
- when: never # Default: no ejecutar
Rules con cambios en archivos
test_frontend:
script:
- npm test
rules:
- changes:
- "frontend/**/*"
- "package.json"
test_backend:
script:
- python -m pytest
rules:
- changes:
- "backend/**/*"
- "requirements.txt"
Merge Request pipelines
test:
script:
- npm test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
Combinar condiciones
deploy_staging:
rules:
- if: $CI_COMMIT_BRANCH == "develop"
changes:
- "src/**/*"
when: on_success
Ambas condiciones deben cumplirse (AND logico).
workflow:rules
Controla si el pipeline completo se crea:
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_TAG
Environments
Representan donde se despliega tu aplicacion.
deploy_staging:
stage: deploy
script:
- ./deploy.sh staging
environment:
name: staging
url: https://staging.example.com
rules:
- if: $CI_COMMIT_BRANCH == "develop"
deploy_production:
stage: deploy
script:
- ./deploy.sh production
environment:
name: production
url: https://example.com
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
Environments dinamicos
deploy_review:
script:
- ./deploy.sh review
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_COMMIT_REF_SLUG.review.example.com
on_stop: stop_review
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
stop_review:
script:
- ./teardown.sh review
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
Esto crea un environment por cada MR que se destruye automaticamente al mergear.
Siguiente: Capitulo 9: Pipelines Multi-proyecto y Parent-Child →