DEV Community

Cover image for Why Idempotence Matters in CI/CD Pipeline Build Steps
Dmitrii Kotov
Dmitrii Kotov

Posted on

Why Idempotence Matters in CI/CD Pipeline Build Steps

Recently, I was caught off guard by a question: why should the steps of a build script in a pipeline be idempotent? Why can't we build and push the container every time? Why is idempotence so important?

Idempotence in pipeline build steps is important for many reasons.

Predictability and Stability:

When a step in a pipeline is idempotent, it means that running it multiple times will always give the same result. This is very important for CI/CD pipelines because the same build might be triggered more than once. For example, if there is a small error, or someone makes changes to the code, or during testing, you might need to run the pipeline again. If the steps are idempotent, you don’t have to worry about unexpected results. Everything will work the same way every time.

Avoiding Wasting Resources:

If you build and push a container every time, even when nothing has changed, it can waste resources. Each time you push, it creates a new version of the container in the registry, even if it’s exactly the same as the previous one. This takes up storage space and can make things harder to manage. It can also cost more money if you’re using cloud services to store these containers.

Preventing Errors:

When steps are not idempotent, they might behave differently each time you run them. This can cause bugs that are difficult to understand and fix. For example, if a build step depends on a file that changes randomly or a tool that behaves differently depending on the environment, the pipeline can fail in unpredictable ways. Idempotent steps make the pipeline more reliable.

Saving Time with Caching:

Idempotent steps allow you to use caching. This means that if something has already been built or processed, it doesn’t need to be done again. For example, if your container image has several layers and only one of them has changed, you can reuse the unchanged layers. This can save a lot of time during the build process.

Easier Debugging:

When your pipeline is predictable, it’s much easier to find out what went wrong if something fails. You can check each step and know that it works the same way every time. If the pipeline behaves differently on every run, debugging becomes a nightmare.


Why shouldn’t we rebuild the container every time?

If the code or dependencies haven’t changed, rebuilding the container is unnecessary. It doesn’t add any value but uses extra time, CPU, and storage. Every new build creates a new version of the container image, which can make it hard to manage the versions and figure out which one you actually need. It’s better to reuse existing builds whenever possible.

In summary, idempotence is important because it makes the pipeline stable, saves resources, prevents errors, and makes everything faster and easier to manage. It’s like creating a system where you know exactly what will happen, no matter how many times you use it.

Top comments (5)

Collapse
 
subba_reddy_e0abcf4353f8b profile image
Subba Reddy

Nice point, btw can you please tell us how can we achieve idempotency in CICD pipelines?

Collapse
 
tutunak profile image
Dmitrii Kotov

Good idea for the next article. In short, if we talk about building container images, just use tools that help you verify whether the container image is present in the remote registry. For other tasks, we often deal with APIs that are usually idempotent. So, just test by running your step script multiple times. This approach will reveal most scenarios where you might not have achieved idempotence.

Collapse
 
kasir-barati profile image
Mohammad Jawad (Kasir) Barati

Just a request, if you get the chance to write an article I believe might be really useful and that is to share relevant link to the topic so that the reader specially if the topic is not be intuitive or it is new.

This way we know to go where from the post and after that I think it is much much easier to get up to speed. This way the steep learning curve would be less of a problem IMO.

E.g. IDK how to "verify whether the container image is present in the remote registry" and have some ideas as to what I should Google but it would be much faster if you share something as a Guru in this domain.

BTW just wanted to clarify something, I know and have used technologies like Terraform, Docker, GH actions, etc. But this topic of idempotency is new to me in general.

Collapse
 
alfianpr profile image
Alfian Pratama

Great POV. Anw do you has criteria of CI/CD Pipeline which has idempotency?

Collapse
 
j_j_b77c6f60020810c325308 profile image
J J

This feels like 25% of an article. It's a nice start, but where's the other 75%, which tells us how achieve this worthy objective?