<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>@marcaurele</title>
    <link rel="self" type="application/atom+xml" href="https://marcaurele.brothier.org/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://marcaurele.brothier.org"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-03-24T00:00:00+00:00</updated>
    <id>https://marcaurele.brothier.org/atom.xml</id>
    <entry xml:lang="en">
        <title>Keep your Nomad job&#x27;s image up to date with Renovate</title>
        <published>2024-03-24T00:00:00+00:00</published>
        <updated>2024-03-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://marcaurele.brothier.org/2024-renovate-hashicorp-nomad-job-update/"/>
        <id>https://marcaurele.brothier.org/2024-renovate-hashicorp-nomad-job-update/</id>
        
        <content type="html" xml:base="https://marcaurele.brothier.org/2024-renovate-hashicorp-nomad-job-update/">&lt;p&gt;I run a Nomad cluster at home for my internal services which grows from time to time. It reached a level now that staying up to date with the different services’ updates is too much work, and too manual for me. I neither run my service with &lt;code&gt;latest&lt;&#x2F;code&gt; as you do not have any control on the version. I had to find a way to automate MRs&#x2F;PRs to propose updates whenever a new tag is pushed. Having discovered the power of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.renovatebot.com&#x2F;&quot;&gt;Renovate&lt;&#x2F;a&gt; &lt;em&gt;(highly recommended over Dependabot)&lt;&#x2F;em&gt;, and having it already setup to push updates in my development projects, I wanted to leverage it for my infrastructure configuration.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;EDITS: Renovate can be configured to directly parse the HCL file to update the &lt;code&gt;image&lt;&#x2F;code&gt; line, see the edits from the last paragraph.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nomad-job-definitions&quot;&gt;Nomad job definitions&lt;a class=&quot;zola-anchor&quot; href=&quot;#nomad-job-definitions&quot; aria-label=&quot;Anchor link for: nomad-job-definitions&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;With Nomad’s job definition, the &lt;code&gt;image&lt;&#x2F;code&gt; attribute contains the link to the registry and the tag to use. This syntax is not recognized by Renovate bot as it cannot parse the HCL file.&lt;&#x2F;p&gt;
