<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Devops on Omar H.Ajmi | Python, Java, Terraform &amp; DevOps TILs</title>
    <link>https://omar-ajmi.de5.net/tags/devops/</link>
    <description>Recent content in Devops on Omar H.Ajmi | Python, Java, Terraform &amp; DevOps TILs</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Fri, 30 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://omar-ajmi.de5.net/tags/devops/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Terraform Tests Without an AWS Bill: Mocking Providers</title>
      <link>https://omar-ajmi.de5.net/posts/en/terraform-mock-provider-tests/</link>
      <pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/terraform-mock-provider-tests/</guid>
      <description>&lt;p&gt;You changed a Terraform variable, refactored a module, and want to make sure the configuration still does what you expect. The usual alternative to trusting your eyes? Apply it and see what happens.&lt;/p&gt;
&lt;p&gt;That feedback loop gets expensive when the experiment involves real cloud resources. Fortunately, Terraform has a built-in option for testing configuration logic without provisioning actual infrastructure: &lt;strong&gt;mock providers&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;The idea: replace the real provider&lt;/h3&gt;

&lt;p&gt;Terraform&amp;rsquo;s native testing framework supports provider mocking starting with Terraform 1.7.0. A mock provider simulates provider behavior, allowing tests to run without cloud credentials or real infrastructure. &lt;a href=&#34;https://developer.hashicorp.com/terraform/language/tests/mocking&#34;&gt;Official documentation&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🏃 GitLab CI: cache is not an artifact</title>
      <link>https://omar-ajmi.de5.net/posts/en/gitlab-ci-cache/</link>
      <pubDate>Tue, 15 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/gitlab-ci-cache/</guid>
      <description>&lt;h1 id=&#34;-gitlab-ci-cache-is-not-an-artifact&#34; class=&#34;header-anchor-wrapper&#34;&gt;🏃 GitLab CI: cache is not an artifact
  &lt;a href=&#34;#-gitlab-ci-cache-is-not-an-artifact&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;You made your pipeline faster with caching. Beautiful.&lt;/p&gt;
&lt;p&gt;Then another job needs a compiled file, the cache doesn&amp;rsquo;t contain it, and suddenly your pipeline is doing interpretive dance.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s separate two jobs that look similar but aren&amp;rsquo;t.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🍱 Terraform state: the file you shouldn&#39;t casually commit</title>
      <link>https://omar-ajmi.de5.net/posts/en/terraform-sensitive-state/</link>
      <pubDate>Fri, 11 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/terraform-sensitive-state/</guid>
      <description>&lt;h1 id=&#34;-terraform-state-the-file-you-shouldnt-casually-commit&#34; class=&#34;header-anchor-wrapper&#34;&gt;🍱 Terraform state: the file you shouldn&amp;rsquo;t casually commit
  &lt;a href=&#34;#-terraform-state-the-file-you-shouldnt-casually-commit&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;You avoided hardcoding a password in Terraform. Nice. You added &lt;code&gt;sensitive = true&lt;/code&gt;. Even nicer.&lt;/p&gt;
&lt;p&gt;So the secret is safe now, right?&lt;/p&gt;
&lt;p&gt;Well… not necessarily. 😬&lt;/p&gt;

&lt;h2 id=&#34;-the-principle&#34; class=&#34;header-anchor-wrapper&#34;&gt;🧠 The principle
  &lt;a href=&#34;#-the-principle&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Terraform state tracks managed infrastructure and can contain resource attributes and sensitive values. Terraform plan files can also contain sensitive data.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🚀 GitLab CI/CD: Stop Waiting for Jobs You Don&#39;t Need</title>
      <link>https://omar-ajmi.de5.net/posts/en/gitlab-ci-needs-speed-up-pipelines/</link>
      <pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/gitlab-ci-needs-speed-up-pipelines/</guid>
      <description>&lt;h1 id=&#34;-gitlab-cicd-stop-waiting-for-jobs-you-dont-need&#34; class=&#34;header-anchor-wrapper&#34;&gt;🚀 GitLab CI/CD: Stop Waiting for Jobs You Don&amp;rsquo;t Need
  &lt;a href=&#34;#-gitlab-cicd-stop-waiting-for-jobs-you-dont-need&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Your application builds in two minutes. Unit tests take three. A static analysis job takes another four.&lt;/p&gt;
&lt;p&gt;Unfortunately, your deployment doesn&amp;rsquo;t need to wait for all three jobs to finish. It only needs the build and tests.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🔀 GitLab CI/CD: Jobs Have Rules, Pipelines Have Rules Too</title>
      <link>https://omar-ajmi.de5.net/posts/en/gitlab-ci-rules-vs-workflow-rules/</link>
      <pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/gitlab-ci-rules-vs-workflow-rules/</guid>
      <description>&lt;h1 id=&#34;-gitlab-cicd-jobs-have-rules-pipelines-have-rules-too&#34; class=&#34;header-anchor-wrapper&#34;&gt;🔀 GitLab CI/CD: Jobs Have Rules, Pipelines Have Rules Too
  &lt;a href=&#34;#-gitlab-cicd-jobs-have-rules-pipelines-have-rules-too&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;You push a commit, open a merge request, and suddenly GitLab is running two pipelines for what feels like the same change.&lt;/p&gt;
&lt;p&gt;Congratulations: you&amp;rsquo;ve discovered a surprisingly common CI/CD configuration headache.&lt;/p&gt;
&lt;p&gt;The problem might be the difference between &lt;code&gt;rules&lt;/code&gt; and &lt;code&gt;workflow:rules&lt;/code&gt;. They look similar, but they operate at different levels.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🎛️ GitLab CI/CD: Inputs Are Typed Parameters, Variables Are Not</title>
      <link>https://omar-ajmi.de5.net/posts/en/gitlab-ci-spec-inputs/</link>
      <pubDate>Tue, 16 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/gitlab-ci-spec-inputs/</guid>
      <description>&lt;h1 id=&#34;-gitlab-cicd-inputs-are-typed-parameters-variables-are-not&#34; class=&#34;header-anchor-wrapper&#34;&gt;🎛️ GitLab CI/CD: Inputs Are Typed Parameters, Variables Are Not
  &lt;a href=&#34;#-gitlab-cicd-inputs-are-typed-parameters-variables-are-not&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;You wrote a reusable CI template. Teams customize it with variables, a typo in a variable name silently falls back to nothing, and the failure shows up twenty minutes later in a job log.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>