GitLab CI - Job Configuration
Configure GitLab CI jobs with proper scripts, environments, and execution settings.
Basic Job Structure
job_name: stage: test image: node:20-alpine before_script: - npm ci script: - npm test after_script: - echo "Cleanup tasks" rules: - if: $CI_COMMIT_BRANCH == "main"
Script Configuration
Multi-Line Scripts
build: script: - echo "Building application..." - npm run build - echo "Build complete"
Script with Exit Codes
test: script: - npm test || exit 1 - npm run lint allow_failure: false
Environment Configuration
deploy:production: stage: deploy script: - ./deploy.sh environment: name: production url: https://example.com on_stop: stop:production rules: - if: $CI_COMMIT_BRANCH == "main" when: manual
stop:production: stage: deploy script: - ./teardown.sh environment: name: production action: stop when: manual
Job Rules
Conditional Execution
job: rules: - if: $CI_COMMIT_BRANCH == "main" when: always - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: on_success - when: never
Changes-Based Rules
test:frontend: rules: - changes: - "src/frontend/**/*" - "package.json"
Exists-Based Rules
docker:build: rules: - exists: - Dockerfile
Job Dependencies
Using Dependencies
build: stage: build script: npm run build artifacts: paths: - dist/
test: stage: test dependencies: - build script: npm test
Using Needs (DAG)
test:unit: needs: - job: build artifacts: true script: npm run test:unit
Parallel Jobs
Matrix Jobs
test: parallel: matrix: - NODE_VERSION: ["18", "20", "22"] OS: ["alpine", "bullseye"] image: node:${NODE_VERSION}-${OS} script: npm test
Simple Parallel
test: parallel: 5 script: npm run test:shard
Resource Configuration
heavy_job: tags: - high-memory resource_group: deploy timeout: 2h retry: max: 2 when: - runner_system_failure - stuck_or_timeout_failure