&lt;p&gt;Extract of a Grafana + Prometheus service job definition:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;hcl&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;job&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &amp;quot;grafana&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;service&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;  group&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &amp;quot;grafana&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;    task&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &amp;quot;grafana&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      driver&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;docker&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;      config&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;           =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;docker.io&#x2F;grafana&#x2F;grafana-oss:10.4.1&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ports&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;           =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;http&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        readonly_rootfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        cap_drop&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;ALL&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Renovate will simply ignore the content of the file and cannot update the image url despite being a standard container image syntax. One way of solving this issue would have been to write the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.renovatebot.com&#x2F;modules&#x2F;manager&#x2F;&quot;&gt;dependency manager&lt;&#x2F;a&gt; for Nomad HCL files for the project. I have to admit I did not want to learn enough TypeScript in order to propose this change and took another easier approach.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-trick&quot;&gt;The trick&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-trick&quot; aria-label=&quot;Anchor link for: the-trick&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Instead of directly including the image link in the job file, we can leverage the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.hashicorp.com&#x2F;nomad&#x2F;docs&#x2F;job-specification&#x2F;hcl2&#x2F;functions&quot;&gt;HCL functions&lt;&#x2F;a&gt; to retrieve the container image definition from another file that Renovate (or any other dependency update manager like Dependabot) can parse and update. So the trick is to use a companion &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; where there is only the &lt;code&gt;FROM&lt;&#x2F;code&gt; line pointing to the image(s) we want to use in the job, and use the HCL functions to read its content. For the Grafana service, the content of the &lt;code&gt;Dockerfile.grafana&lt;&#x2F;code&gt; is as follow:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; docker.io&#x2F;grafana&#x2F;grafana-oss:10.4.1 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; grafana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; quay.io&#x2F;prometheus&#x2F;prometheus:v2.51.0 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; prometheus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It contains a &lt;code&gt;as&lt;&#x2F;code&gt; to put the image definition into a &lt;em&gt;map&lt;&#x2F;em&gt;, rather than using a simple list with indexes (not very readable).&lt;&#x2F;p&gt;
&lt;p&gt;The files are organized with the job definitions inside &lt;code&gt;jobs&#x2F;&lt;&#x2F;code&gt; and the companion &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; in the sub-directory &lt;code&gt;jobs&#x2F;images&#x2F;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── jobs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── grafana.hcl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── Dockerfile.grafana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Strangely the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.hashicorp.com&#x2F;nomad&#x2F;docs&#x2F;job-specification&#x2F;hcl2&quot;&gt;Nomad HCL2&lt;&#x2F;a&gt; language is only a subset of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.hashicorp.com&#x2F;terraform&#x2F;language&#x2F;functions&quot;&gt;Terraform HCL&lt;&#x2F;a&gt; one which contains more functions. Nevertheless there is enough in the Nomad HCL to do the job. The Nomad HCL code to read the image from the file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;hcl&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;locals&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  container_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;images&#x2F;Dockerfile.grafana&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  container_images&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; word&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;      for&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt; compact&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt;        fileexists&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;.&#x2F;jobs&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;container_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;.&#x2F;jobs&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;container_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;.&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;container_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      )) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt; split&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt; trimspace&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; word[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; word[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt; # FROM image as name -&amp;gt; {&amp;quot;name&amp;quot; = &amp;quot;image&amp;quot;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The code uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.hashicorp.com&#x2F;nomad&#x2F;docs&#x2F;job-specification&#x2F;hcl2&#x2F;functions&#x2F;file&#x2F;fileexists&quot;&gt;&lt;code&gt;fileexists()&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; because the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.hashicorp.com&#x2F;nomad&#x2F;docs&#x2F;job-specification&#x2F;hcl2&#x2F;functions&#x2F;file&#x2F;file&quot;&gt;&lt;code&gt;file()&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; function will be executed within the same path as where the &lt;code&gt;nomad&lt;&#x2F;code&gt; will be executed. As I can be in the root or inside the &lt;code&gt;jobs&lt;&#x2F;code&gt; directory when I ran commands, it requires to handle both case. It’s something you can simplify. The &lt;code&gt;compact(split())&lt;&#x2F;code&gt; is to remove empty lines from the &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; in case there are any at the end, or spaces between images. For information, the syntax does not support any comments added to the file &lt;code&gt;Dockerfile&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It allows to reference the image later in the job definition with the local variable:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;hcl&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;    task&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &amp;quot;grafana&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      driver&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;docker&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;      config&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;           =&lt;&#x2F;span&gt;&lt;span&gt; local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;container_images&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;grafana&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ports&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;           =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;http&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        readonly_rootfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Renovate is now able to open merge requests to keep up to date the &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; used for each service:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;marcaurele.brothier.org&#x2F;2024-renovate-hashicorp-nomad-job-update&#x2F;renovate-merge-request-diff.png&quot; alt=&quot;Merge request to update Grafana image tag&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;direct-update-with-renovate-edits&quot;&gt;Direct update with Renovate (edits)&lt;a class=&quot;zola-anchor&quot; href=&quot;#direct-update-with-renovate-edits&quot; aria-label=&quot;Anchor link for: direct-update-with-renovate-edits&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;Update thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.online&#x2F;@_duncan_&quot;&gt;_duncan_&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;_duncan_ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.online&#x2F;@_duncan_&#x2F;113035096064933672&quot;&gt;pointed out to me&lt;&#x2F;a&gt; that the docker datasource could be configured to update directly the HCL file for the line containing the &lt;code&gt;image&lt;&#x2F;code&gt; attribute. A custom manager should be added to the configuration:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;$schema&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;https:&#x2F;&#x2F;docs.renovatebot.com&#x2F;renovate-schema.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;customManagers&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;customType&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;regex&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;datasourceTemplate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;docker&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;fileMatch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;.hcl$&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;matchStrings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;s*image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;s*=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;s*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\\\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;(?&amp;lt;depName&amp;gt;.*?):(?&amp;lt;currentValue&amp;gt;.*?)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\\\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;It works brilliantly.&lt;&#x2F;em&gt; No need to read a &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; to extract the image tag value.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>One week shadowing Wayne Haber, Director of Engineering at GitLab</title>
        <published>2024-01-10T00:00:00+00:00</published>
        <updated>2024-01-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://marcaurele.brothier.org/2024-shadow-gitlab-eng-director-wayne-haber/"/>
        <id>https://marcaurele.brothier.org/2024-shadow-gitlab-eng-director-wayne-haber/</id>
        
        <content type="html" xml:base="https://marcaurele.brothier.org/2024-shadow-gitlab-eng-director-wayne-haber/">&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary&quot; aria-label=&quot;Anchor link for: summary&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Last December I spent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;handbook&#x2F;engineering&#x2F;development&#x2F;director-shadow-program&#x2F;&quot;&gt;one week shadowing Wayne Haber&lt;&#x2F;a&gt;, Engineering Director of Secure, Govern and Growth at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;&quot;&gt;GitLab&lt;&#x2F;a&gt;. While I’m not a GitLab employee, this opportunity was possible thanks to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;blog&#x2F;2016&#x2F;07&#x2F;12&#x2F;our-handbook-is-open-source-heres-why&#x2F;&quot;&gt;openness of GitLab&lt;&#x2F;a&gt; in describing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;&quot;&gt;how they work&lt;&#x2F;a&gt; and their &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;handbook&#x2F;values&#x2F;#transparency&quot;&gt;amount of information available to the public&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-motivated-me&quot;&gt;What motivated me?&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-motivated-me&quot; aria-label=&quot;Anchor link for: what-motivated-me&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;During one of my previous experiences, I asked other managers to be able to shadow how they were running their planning team meetings. I wanted to get a sense on how engineers were discussing their priorities and on-going work together, seeing as well how company projects were handled by each of them. I found the experience very rewarding as you are usually working in a single team and cannot experience different environments easily at the same company.
