In this article, we’ll explore how to define jobs and stages in a .gitlab-ci.yml
file, set dependencies, configure parallel execution, and use advanced features like job rules and conditions. By the end, you’ll be able to create efficient and robust pipelines for your projects.
What Are GitLab CI/CD Jobs?
Jobs are tasks executed in the pipeline, such as running tests or deploying code. Each job has a unique name and belongs to a stage. A job can include:
- Script: Commands to execute.
- Dependencies: Files or artifacts required from previous stages.
- Environment: The target deployment environment.
- Rules: Conditions for when the job should run.
What Are GitLab CI/CD Stages?
Stages define the order in which jobs are executed. For example, a typical pipeline might include stages like build, test, and deploy. Jobs in the same stage run in parallel, while stages run sequentially.
Example Pipeline Stages:
- build: Compile the application.
- test: Run unit and integration tests.
- deploy: Deploy the application to staging or production.
Defining Jobs and Stages in .gitlab-ci.yml
Here’s a basic example of a pipeline with multiple stages and jobs:
stages: - build - test - deploy build-job: stage: build script: - echo "Building the application..." - dotnet build unit-test-job: stage: test script: - echo "Running unit tests..." - dotnet test integration-test-job: stage: test script: - echo "Running integration tests..." - dotnet test --filter IntegrationTests deploy-job: stage: deploy script: - echo "Deploying application to production..."
Key Features for Managing Jobs
1. Setting Dependencies
Specify dependencies between jobs to share artifacts or outputs. For example:
build-job: stage: build script: - dotnet build artifacts: paths: - bin/ test-job: stage: test script: - dotnet test dependencies: - build-job
Here, test-job
depends on build-job
and uses its artifacts.
2. Running Jobs in Parallel
Run multiple instances of a job in parallel using the parallel
keyword. For example:
test-job: stage: test script: - dotnet test parallel: 4
This splits the job into four parallel tasks, reducing execution time.
3. Conditional Job Execution
Use rules or only/except keywords to control when a job runs:
deploy-job: stage: deploy script: - echo "Deploying to production..." rules: - if: '$CI_COMMIT_BRANCH == "main"' when: always
This ensures the deploy-job
runs only on the main branch.
4. Defining Job Timeouts
Set a timeout to prevent jobs from running indefinitely:
build-job: stage: build script: - dotnet build timeout: 10m
This limits the job to 10 minutes.
5. Using Environments
Define environments to specify deployment targets:
deploy-job: stage: deploy script: - echo "Deploying to production..." environment: name: production url: https://myapp.com
GitLab creates an environment dashboard for tracking deployments.
Best Practices for Managing Jobs and Stages
Follow these tips for efficient pipelines:
- Keep Jobs Small: Break down large tasks into smaller jobs for better parallelism and error tracking.
- Reuse Code: Use scripts or include reusable YAML files for consistency across jobs.
- Optimize Execution: Cache dependencies to speed up repeated tasks.
- Monitor Performance: Regularly review job execution times and logs to identify bottlenecks.
Example: CI/CD Pipeline for a .NET Project
Here’s a complete pipeline example for a .NET Framework project:
stages: - build - test - deploy build-job: stage: build script: - dotnet restore - dotnet build artifacts: paths: - bin/ unit-test-job: stage: test script: - dotnet test integration-test-job: stage: test script: - dotnet test --filter IntegrationTests deploy-staging: stage: deploy script: - echo "Deploying to staging..." environment: name: staging deploy-production: stage: deploy script: - echo "Deploying to production..." environment: name: production url: https://myapp.com rules: - if: '$CI_COMMIT_BRANCH == "main"'
Conclusion
Creating and managing jobs and stages in GitLab CI/CD allows you to build flexible and efficient pipelines. By defining stages, setting dependencies, and utilizing features like parallel execution and conditional rules, you can streamline your development and deployment workflows. Start building your custom pipeline today and unlock the full potential of GitLab CI/CD.