Understanding Pipeline Problems (Timeout CICD GitLab)

In the ever-evolving world of software development, Continuous Integration and Continuous Delivery (CICD) plays a pivotal role in your team’s continuous success.

Among countless tools available for CICD, GitLab stands out due to its comprehensive suite of features.

Managing GitLab efficiently demands a deep understanding of numerous concepts and practices, including one that isn’t talked about a ton: timeout settings. 

This article will dive deep into the specifics of timeout in GitLab’s CICD process, providing a detailed understanding of its functionality, its implications for your workflow, and how to optimize it for better performance and productivity. 

We’ll also give some tips and tricks at the end (scenario-based) of problems you could be running into – that’ll quickly get you on your way to solving whatever issue you’re currently running into.

thumbs up in an office

GitLab Runner Failure: Project Level Timeout

As we know from above, two types of timeouts can be defined: project- and runner-level timeouts.

To define project-level timeout, go to your specific project settings, click on CI/CD, and then click on general pipelines.

There, you will find the option to set the timeout.

By default, the timeout is 60 minutes or one hour. If any job surpasses this timeout threshold, it will be marked as failed.

sand time clock

If you have defined both project- and runner-level timeout, which takes precedence?

There are three scenarios.

  • First, if the runner level timeout is bigger than the project level timeout, and the job runs longer than defined in the project level timeout, it will be marked as failed. 
  • Second, if the runner-level timeout is not configured, the project-level timeout will be considered.
  • Third, if the runner-level timeout is smaller than the project-level timeout, and the job runs longer than the runner-level timeout, it will be marked as failed.

GitLab Runner Failure: Runner Level Timeout

To set the runner level timeout, go to a specific project’s settings and navigate to the CI/CD runners section.

Expand the section, click on the pencil icon of a specific runner, and you will see the option to define the maximum job timeout.

By setting this option, you can define a specific runner-level job timeout.

Let’s say you have five different GitLab runners associated with five different projects. In that case, you can define five different job timeouts for these five GitLab runners by going to this option.

If you have defined both project-level timeout and runner-level timeout, then the runner-level timeout takes precedence.

subspace

There are three scenarios to consider:

  1. Runner level timeout is bigger than project level timeout – If the job runs longer than defined in the project level timeout, it will be marked as fail.
  2. Runner level timeout is not configured – In this case, the project level timeout will be considered the higher timeout. Any CI/CD pipeline running longer than the project level timeout will be marked as a failure.
  3. Runner level timeout is smaller than project level timeout – If any CI/CD pipeline runs longer than the runner level timeout, it will be marked as fail.

To avoid such failures, it is recommended to increase the job timeout. You can ensure that your CI/CD pipelines run smoothly without interruptions by defining appropriate timeouts at both project and runner levels.

Timeout Pipeline Problems Solutions

If we have defined project-level timeout and runner-level timeout, then there are three scenarios to consider.

  • First, if the runner level timeout is bigger than the project level timeout and the job runs longer than defined in the project level timeout, it will be marked as a fail.
  • Second, if the runner level timeout is not configured, then the project level timeout will be considered, and any CI/CD pipeline running longer than the project level timeout will be marked as a failure.
  • Third, if the runner level timeout is smaller than the project level timeout and any CI/CD pipeline running longer than the runner level timeout will be marked as a fail.

Increasing the job timeout is the solution to this problem. By defining runner-level or project-level timeout, we can ensure that our CI/CD pipelines do not fail due to job timeouts.

Surprised man

What are pipeline badges in GitLab CI?

Pipeline badges are visual indicators in GitLab CI that display the current pipeline status and test coverage. They are helpful for quickly assessing the health of a project without having to drill down into the details. (Manager view)

How can I limit the number of changes in a GitLab CI pipeline?

In the GitLab CI pipeline settings, you can limit the number of changes that GitLab will recognize. This can help manage builds effectively by preventing too many changes from overloading the pipeline.

What are shallow clones in GitLab CI pipelines?

Shallow clone in GitLab CI pipelines defines how GitLab CI clones the repository from scratch for every job. Instead of cloning the entire history of the repository, it creates a shallow clone with only a limited number of revisions. This feature makes the local working copy smaller and can speed up jobs that don’t need the entire history.

What does the configuration file do in a GitLab CI pipeline?

The configuration file in a GitLab CI pipeline is essential. It defines how the pipeline should operate for a specific project, including how to run jobs, where to store job artifacts, and how to manage your pipeline settings. This file will be autodetected within your project directory and should be named .gitlab-ci.yml.

Why are redundant pipelines a problem in GitLab CI?

Redundant pipelines in GitLab CI are pipelines that run despite no relevant changes in the code. This can consume precious CI/CD resources and delay actual critical jobs. That’s why managing these properly is vital, possibly by enabling the auto-cancel redundant pipelines feature (like timeout!!).

How do I set a time limit for a job in the pipeline?

You can set a time limit for a job in the pipeline in the job’s configuration within the .gitlab-ci.yml file. The timeout defines the maximum amount of time a job can run in minutes or hours (or both). If a job surpasses the threshold, GitLab CI will automatically stop the job to prevent hogging resources. This only refers to specific jobs within a whole pipeline. To set a pipeline-specific timeout, you’ll need to utilize the steps talked about above (within the settings).

What are job artifacts, and what is their visibility in pipelines?

Job artifacts in GitLab CI pipelines refer to the files created by jobs that you might need in later stages or for other purposes. Regarding their visibility, anyone with reporter or higher access in public projects can access the job artifacts by default. All of this can be tailored in your project’s settings.

How do I avoid cloning the repository from scratch for every job?

To save CI/CD runner processing time, you can adjust your GitLab CI configuration to avoid cloning the repository from scratch for every job. Adjust your .gitlab-ci.yml file to use cache or artifacts to pass data between pipeline stages instead of doing a full clone for each job.

What does scratch for every job mean?

Scratch for every job refers to the default GitLab CI behavior where the complete repository is cloned for every job in the pipeline, creating a fresh workspace each time a job runs. Although this can cause additional processing overhead, it ensures that each job starts with a clean, predictable state. Remember to increase timeout if this type of configuration is used, as it can significantly increase the amount of time a pipeline runs.

Some Other CI/CD Articles

Here at enjoymachinelearning.com, we have a few other in-depth articles about CI/CD.

Here are a few of those:

Dylan Kaplan