For this reason, when I came across a post from Wayne about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;handbook&#x2F;engineering&#x2F;development&#x2F;director-shadow-program&#x2F;&quot;&gt;his shadow program&lt;&#x2F;a&gt;, I immediately kept the link in my &lt;em&gt;One Day&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;em&gt; list to pick it up when I will have more time. I was interested to see what could be different from managing managers rather than ICs, how TeamOps was used on a day to day basis at GitLab (openness and async communication) and how the groups Secure, Govern and Growth were handled by Wayne.
So back in October when I had a medical leave after an injury the item came back to my sight and I sent a request to Wayne who quickly accepted it. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.social&#x2F;@marcaurele&#x2F;111308876640199866&quot;&gt;I was in!&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I have to admit, I really love GitLab and are following them since many years because of their openness.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;preparation&quot;&gt;Preparation&lt;a class=&quot;zola-anchor&quot; href=&quot;#preparation&quot; aria-label=&quot;Anchor link for: preparation&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;What I like from people I met working at GitLab is that they are leveraging their tool in good way to keep with the async communication. For the shadow program with Wayne, this means having &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;wayne&#x2F;wayne&#x2F;-&#x2F;issues&#x2F;2&quot;&gt;a full issue with all the items&lt;&#x2F;a&gt; to be done: prior, during and after the shadowing week. It was also used as a reference ticket to link all the contributions I would do which were driven by the shadowing week.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;marcaurele.brothier.org&#x2F;2024-shadow-gitlab-eng-director-wayne-haber&#x2F;.&#x2F;2024-01-04_22-13.png&quot; alt=&quot;related merge requests&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Things cannot be clearer! I had already done the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;levelup.gitlab.com&#x2F;courses&#x2F;teamops&quot;&gt;TeamOps free training&lt;&#x2F;a&gt; from GitLab back in November 2022 when it came out eager to understand better all their async best practices.
To get a better sense of the actual subjects and people, I watched 2-3 of the latest &lt;em&gt;“Sec growth senior leaders development staff meeting”&lt;&#x2F;em&gt; you can find on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;@GitLabUnfiltered&#x2F;search?query=sec%20growth%20development&quot;&gt;GitLab Youtube channel&lt;&#x2F;a&gt;, which I recommend for people on-boarded in the program.
We had a first video call with Wayne to sync on the shadow program, what was to be prepared before the week started and what were my expectations of the shadowing week.&lt;&#x2F;p&gt;
&lt;p&gt;On the Friday prior to the start, Wayne shared with me a file with his notes for the coming week containing his priorities and the meetings overview I would be participating in. As you could imagine, I was eager to have more meetings but not all can be public with an external person. GitLab employees, who participate in the program, do have a better experience as they can participate in more meetings.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-week&quot;&gt;The week&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-week&quot; aria-label=&quot;Anchor link for: the-week&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I’m living in Switzerland, meaning 5 hours ahead of Wayne’s time who is based in the US, in Atlanta, GA. Despite being able to do most of the meetings along side my job as the overlap is short, I took all afternoons off in order to be able to dive into topics, navigate the handbook and be fully available for any meeting.
On Monday afternoon, my time, was the first meeting with Wayne to get a sense of the topics for the week, explaining as well the content and structure of the shared notes file.&lt;&#x2F;p&gt;
&lt;p&gt;I had the opportunity to meet 8 GitLab employees, including Wayne, and 2 contractors during that week over Zoom calls, from direct reports, skip levels, to Wayne’s manager. As a manager myself, all the meetings were about topics I would expect. Even if there is a lot of open topics, meetings are mainly to address private ones so they would last up to about 30 minutes. It was interesting to hear about some of their current technical challenges and how they approach solutions. I could also experience how Wayne was introducing the GitLab way of working to new contractors starting on a project to ensure a smooth communication with the team, which is a major ingredient in remote only company.&lt;&#x2F;p&gt;
&lt;p&gt;What I liked most of course, is that thanks to GitLab openness, many topics can be followed publicly with their issues. You need Wayne’s input to find the needle in the hay stack, there are so many! I wonder how their CI handle it all.&lt;&#x2F;p&gt;
&lt;p&gt;A shared problematic, common to many or all software companies, was the speed of getting the merge requests in which popped up recently. I caught this in a previous senior leaders staff meeting, but sadly my week was not one with the team to be able to follow up on that.&lt;&#x2F;p&gt;
&lt;p&gt;Through the dedicated shadow program’s Slack channel, Wayne would post links and comments on topics and issues he was working on, or was going to read, seeking to have any sort of feedback on them. I spent a good amount of time reading the merge requests comments, following the links to get more context. My humble contributions were mainly proof reading to catch typos. As a reader of the Handbook, it feels better to have a clear content.&lt;&#x2F;p&gt;
&lt;p&gt;At one occasion I could feel some stress from Wayne when he knew less than 24 hours prior to a meeting that he had to cover for his manager at the CTO OKR monthly review to report his groups as well as all the other ones under his manager. It was a chase to find the right people on top of the time zone differences for the items missing updates since the last report. There you can see the scale of GitLab.&lt;&#x2F;p&gt;
&lt;p&gt;One recommendation I would do to future shadows, is to get in the 1-1 meetings you are invited ahead of time. It provides opportunities to do a coffee chat discussion with the other person, as well as checking each person GitLab repo to find some information about them (location, README). It’s a good source to find common topics to talk about. It made me catch that one of the meeting was with someone in Switzerland which I would not have guessed otherwise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-it-is-not-about&quot;&gt;What it is not about&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-it-is-not-about&quot; aria-label=&quot;Anchor link for: what-it-is-not-about&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;not about technical topics, but if some of the current challenges ring a bell to you and you have an open source committer’s mind, you will get the direct pointer to help them out.&lt;&#x2F;li&gt;
&lt;li&gt;not about getting hired as Wayne pointed it out in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;handbook&#x2F;engineering&#x2F;development&#x2F;director-shadow-program&#x2F;#what-this-program-is-not&quot;&gt;his shadow program page&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;it’s not intense and if you cannot attend most of the meetings for whatever reason, it will not affect Wayne’s week in a bad way.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;observations&quot;&gt;Observations&lt;a class=&quot;zola-anchor&quot; href=&quot;#observations&quot; aria-label=&quot;Anchor link for: observations&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Wayne looks well organized with his habits and is taking extra time and effort to duplicate things for the shadow with disclosable information.&lt;&#x2F;li&gt;
&lt;li&gt;I could observed his servant leadership line with the listening, empathy, building community, persuasion principles to name a few.&lt;&#x2F;li&gt;
&lt;li&gt;GitLab, as many other IT companies, had to realign its workforce, and despite the difficult past moments, everyone was engaged and happy to contribute.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;What’s next&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-next&quot; aria-label=&quot;Anchor link for: what-s-next&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This shadow week gave me more confidence in how am I doing my leadership work with my team. It made me think through my weekly habits to seek more effectiveness and in ways to push more for asynchronous habits within my team. Last but not least, I will seek to participate in a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mentoring-club.com&#x2F;the-mentors&#x2F;marc-aurele-brothier&quot;&gt;mentor+mentee program&lt;&#x2F;a&gt; to have regular exchange with peers from other companies.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;waynehaber&#x2F;&quot;&gt;Wayne&lt;&#x2F;a&gt; for the opportunity and GitLab &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;sijbrandij&#x2F;&quot;&gt;Sid Sijbrandij&lt;&#x2F;a&gt; for the openness of GitLab which allow to access many information, making &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;handbook&#x2F;engineering&#x2F;development&#x2F;director-shadow-program&#x2F;&quot;&gt;this Shadow program&lt;&#x2F;a&gt; possible.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Blog post source and merge request comments available at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;marcaurele&#x2F;gitlab-shadow-program&#x2F;&quot;&gt;https:&#x2F;&#x2F;gitlab.com&#x2F;marcaurele&#x2F;gitlab-shadow-program&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;I follow the Inbox-Zero method and keep those items with a dedicated flag in it, avoiding having too many tools. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
</feed>
