Variables, Rules y Environments

Por: Artiko
gitlabci-cdvariablesrulesenvironments

Variables, Rules y Environments

Variables

Variables predefinidas

GitLab inyecta automaticamente variables en cada job:

VariableDescripcion
CI_COMMIT_SHAHash completo del commit
CI_COMMIT_REF_NAMENombre de la rama o tag
CI_COMMIT_REF_SLUGRama slugificada (safe para URLs)
CI_PIPELINE_IDID unico del pipeline
CI_JOB_IDID unico del job
CI_PROJECT_DIRDirectorio del proyecto clonado
CI_MERGE_REQUEST_IIDIID del Merge Request (si aplica)
CI_REGISTRY_IMAGEURL 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:

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 →