Cache y Artifacts

Por: Artiko
gitlabrunnerscacheartifactsoptimizacion

Cache y Artifacts

Dos mecanismos para compartir archivos entre jobs, con propositos diferentes.

Diferencias clave

CaracteristicaCacheArtifacts
PropositoAcelerar jobs (dependencias)Pasar resultados entre stages
GarantiaBest-effort (puede no existir)Garantizado (se sube a GitLab)
AlmacenamientoLocal al runner o S3GitLab server
DisponibilidadMismo runner (o S3 compartido)Cualquier job del pipeline
ExpiracionConfigurableConfigurable

Cache

Ideal para dependencias que no cambian entre ejecuciones: node_modules, .pip, .m2.

Configuracion basica

test:
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules/
  script:
    - npm ci
    - npm test

Cache key strategies

# Por rama
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

# Por lockfile (mas preciso)
cache:
  key:
    files:
      - package-lock.json
  paths:
    - node_modules/

# Por rama + lockfile
cache:
  key:
    prefix: ${CI_COMMIT_REF_SLUG}
    files:
      - package-lock.json
  paths:
    - node_modules/

Cache policy

install:
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull-push  # Default: descarga y sube
  script:
    - npm ci

test:
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull  # Solo descarga, no sube
  script:
    - npm test

Limpiar cache

Desde la UI: CI/CD > Pipelines > Clear Runner Caches

Artifacts

Archivos generados por un job que se almacenan en GitLab y estan disponibles para otros jobs.

Configuracion basica

build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week

deploy:
  stage: deploy
  script:
    - ./deploy.sh dist/
  # Automaticamente recibe artifacts del stage anterior

Artifacts con reports

GitLab puede interpretar ciertos formatos de artifacts:

test:
  script:
    - npm run test:ci
  artifacts:
    reports:
      junit: junit-report.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

Esto muestra resultados de tests y cobertura directamente en los Merge Requests.

Artifacts condicionales

test:
  script:
    - npm test
  artifacts:
    paths:
      - coverage/
    when: always  # Subir aunque el job falle
    expire_in: 3 days

Valores de when: on_success (default), on_failure, always.

Patron optimizado completo

stages:
  - install
  - test
  - build

install:
  stage: install
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull-push
  script:
    - npm ci
  artifacts:
    paths:
      - node_modules/
    expire_in: 1 hour

test:
  stage: test
  dependencies:
    - install
  script:
    - npm test

build:
  stage: build
  dependencies:
    - install
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week

Siguiente: Capitulo 7: Estructura de .gitlab-ci.yml →