GitLab
GitLab CI/CD Pipeline Mastery:A Comprehensive Guide
Continuous Integration and Continuous Deployment (CI/CD) is at the heart of modern DevOps practices, and GitLab provides one of the most powerful pipeline systems available
February 7, 2025
Tech Writer
4 min read
GitLab CI/CD Pipeline Mastery: A Comprehensive Guide
Introduction
Continuous Integration and Continuous Deployment (CI/CD) is at the heart of modern DevOps practices, and GitLab provides one of the most powerful pipeline systems available. In this comprehensive guide, we'll explore how to master GitLab CI/CD pipelines, from basic concepts to advanced implementations.
Table of Contents
- Basic Pipeline Structure
- Advanced Pipeline Features
- Real-world Examples
- Best Practices
- Troubleshooting Guide
Basic Pipeline Structure
Understanding .gitlab-ci.yml
The
.gitlab-ci.yml
stages: - build - test - deploy variables: APP_VERSION: "1.0.0" DOCKER_REGISTRY: "registry.example.com" build_job: stage: build script: - echo "Building application..." - npm install - npm run build artifacts: paths: - dist/ expire_in: 1 week test_job: stage: test script: - echo "Running tests..." - npm run test coverage: '/Coverage: \d+.\d+%/' deploy_job: stage: deploy script: - echo "Deploying application..." - docker build -t $DOCKER_REGISTRY/myapp:$APP_VERSION . - docker push $DOCKER_REGISTRY/myapp:$APP_VERSION only: - main
Key Components Explained
- Stages: Define the pipeline flow
- Variables: Set global configuration
- Jobs: Individual units of work
- Artifacts: Pass data between jobs
- Rules: Control job execution
Advanced Pipeline Features
1. Dynamic Pipelines
generate_jobs: stage: .pre script: - python generate_pipeline.py artifacts: paths: - generated-config.yml include: - local: 'generated-config.yml'
2. Parallel Job Execution
test: parallel: 3 script: - npm run test -- --split=$CI_NODE_INDEX/$CI_NODE_TOTAL
3. Environment-specific Deployments
.deploy_template: &deploy_definition script: - kubectl apply -f k8s/ variables: ENVIRONMENT: staging deploy_staging: <<: *deploy_definition environment: name: staging url: https://staging.example.com deploy_production: <<: *deploy_definition variables: ENVIRONMENT: production environment: name: production url: https://production.example.com when: manual only: - tags
Real-world Pipeline Examples
1. Full-stack Application Pipeline
image: node:16 stages: - install - lint - test - build - deploy cache: paths: - node_modules/ install_dependencies: stage: install script: - npm ci artifacts: paths: - node_modules/ lint_code: stage: lint script: - npm run lint - npm run prettier:check unit_tests: stage: test script: - npm run test:unit coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/' integration_tests: stage: test services: - mongo:4.4 variables: MONGODB_URI: "mongodb://mongo:27017/test" script: - npm run test:integration build_frontend: stage: build script: - npm run build artifacts: paths: - dist/ deploy_to_aws: stage: deploy image: name: amazon/aws-cli entrypoint: [""] script: - aws s3 sync dist/ s3://$S3_BUCKET/ - aws cloudfront create-invalidation --distribution-id $CF_DISTRIBUTION --paths "/*" only: - main
2. Docker-based Microservice Pipeline
variables: DOCKER_REGISTRY: "${CI_REGISTRY}/${CI_PROJECT_PATH}" DOCKER_TAG: "${CI_COMMIT_SHA}" stages: - test - build - security - deploy .docker_login: &docker_login before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY test: image: python:3.9 stage: test script: - pip install -r requirements.txt - pytest --cov=app tests/ coverage: '/TOTAL.+ ([0-9]{1,3}%)/' build: stage: build <<: *docker_login script: - docker build -t ${DOCKER_REGISTRY}:${DOCKER_TAG} . - docker push ${DOCKER_REGISTRY}:${DOCKER_TAG} security_scan: stage: security image: aquasec/trivy script: - trivy image ${DOCKER_REGISTRY}:${DOCKER_TAG} deploy_k8s: stage: deploy image: bitnami/kubectl script: - kubectl set image deployment/myapp container=${DOCKER_REGISTRY}:${DOCKER_TAG} environment: name: production url: https://api.example.com
Best Practices
1. Pipeline Optimization
- Use cache effectively
- Implement parallel jobs
- Optimize Docker layers
- Use shallow cloning
2. Security Considerations
security_checks: stage: security parallel: matrix: - SCANNER: [sast, dast, dependency-scanning] script: - gitlab-security-scan $SCANNER
3. Environment Management
- Use environment variables
- Implement review apps
- Use manual deployments for production
- Implement rollback strategies
Troubleshooting Guide
Common Issues and Solutions
- Pipeline Timing Out
long_running_job: script: - ./long-script.sh timeout: 3 hours
- Cache Issues
cache: key: ${CI_COMMIT_REF_SLUG} paths: - node_modules/ policy: pull-push
- Job Dependencies
deploy: needs: - job: build artifacts: true
Advanced Tips and Tricks
1. Custom CI/CD Metrics
metrics_job: script: - | echo "pipeline_duration_seconds{pipeline=\"$CI_PIPELINE_ID\"} $CI_PIPELINE_DURATION" > metrics.txt artifacts: reports: metrics: metrics.txt
2. Dynamic Environment URLs
review_app: environment: name: review/$CI_COMMIT_REF_NAME url: https://$CI_ENVIRONMENT_SLUG.example.com on_stop: stop_review_app script: - deploy_review_app.sh
Conclusion
Mastering GitLab CI/CD pipelines requires understanding both basic concepts and advanced features. This guide provides a foundation for building efficient, secure, and scalable pipelines for your applications.
Resources
- GitLab CI/CD Documentation
- Pipeline Examples Repository
- GitLab Runner Documentation
- CI/CD Best Practices Guide
Last Updated: February 2025
gitlabci
gitlab