<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Guides on</title><link>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/</link><description>Recent content in Guides on</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 02 Aug 2026 14:52:50 +0200</lastBuildDate><atom:link href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/index.xml" rel="self" type="application/rss+xml"/><item><title>Guide: docker compose</title><link>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/docker-compose/</link><pubDate>Sun, 01 Aug 2021 22:10:01 +0200</pubDate><guid>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/docker-compose/</guid><description>&lt;div class="sect1"&gt;&#10;&lt;h2 id="_docker_compose"&gt;Docker Compose&lt;/h2&gt;&#10;&lt;div class="sectionbody"&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;In this scenario, we have to maintain a docker-compose file and we want to be sure that we always use the latest available docker.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_requirement"&gt;Requirement&lt;/h3&gt;&#10;&lt;div class="olist arabic"&gt;&#10;&lt;ol class="arabic"&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Updatecli&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;IDE&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;A GitHub Personal Access Token&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_updatecli_binary"&gt;Updatecli Binary&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&#10;Updatecli is a declarative dependency management tool. The application is available as a command line compatible with Linux/macOS/Windows. Updatecli is designed to work the same way, both from a local machine and a CI environment.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;It can easily be installed using Homebrew by running the two following commands:&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;-&gt; &lt;code&gt;brew tap updatecli/updatecli&lt;/code&gt;&lt;/br&gt;&#10;-&gt; &lt;code&gt;brew install updatecli&lt;/code&gt;&lt;/br&gt;&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;Additional installation instructions are available at &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/prologue/installation/"&gt;www.updatecli.io/docs/prologue/installation&lt;/a&gt;.&#10;&lt;/p&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_ide"&gt;IDE&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&#10; The best way to write Updatecli manifest(s) is by using an IDE compatible with jsonschema hosted on schemastore.org, such as Vscode, Intellij, or Neovim.&#10; The full list of compatible IDE is available on &lt;a href="https://www.schemastore.org/json/"&gt;www.schemastore.org&lt;/a&gt;.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10; For the IDE to load the correct Updatecli jsonschema, Updatecli manifest must have both a parent directory named "&lt;b&gt;updatecli.d&lt;/b&gt;" and one of the file extension "&lt;b&gt;.yaml&lt;/b&gt;", or "&lt;b&gt;.yml&lt;/b&gt;".&#10; This provides auto-completion and validation out of the box.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10; For example, from VScode, typing [ctrl][space] should display a box with various suggestions&#10;&lt;/p&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_github_personal_access_token"&gt;GitHub Personal Access Token&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;As we are going to interact with resources on Github such as github repository and GitHub packages, we need a personal access token. More information on the GitHub documentation &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;creating-a-personal-access-token&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_description"&gt;Description&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Docker image versions are identified using two methods, either the docker image tag or the docker image digest.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;strong&gt;Tag&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;A docker image tag is useful when we want to have an easy to identify human-readable version like in &lt;code&gt;nginx:1.17&lt;/code&gt; where &lt;code&gt;1.17&lt;/code&gt; is the tag. Unfortunately, a docker image tag can be easily overridden, whether on purpose or not. As when using the tag &lt;code&gt;latest&lt;/code&gt;.&#10;This means that a docker image tag can’t be considered as a source of truth.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;strong&gt;Digest&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;The second method to identify a docker image version is by using its digest like in &lt;code&gt;nginx@sha256:8269a7352a7dad1f8b3dc83284f195bac72027dd50279422d363d49311ab7d9b&lt;/code&gt; where the string following &lt;code&gt;nginx@sha256:&lt;/code&gt; is the digest. A digest is a hash referencing a specific version of a docker image tag, in this case, &lt;code&gt;nginx:1.17&lt;/code&gt;.&#10;A digest is immutable, we can always rollback to a specific digest if needed. However, it’s not convenient to identify which version we’re referencing without a little further investigation.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;The problem could be summarized as, &amp;#34;do we want to only use a well-defined docker image by using digests but with the cost of losing readability?&amp;#34; or, &amp;#34;are we accepting the risk of running an unwanted version by using image tags?&amp;#34;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;It depends on how important we value readability versus uniqueness, but a useful rule of thumb is to consider the docker image build strategy.&#10;What’s the risk of running an unwanted version and how big is the chance of having to rollback.&#10;If we only build one image by version and that version is regularly updated then preferring readability by using docker image tag seems reasonable otherwise in any other scenarios it’s usually safer to use docker image digest.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Now that we know what to update and why, let see how to do it using updatecli.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_docker_image_tag"&gt;Docker Image Tag&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;When we want to automate image tag updates, we have to identify the process used to define those tags, and if that process is automated.&#10;Then you can more than likely also automate the version update and this is where updatecli can play a role.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Using &lt;code&gt;updatecli&lt;/code&gt;, you specify this process in the source stage, then if needed you check a condition and if the condition is satisfied then you update the version in your target file.&#10;Considering again, the example of regularly updating the Jenkins version.&#10;We know that a release is published every week on a maven repository, then a docker image build is published on DockerHub.&#10;Considering the build strategy, it would seem to be fine to use a docker image tag.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Let’s consider this docker compose file, which the three examples below all share:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;docker-compose.yaml&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;---&#10;version: &amp;#39;3&amp;#39;&#10;services:&#10; jenkins:&#10; image: jenkins/jenkins:2.245&#10; ports:&#10; - 8080:8080&#10;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Now we write an updatecli configuration with a source, conditions, and one target&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;updatecli.1.yaml&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;name: Example 1&#10;&#10;sources:&#10; jenkins:&#10; name: &amp;#34;Get latest Jenkins version from maven repo&amp;#34;&#10; kind: maven&#10; transformers:&#10; # - addprefix: &amp;#34;v&amp;#34;&#10; - addsuffix: &amp;#34;-jdk11&amp;#34;&#10; spec:&#10; url: &amp;#34;repo.jenkins-ci.org&amp;#34;&#10; repository: &amp;#34;releases&amp;#34;&#10; groupid: &amp;#34;org.jenkins-ci.main&amp;#34;&#10; artifactid: &amp;#34;jenkins-war&amp;#34;&#10;&#10;conditions:&#10; docker:&#10; name: &amp;#34;Docker Image Published on Registry&amp;#34;&#10; kind: dockerimage&#10; spec:&#10; image: &amp;#34;jenkins/jenkins&amp;#34;&#10; architecture: &amp;#34;amd64&amp;#34;&#10;&#10;targets:&#10; imageTag:&#10; name: &amp;#34;Update docker-compose jenkins service&amp;#34;&#10; kind: yaml&#10; transformers:&#10; - addprefix: &amp;#34;jenkins/jenkins:&amp;#34;&#10; spec:&#10; file: &amp;#34;./docker-compose.yaml&amp;#34;&#10; key: &amp;#34;services.jenkins.image&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;code&gt;updatecli pipeline diff --config updatecli.1.yaml&lt;/code&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Updatecli queries the maven repository &amp;#39;releases&amp;#39; located on &lt;code&gt;repo.jenkins-ci.org&lt;/code&gt;, to determine the latest version.&#10;If it finds one, a source transformer appends the suffix &lt;code&gt;-jdk11&lt;/code&gt;, as we are looking specifically for the java 11 version, and a target transformer prepends the prefix &lt;code&gt;jenkins/jenkins:&lt;/code&gt; to build the full image reference.&#10;We validate that the docker image exists on DockerHub and then we test that the value in the file &amp;#39;docker-compose.yaml&amp;#39; for the key &lt;code&gt;services.jenkins.image&lt;/code&gt; is correct. If not then we bump it.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;If happy with the changes then we apply them by using &lt;code&gt;apply&lt;/code&gt; instead of &lt;code&gt;diff&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;code&gt;updatecli pipeline apply --config ./updatecli.1.yaml&lt;/code&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_docker_image_digest"&gt;Docker Image Digest&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;As explained earlier, sometimes it’s preferable to use the docker image digest, if we need to rely on a specific version, or if we want to easily rollback.&#10;Most of the configuration remains the same as the previous example. This time the source is of kind &lt;code&gt;dockerdigest&lt;/code&gt; and we don’t test if an image exists on DockerHub as we’re already asking DockerHub for the latest image.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;We start from the same &lt;code&gt;docker-compose.yaml&lt;/code&gt; shown above.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;updatecli.2.yaml&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;name: Example 2&#10;&#10;sources:&#10; jenkins:&#10; kind: dockerdigest&#10; spec:&#10; image: &amp;#34;jenkins/jenkins&amp;#34;&#10; tag: &amp;#34;lts-jdk11&amp;#34;&#10; architecture: &amp;#34;amd64&amp;#34;&#10;&#10;targets:&#10; imageTag:&#10; name: &amp;#34;jenkins/jenkins:lts-jdk11 docker digest&amp;#34;&#10; kind: yaml&#10; transformers:&#10; - addprefix: &amp;#34;jenkins/jenkins@sha256:&amp;#34;&#10; spec:&#10; file: &amp;#34;./docker-compose.yaml&amp;#34;&#10; key: &amp;#34;services.jenkins.image&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;This time updatecli queries DockerHub to retrieve the digest for the docker image &lt;code&gt;jenkins/jenkins:lts-jdk11&lt;/code&gt;. If it finds one, then we test that the value in the file &amp;#39;docker-compose.yaml&amp;#39; for the key &lt;code&gt;services.jenkins.image&lt;/code&gt; is correct, otherwise we change it.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Again, if the changes are acceptable then we apply them by using &lt;code&gt;apply&lt;/code&gt; instead of &lt;code&gt;diff&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="ulist"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;updatecli pipeline diff --config updatecli.2.yaml&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;updatecli pipeline apply --config updatecli.2.yaml&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_gitgithub"&gt;Git/GitHub&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Now that we have an easy way to update docker image versions, we are missing a way to save, review, and rollback those changes. For this, git is an excellent tool.&#10;Either we directly commit and push to a git repository, or we use the GitHub workflow by pushing to a temporary branch.&#10;If using GitHub we can also submit our changes via a pull request.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;We keep the same &lt;code&gt;docker-compose.yaml&lt;/code&gt; as before, and extend the manifest.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;While the configuration remains similar to the earlier example, this time two new elements are introduced.&#10;We can define generic values in the file or read values from an environment variable like &lt;code&gt;{{ requiredEnv &amp;#34;UPDATECLI_GITHUB_TOKEN&amp;#34; }}&lt;/code&gt;.&#10;The &lt;code&gt;scms&lt;/code&gt; block defines the github repository configuration, and the &lt;code&gt;actions&lt;/code&gt; block turns the pushed branch into a pull request.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;updatecli.3.yaml&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;name: Example 3&#10;&#10;sources:&#10; jenkins:&#10; name: &amp;#34;Get latest Jenkins version from maven repo&amp;#34;&#10; kind: &amp;#34;maven&amp;#34;&#10; transformers:&#10; # - addprefix: &amp;#34;v&amp;#34;&#10; - addsuffix: &amp;#34;-jdk11&amp;#34;&#10; spec:&#10; url: &amp;#34;repo.jenkins-ci.org&amp;#34;&#10; repository: &amp;#34;releases&amp;#34;&#10; groupid: &amp;#34;org.jenkins-ci.main&amp;#34;&#10; artifactid: &amp;#34;jenkins-war&amp;#34;&#10;&#10;conditions:&#10; docker:&#10; name: &amp;#34;Docker Image Published on Registry&amp;#34;&#10; kind: &amp;#34;dockerimage&amp;#34;&#10; spec:&#10; image: &amp;#34;jenkins/jenkins&amp;#34;&#10; architecture: &amp;#34;amd64&amp;#34;&#10;&#10;targets:&#10; imageTag:&#10; name: &amp;#34;Update docker-compose jenkins service&amp;#34;&#10; kind: &amp;#34;yaml&amp;#34;&#10; scmid: &amp;#34;updatecli/website&amp;#34;&#10; transformers:&#10; - addprefix: &amp;#34;jenkins/jenkins:&amp;#34;&#10; spec:&#10; file: &amp;#34;assets/code_example/docs/guides/docker-compose/docker-compose.yaml&amp;#34;&#10; key: &amp;#34;services.jenkins.image&amp;#34;&#10;&#10;scms:&#10; updatecli/website:&#10; kind: &amp;#34;github&amp;#34;&#10; spec:&#10; user: &amp;#34;John&amp;#34;&#10; email: &amp;#34;info@updatecli.io&amp;#34;&#10; owner: &amp;#34;updatecli&amp;#34;&#10; repository: &amp;#34;website&amp;#34;&#10; token: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_TOKEN&amp;#34; }}&amp;#39;&#10; username: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_ACTOR&amp;#34; }}&amp;#39;&#10; branch: &amp;#34;master&amp;#34;&#10;&#10;actions:&#10; default:&#10; kind: &amp;#34;github/pullrequest&amp;#34;&#10; scmid: &amp;#34;updatecli/website&amp;#34;&#10; spec:&#10; labels:&#10; - &amp;#34;dependencies&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;And now you can use the same commands as before, with the credentials the manifest expects:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-shell" data-lang="shell"&gt;export UPDATECLI_GITHUB_TOKEN=&amp;lt;your_PAT&amp;gt;&#10;export UPDATECLI_GITHUB_ACTOR=&amp;lt;your GH username&amp;gt;&#10;&#10;updatecli pipeline diff --config updatecli.3.yaml&#10;updatecli pipeline apply --config updatecli.3.yaml&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_conclusion"&gt;Conclusion&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;With this scenario, we saw how to automatically update a docker-compose file using custom strategies with updatecli.&#10;Updatecli is a small single binary that is suitable for use in your favorite CI environment.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Guide: Npm</title><link>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/npm/</link><pubDate>Tue, 07 Feb 2023 22:10:01 +0200</pubDate><guid>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/npm/</guid><description>&lt;div class="sect1"&gt;&#10;&lt;h2 id="_npm"&gt;npm&lt;/h2&gt;&#10;&lt;div class="sectionbody"&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_goal"&gt;Goal&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;The purpose of this pipeline is to track one npm dependency update, and then update both the package.json and package-lock.json in case of a version change.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_requirement"&gt;Requirement&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;This guide requires:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="olist arabic"&gt;&#10;&lt;ol class="arabic"&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;updatecli&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;npm&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;IDE&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;GitHub Personal Access Token&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_updatecli"&gt;updatecli&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&#10;Updatecli is a declarative dependency management tool. The application is available as a command line compatible with Linux/macOS/Windows. Updatecli is designed to work the same way, both from a local machine and a CI environment.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;It can easily be installed using Homebrew by running the two following commands:&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;-&gt; &lt;code&gt;brew tap updatecli/updatecli&lt;/code&gt;&lt;/br&gt;&#10;-&gt; &lt;code&gt;brew install updatecli&lt;/code&gt;&lt;/br&gt;&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;Additional installation instructions are available at &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/prologue/installation/"&gt;www.updatecli.io/docs/prologue/installation&lt;/a&gt;.&#10;&lt;/p&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_ide"&gt;IDE&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&#10; The best way to write Updatecli manifest(s) is by using an IDE compatible with jsonschema hosted on schemastore.org, such as Vscode, Intellij, or Neovim.&#10; The full list of compatible IDE is available on &lt;a href="https://www.schemastore.org/json/"&gt;www.schemastore.org&lt;/a&gt;.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10; For the IDE to load the correct Updatecli jsonschema, Updatecli manifest must have both a parent directory named "&lt;b&gt;updatecli.d&lt;/b&gt;" and one of the file extension "&lt;b&gt;.yaml&lt;/b&gt;", or "&lt;b&gt;.yml&lt;/b&gt;".&#10; This provides auto-completion and validation out of the box.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10; For example, from VScode, typing [ctrl][space] should display a box with various suggestions&#10;&lt;/p&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_npm_2"&gt;npm&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;npm is a package manager for the Javascript programming language.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_github_pat"&gt;GitHub PAT&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;The GitHub Personal Access Token is the token used to interact with the GitHub API&#10;&lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;Documentation&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_pipeline"&gt;Pipeline&lt;/h3&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_description"&gt;Description&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Updatecli relies on one or more pipeline manifests to describe the expected update pipeline.&#10;In this guide, we use the four following components&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="olist arabic"&gt;&#10;&lt;ol class="arabic"&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;A source of kind &lt;code&gt;npm&lt;/code&gt; to monitor the npm dependency&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;A target of kind &lt;code&gt;shell&lt;/code&gt; to run a command for updating both the &amp;#39;package-lock.json&amp;#39; and &amp;#39;package.json&amp;#39;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;An scm of kind &lt;code&gt;github&lt;/code&gt;, referenced by the target through &lt;code&gt;scmid: default&lt;/code&gt;, so the update happens on a clone of the repository&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;An action of kind &lt;code&gt;github/pullrequest&lt;/code&gt;, bound to the same scm, to submit the change&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;The project we update holds the two files npm keeps in sync:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;package.json&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-json" data-lang="json"&gt;{&#10; &amp;#34;name&amp;#34;: &amp;#34;guide-npm&amp;#34;,&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,&#10; &amp;#34;description&amp;#34;: &amp;#34;An Updatecli guide for npm project&amp;#34;,&#10; &amp;#34;author&amp;#34;: &amp;#34;Olivier Vernin&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;axios&amp;#34;: &amp;#34;^1.20.0&amp;#34;&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;details&gt;&#10;&lt;summary class="title"&gt;package-lock.json&lt;/summary&gt;&#10;&lt;div class="content"&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-json" data-lang="json"&gt;{&#10; &amp;#34;name&amp;#34;: &amp;#34;guide-npm&amp;#34;,&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,&#10; &amp;#34;lockfileVersion&amp;#34;: 3,&#10; &amp;#34;requires&amp;#34;: true,&#10; &amp;#34;packages&amp;#34;: {&#10; &amp;#34;&amp;#34;: {&#10; &amp;#34;name&amp;#34;: &amp;#34;guide-npm&amp;#34;,&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;axios&amp;#34;: &amp;#34;^1.20.0&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/agent-base&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;6.0.2&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-RZNwNclF7&amp;#43;MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx&amp;#43;4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;debug&amp;#34;: &amp;#34;4&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 6.0.0&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/asynckit&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;0.4.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk&amp;#43;bshkj0S5cfHcgYakreBjrHwatXKbz&amp;#43;IoIdYLxrKim2MjW0Q==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;&#10; },&#10; &amp;#34;node_modules/axios&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.20.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/axios/-/axios-1.20.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;follow-redirects&amp;#34;: &amp;#34;^1.16.0&amp;#34;,&#10; &amp;#34;form-data&amp;#34;: &amp;#34;^4.0.6&amp;#34;,&#10; &amp;#34;https-proxy-agent&amp;#34;: &amp;#34;^5.0.1&amp;#34;,&#10; &amp;#34;proxy-from-env&amp;#34;: &amp;#34;^2.1.0&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/call-bind-apply-helpers&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.2&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;es-errors&amp;#34;: &amp;#34;^1.3.0&amp;#34;,&#10; &amp;#34;function-bind&amp;#34;: &amp;#34;^1.1.2&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/combined-stream&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.8&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq&amp;#43;2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/&amp;#43;5cdoEdg==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;delayed-stream&amp;#34;: &amp;#34;~1.0.0&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.8&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/debug&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;4.4.3&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/debug/-/debug-4.4.3.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-RGwwWnwQvkVfavKVt22FGLw&amp;#43;xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;ms&amp;#34;: &amp;#34;^2.1.3&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;=6.0&amp;#34;&#10; },&#10; &amp;#34;peerDependenciesMeta&amp;#34;: {&#10; &amp;#34;supports-color&amp;#34;: {&#10; &amp;#34;optional&amp;#34;: true&#10; }&#10; }&#10; },&#10; &amp;#34;node_modules/delayed-stream&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;=0.4.0&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/dunder-proto&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.1&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct&amp;#43;A==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;call-bind-apply-helpers&amp;#34;: &amp;#34;^1.0.1&amp;#34;,&#10; &amp;#34;es-errors&amp;#34;: &amp;#34;^1.3.0&amp;#34;,&#10; &amp;#34;gopd&amp;#34;: &amp;#34;^1.2.0&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/es-define-property&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.1&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF&amp;#43;LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/es-errors&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.3.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j&amp;#43;hAmMzIlypy4xcBg1vKVnx89Wy0GbS&amp;#43;kf5cwCVFFzdCFh2XSCFNULS6csw==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/es-object-atoms&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.1.2&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;es-errors&amp;#34;: &amp;#34;^1.3.0&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/es-set-tostringtag&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;2.1.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-j6vWzfrGVfyXxge&amp;#43;O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ&amp;#43;/&amp;#43;tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;es-errors&amp;#34;: &amp;#34;^1.3.0&amp;#34;,&#10; &amp;#34;get-intrinsic&amp;#34;: &amp;#34;^1.2.6&amp;#34;,&#10; &amp;#34;has-tostringtag&amp;#34;: &amp;#34;^1.0.2&amp;#34;,&#10; &amp;#34;hasown&amp;#34;: &amp;#34;^2.0.2&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/follow-redirects&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.16.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce&amp;#43;g3zG97&amp;#43;JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==&amp;#34;,&#10; &amp;#34;funding&amp;#34;: [&#10; {&#10; &amp;#34;type&amp;#34;: &amp;#34;individual&amp;#34;,&#10; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/sponsors/RubenVerborgh&amp;#34;&#10; }&#10; ],&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;=4.0&amp;#34;&#10; },&#10; &amp;#34;peerDependenciesMeta&amp;#34;: {&#10; &amp;#34;debug&amp;#34;: {&#10; &amp;#34;optional&amp;#34;: true&#10; }&#10; }&#10; },&#10; &amp;#34;node_modules/form-data&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;4.0.6&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-vKatAh4SlVfgbv&amp;#43;YtmhiRjhEMJsYpsG1Y2rMQtR&amp;#43;SVSbytsSD1YGzDIcrAJmdFec88u/&amp;#43;VoGmxnl&amp;#43;80gL1tRCQ==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;asynckit&amp;#34;: &amp;#34;^0.4.0&amp;#34;,&#10; &amp;#34;combined-stream&amp;#34;: &amp;#34;^1.0.8&amp;#34;,&#10; &amp;#34;es-set-tostringtag&amp;#34;: &amp;#34;^2.1.0&amp;#34;,&#10; &amp;#34;hasown&amp;#34;: &amp;#34;^2.0.4&amp;#34;,&#10; &amp;#34;mime-types&amp;#34;: &amp;#34;^2.1.35&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 6&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/function-bind&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.1.2&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr&amp;#43;oVO0F744iUgR82nJMfG2SA==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;funding&amp;#34;: {&#10; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/sponsors/ljharb&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/get-intrinsic&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.3.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-9fSjSaos/fRIVIp&amp;#43;xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;call-bind-apply-helpers&amp;#34;: &amp;#34;^1.0.2&amp;#34;,&#10; &amp;#34;es-define-property&amp;#34;: &amp;#34;^1.0.1&amp;#34;,&#10; &amp;#34;es-errors&amp;#34;: &amp;#34;^1.3.0&amp;#34;,&#10; &amp;#34;es-object-atoms&amp;#34;: &amp;#34;^1.1.1&amp;#34;,&#10; &amp;#34;function-bind&amp;#34;: &amp;#34;^1.1.2&amp;#34;,&#10; &amp;#34;get-proto&amp;#34;: &amp;#34;^1.0.1&amp;#34;,&#10; &amp;#34;gopd&amp;#34;: &amp;#34;^1.2.0&amp;#34;,&#10; &amp;#34;has-symbols&amp;#34;: &amp;#34;^1.1.0&amp;#34;,&#10; &amp;#34;hasown&amp;#34;: &amp;#34;^2.0.2&amp;#34;,&#10; &amp;#34;math-intrinsics&amp;#34;: &amp;#34;^1.1.0&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; },&#10; &amp;#34;funding&amp;#34;: {&#10; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/sponsors/ljharb&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/get-proto&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.1&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/&amp;#43;l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;dunder-proto&amp;#34;: &amp;#34;^1.0.1&amp;#34;,&#10; &amp;#34;es-object-atoms&amp;#34;: &amp;#34;^1.0.0&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/gopd&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.2.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx&amp;#43;BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; },&#10; &amp;#34;funding&amp;#34;: {&#10; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/sponsors/ljharb&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/has-symbols&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.1.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h&amp;#43;eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; },&#10; &amp;#34;funding&amp;#34;: {&#10; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/sponsors/ljharb&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/has-tostringtag&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.0.2&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo&amp;#43;ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;has-symbols&amp;#34;: &amp;#34;^1.0.3&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; },&#10; &amp;#34;funding&amp;#34;: {&#10; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/sponsors/ljharb&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/hasown&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;2.0.4&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-T2UbfbBEF32wiepXIsMlTW9&amp;#43;dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP&amp;#43;zk2mXsoMA/i/7qV6LKut1t1A==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;function-bind&amp;#34;: &amp;#34;^1.1.2&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/https-proxy-agent&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;5.0.1&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-dFcAjpTQFgoLMzC2VwU&amp;#43;C/CbS7uRL0lWmxDITmqm7C&amp;#43;7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;agent-base&amp;#34;: &amp;#34;6&amp;#34;,&#10; &amp;#34;debug&amp;#34;: &amp;#34;4&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 6&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/math-intrinsics&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.1.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B&amp;#43;ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.4&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/mime-db&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;1.52.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE&amp;#43;1ETVlOoK1UC2nU3gYvg==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.6&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/mime-types&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;2.1.35&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-ZDY&amp;#43;bPm5zTTF&amp;#43;YpCrAU9nK0UgICYPT0QtT1NZWFv4s&amp;#43;&amp;#43;TNkcgVaT0g6&amp;#43;4R2uI4MjQjzysHB1zxuWL50hzaeXiw==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;dependencies&amp;#34;: {&#10; &amp;#34;mime-db&amp;#34;: &amp;#34;1.52.0&amp;#34;&#10; },&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;= 0.6&amp;#34;&#10; }&#10; },&#10; &amp;#34;node_modules/ms&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;2.1.3&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/ms/-/ms-2.1.3.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;&#10; },&#10; &amp;#34;node_modules/proxy-from-env&amp;#34;: {&#10; &amp;#34;version&amp;#34;: &amp;#34;2.1.0&amp;#34;,&#10; &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz&amp;#34;,&#10; &amp;#34;integrity&amp;#34;: &amp;#34;sha512-cJ&amp;#43;oHTW1VAEa8cJslgmUZrc&amp;#43;sjRKgAKl3Zyse6&amp;#43;PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==&amp;#34;,&#10; &amp;#34;license&amp;#34;: &amp;#34;MIT&amp;#34;,&#10; &amp;#34;engines&amp;#34;: {&#10; &amp;#34;node&amp;#34;: &amp;#34;&amp;gt;=10&amp;#34;&#10; }&#10; }&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_manifest"&gt;Manifest&lt;/h4&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;updatecli.d/manifest.yaml&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;name: npm manifest guide&#10;&#10;sources:&#10; npm:&#10; name: Get latest axios version&#10; kind: npm&#10; spec:&#10; name: axios&#10; versionfilter:&#10; kind: semver&#10; pattern: ^1.0.0&#10;&#10;targets:&#10; npm:&#10; name: Ensure package.json and package-lock.json are up to date&#10; kind: shell&#10;&#10; # The default behavior for a target is to have one of its spec fields defaulting to the source resource output.&#10; #&#10; # More specifically for a resource of kind &amp;#34;shell&amp;#34;, updatecli would append the value after the command such as&#10; # `npm install --package-lock-only --dry-run=$DRY_RUN axios@ 1.0.0`&#10; # Please note the space between axios@ and 1.0.0&#10; #&#10; # In this context, it doesn&amp;#39;t work as the npm command requires axios@1.0.0 to be attached without a space&#10; #&#10; # Therefore we disable the default source output by using the parameter &amp;#34;disablesourceinput: true&amp;#34;&#10; # And then we use the Updatecli specific templating function {{ source &amp;#34;&amp;lt;sourceID&amp;gt;&amp;#34; }}&#10; disablesourceinput: true&#10;&#10; # scmid binds a target with a scm configuration.&#10; # Updatecli clones the git repository in a temporary location, then updates it&#10; # according to the current declarative pipeline.&#10; scmid: default&#10;&#10; # Spec contains the specific parameter for a specific kind of resource which in this case is the &amp;#34;shell&amp;#34; resource&#10; spec:&#10;&#10; # The DRY_RUN environment variable is set and used by Updatecli to identify:&#10; # 1. If we are in &amp;#34;dry-run&amp;#34; mode by running `updatecli pipeline diff --config manifest.yaml`&#10; # 2. If we are in &amp;#34;apply&amp;#34; mode by running `updatecli pipeline apply --config manifest.yaml`&#10; command: npm install --package-lock-only --dry-run=$DRY_RUN axios@{{ source &amp;#34;npm&amp;#34; }}&#10;&#10; # By default, shell command only have access to the DRY_RUN environment variable.&#10; # But in this situation, we would also need the PATH value to identify where the npm command is located.&#10; #&#10; # As the PATH environment value is not defined it inherits its value from the Updatecli process.&#10; environments:&#10; - name: PATH&#10;&#10; # changedif defines how Updatecli should interpret a failure or a change.&#10; # In this case we use the &amp;#34;file/checksum&amp;#34; changedif kind.&#10; # A filechecksum change would report a change.&#10; changedif:&#10; kind: file/checksum&#10; spec:&#10; files:&#10; - package-lock.json&#10; - package.json&#10;&#10; # npm expects to run the command from the directory containing the package.json&#10; # workdir allows to specify the path where to run the command.&#10; # If the resource has a scmid, then the workdir relative path is from the cloned scm directory&#10; # in the temporary directory such as /tmp/updatecli on POSIX system.&#10; workdir: &amp;#34;assets/code_example/docs/guides/npm/&amp;#34;&#10;&#10;# scms defines the git repository configuration used by the target and the action.&#10;# Updatecli will clone that repository in the OS temporary location such as /tmp on Darwin or Linux system.&#10;scms:&#10; default:&#10; kind: github&#10; spec:&#10; owner: updatecli&#10; repository: website&#10; # To handle secrets, Updatecli can either use environment variable or sops secrets.&#10; # When executed from GitHub Action, using GITHUB_TOKEN and GITHUB_ACTOR is quite convenient.&#10; token: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_TOKEN&amp;#34; }}&amp;#39;&#10; username: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_ACTOR&amp;#34; }}&amp;#39;&#10; branch: master&#10;&#10;# actions are actions to execute if the state of a binded target is changed.&#10;# Ex: opening a pullrequest.&#10;actions:&#10; default:&#10; # The github/pullrequest means Updatecli will create a temporary branch containing all the changes&#10; # generated by the different targets using the same scmid.&#10; #&#10; # Then if there is a change, it will opens a pull request targeting the scm branch referenced by scmid.&#10; kind: github/pullrequest&#10; scmid: default&#10; spec:&#10; labels:&#10; - dependencies&#10; merge:&#10; strategy: auto&#10; usetitleforautomerge: true&#10; mergemethod: squash&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Then you can run:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-shell" data-lang="shell"&gt;export UPDATECLI_GITHUB_TOKEN=&amp;lt;your_PAT&amp;gt;&#10;export UPDATECLI_GITHUB_ACTOR=&amp;lt;your GH username&amp;gt;&#10;updatecli pipeline diff --config updatecli.d/manifest.yaml&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_going_further"&gt;Going further&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Once you’re happy with the Update pipeline, you can use your CI environment to run it regularly.&#10;You’ll need updatecli installed in your CI environment, and the right credentials.&#10;More information &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/automate/github_action/"&gt;in the corresponding GitHub Action documentation&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;This guide demonstrated a simple update pipeline, but real-world situations usually require either updating all dependencies specified in a package.json, or updating additional resources such as documentation, CI environment, etc.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;For updating all dependencies from a package.json at once, you do not need to write a manifest at all.&#10;The npm crawler is enabled by default, so running &lt;code&gt;updatecli pipeline diff&lt;/code&gt; from a repository containing a &lt;code&gt;package.json&lt;/code&gt; discovers the dependencies and generates the pipeline for you.&#10;It also refreshes &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;yarn.lock&lt;/code&gt; when the matching package manager is available.&#10;The &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/autodiscovery/npm/"&gt;&amp;#34;npm autodiscovery&amp;#34; page&lt;/a&gt; covers what it detects and how to tune it.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;In the situation of a more tailored update scenario, you may need to extend the current pipeline using additional resources such as:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;&#10;Adding a target of kind &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/resource/dockerfile/"&gt;&lt;code&gt;dockerfile&lt;/code&gt;&lt;/a&gt;, updatecli could update the npm dependency used within a Dockerfile as part of the same operation.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;strong&gt;Yaml&lt;/strong&gt;&#10;Adding a target of kind &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/resource/yaml/"&gt;&lt;code&gt;yaml&lt;/code&gt;&lt;/a&gt;, updatecli could also update the npm dependency used in any yaml as part of the same operation.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Feel free to chat on the Updatecli &lt;a href="https://matrix.to/#/#Updatecli_community:gitter.im"&gt;Matrix&lt;/a&gt; channel.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Guide: helm chart</title><link>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/helm-chart/</link><pubDate>Sun, 27 Feb 2022 22:10:01 +0200</pubDate><guid>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/helm-chart/</guid><description>&lt;div class="sect1"&gt;&#10;&lt;h2 id="_helm_chart"&gt;Helm Chart&lt;/h2&gt;&#10;&lt;div class="sectionbody"&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Helm is a popular package manager for deploying applications on Kubernetes.&#10;But, those packages can be outdated quickly.&#10;In this guide we explore how we can automatically update Helm charts based on third-party dependencies.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_requirement"&gt;Requirement&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;To use this guide, we need the following elements:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="olist arabic"&gt;&#10;&lt;ol class="arabic"&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Updatecli&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;A Helm chart to update&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;A GitHub Personal Access Token&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_updatecli"&gt;Updatecli&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&#10;Updatecli is a declarative dependency management tool. The application is available as a command line compatible with Linux/macOS/Windows. Updatecli is designed to work the same way, both from a local machine and a CI environment.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;It can easily be installed using Homebrew by running the two following commands:&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;-&gt; &lt;code&gt;brew tap updatecli/updatecli&lt;/code&gt;&lt;/br&gt;&#10;-&gt; &lt;code&gt;brew install updatecli&lt;/code&gt;&lt;/br&gt;&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10;Additional installation instructions are available at &lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/prologue/installation/"&gt;www.updatecli.io/docs/prologue/installation&lt;/a&gt;.&#10;&lt;/p&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_ide"&gt;IDE&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&#10; The best way to write Updatecli manifest(s) is by using an IDE compatible with jsonschema hosted on schemastore.org, such as Vscode, Intellij, or Neovim.&#10; The full list of compatible IDE is available on &lt;a href="https://www.schemastore.org/json/"&gt;www.schemastore.org&lt;/a&gt;.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10; For the IDE to load the correct Updatecli jsonschema, Updatecli manifest must have both a parent directory named "&lt;b&gt;updatecli.d&lt;/b&gt;" and one of the file extension "&lt;b&gt;.yaml&lt;/b&gt;", or "&lt;b&gt;.yml&lt;/b&gt;".&#10; This provides auto-completion and validation out of the box.&#10;&lt;/p&gt;&#10;&#10;&lt;p&gt;&#10; For example, from VScode, typing [ctrl][space] should display a box with various suggestions&#10;&lt;/p&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_helm_chart_to_update"&gt;Helm chart to update&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Within this example, we’ll use a Helm chart from the Jenkins infrastructure project located on &lt;a href="https://github.com/jenkins-infra/helm-charts"&gt;github.com/jenkins-infra/helm-charts&lt;/a&gt;.&#10;We want to check that the Helm chart is always using the latest chart application which, in this case, is the jenkins-wiki-exporter.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_github_personal_access_token"&gt;GitHub Personal Access Token&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;As we’re going to interact with GitHub repository and GitHub packages, we need a personal access token.&#10;More information on the GitHub documentation &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;creating-a-personal-access-token&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_pipeline"&gt;Pipeline&lt;/h3&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_manifest"&gt;Manifest&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Updatecli expects one or more pipeline manifests to know what to do.&#10;We use the command &lt;code&gt;updatecli pipeline diff --config updatecli.yaml&lt;/code&gt; to load the manifest.&#10;The &lt;code&gt;diff&lt;/code&gt; allows us to run updatecli in dry-mode, identifying what updatecli would change. Then we execute &lt;code&gt;updatecli pipeline apply --config updatecli.yaml&lt;/code&gt; to apply our updatecli pipeline.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;As you’ll see in our updatecli manifest, we define:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="olist arabic"&gt;&#10;&lt;ol class="arabic"&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;One &amp;#34;source&amp;#34; of kind &amp;#34;githubrelease&amp;#34; which describes where to retrieve the latest version of our application, jenkins-wiki-exporter, published on GitHub Release.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Two &amp;#34;conditions&amp;#34; which need to be satisfied before updating our Helm chart.&#10;The first one, &amp;#34;DockerImagePublished&amp;#34; of kind &amp;#34;dockerimage&amp;#34;, ensures that a Docker image &amp;#34;jenkinsciinfra/jenkins-wiki-exporter&amp;#34; exists on DockerHub where the tag is the same as the source output, the latest jenkins-wiki-exporter version.&#10;The second one, &amp;#34;DockerContainerUsed&amp;#34; of kind &amp;#34;yaml&amp;#34;, ensures that our Helm chart uses the right container name, &amp;#34;jenkinsciinfra/jenkins-wiki-exporter&amp;#34;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;A &amp;#34;target&amp;#34; of kind &amp;#34;helmchart&amp;#34;, with a chart name &amp;#34;charts/jenkins-wiki-exporter&amp;#34; and a file &amp;#34;values.yaml&amp;#34; where the key &amp;#34;image.tag&amp;#34; is set to the latest jenkins-wiki-exporter version.&#10;If it’s not the case then bump the patch version of the chart, as requested by &lt;code&gt;versionincrement: &amp;#34;patch&amp;#34;&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;An &amp;#34;scms&amp;#34; entry of kind &amp;#34;github&amp;#34;, that describes which GitHub repository stores the Helm chart &amp;#34;code&amp;#34;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;An &amp;#34;actions&amp;#34; entry of kind &amp;#34;github/pullrequest&amp;#34;, that describes pull request parameters such as the labels assigned to the pull request created by updatecli, and the auto-merge strategy.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="title"&gt;updatecli.yaml&lt;/div&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;name: &amp;#34;Bump `jenkins-wiki-exporter` docker image and helm chart versions&amp;#34;&#10;&#10;sources:&#10; jenkins-wiki-exporter:&#10; kind: &amp;#34;githubrelease&amp;#34;&#10; name: &amp;#34;Get jenkins-infra/jenkins-wiki-exporter latest version&amp;#34;&#10; spec:&#10; owner: &amp;#34;jenkins-infra&amp;#34;&#10; repository: &amp;#34;jenkins-wiki-exporter&amp;#34;&#10; token: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_TOKEN&amp;#34; }}&amp;#39;&#10; username: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_ACTOR&amp;#34; }}&amp;#39;&#10; # Added to take care of &amp;#34;v&amp;#34; prefix in version until the chart is updated to use the semver versioning (which doesn&amp;#39;t have the &amp;#34;v&amp;#34; prefix)&#10; versionfilter:&#10; kind: &amp;#34;latest&amp;#34;&#10;&#10;conditions:&#10; DockerImagePublished:&#10; name: &amp;#34;Test jenkinsciinfra/jenkins-wiki-exporter:&amp;lt;latest_version&amp;gt; docker image tag&amp;#34;&#10; kind: &amp;#34;dockerimage&amp;#34;&#10; sourceid: &amp;#34;jenkins-wiki-exporter&amp;#34;&#10; spec:&#10; image: &amp;#34;jenkinsciinfra/jenkins-wiki-exporter&amp;#34;&#10; architecture: &amp;#34;amd64&amp;#34;&#10; # tag retrieved from source output &amp;#34;jenkinswikiexporter&amp;#34;&#10; DockerContainerUsed:&#10; name: &amp;#34;Test jenkinsciinfra/jenkins-wiki-exporter:&amp;lt;latest_version&amp;gt; docker image tag&amp;#34;&#10; kind: &amp;#34;yaml&amp;#34;&#10; disablesourceinput: true&#10; scmid: &amp;#34;helm-charts&amp;#34;&#10; spec:&#10; file: &amp;#34;charts/jenkins-wiki-exporter/values.yaml&amp;#34;&#10; value: &amp;#34;jenkinsciinfra/jenkins-wiki-exporter&amp;#34;&#10; key: &amp;#34;image.repository&amp;#34;&#10;targets:&#10; jenkins-wiki-exporter:&#10; name: &amp;#34;Update jenkins-wiki-exporter helm chart&amp;#34;&#10; kind: &amp;#34;helmchart&amp;#34;&#10; spec:&#10; name: &amp;#34;charts/jenkins-wiki-exporter&amp;#34;&#10; file: &amp;#34;values.yaml&amp;#34;&#10; key: &amp;#34;image.tag&amp;#34;&#10; versionincrement: &amp;#34;patch&amp;#34;&#10; scmid: &amp;#34;helm-charts&amp;#34;&#10; sourceid: &amp;#34;jenkins-wiki-exporter&amp;#34;&#10;&#10;scms:&#10; helm-charts:&#10; kind: &amp;#34;github&amp;#34;&#10; spec:&#10; branch: &amp;#34;main&amp;#34;&#10; user: &amp;#34;updatecli-robot&amp;#34;&#10; email: &amp;#34;bot@updatecli.io&amp;#34;&#10; owner: &amp;#34;jenkins-infra&amp;#34;&#10; repository: &amp;#34;helm-charts&amp;#34;&#10; token: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_TOKEN&amp;#34; }}&amp;#39;&#10; username: &amp;#39;{{ requiredEnv &amp;#34;GITHUB_ACTOR&amp;#34; }}&amp;#39;&#10;&#10;actions:&#10; default:&#10; kind: &amp;#34;github/pullrequest&amp;#34;&#10; scmid: &amp;#34;helm-charts&amp;#34;&#10; spec:&#10; merge:&#10; strategy: auto&#10; labels:&#10; - &amp;#34;dependencies&amp;#34;&#10; - &amp;#34;jenkins-wiki-exporter&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Now we run our updatecli pipeline using the following commands:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-shell" data-lang="shell"&gt;export UPDATECLI_GITHUB_TOKEN=xxx&#10;export UPDATECLI_GITHUB_ACTOR=yyy&#10;updatecli pipeline diff --config updatecli.yaml&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="admonitionblock warning"&gt;&#10;&lt;table&gt;&#10;&lt;tbody&gt;&lt;tr&gt;&#10;&lt;td class="icon"&gt;&#10;&lt;div class="title"&gt;Warning&lt;/div&gt;&#10;&lt;/td&gt;&#10;&lt;td class="content"&gt;&#10;Using environment variables to store credentials is convenient for running updatecli from a CI environment.&#10;Another option is to use &lt;a href="https://github.com/mozilla/sops"&gt;sops&lt;/a&gt; but in either case, you should not leave your credentials unprotected.&#10;&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;strong&gt;Spoiler Alert&lt;/strong&gt;: Command output&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="listingblock"&gt;&#10;&lt;div class="content"&gt;&#10;&lt;pre class="highlight"&gt;&lt;code class="language-text" data-lang="text"&gt;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&#10;&amp;#43; PREPARE &amp;#43;&#10;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&#10;&#10;Loading Pipeline &amp;#34;assets/code_example/doc/guides/helm-chart/updatecli.yaml&amp;#34;&#10;Repository retrieved: 1&#10;&#10;&#10;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&#10;&amp;#43; PIPELINE &amp;#43;&#10;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&amp;#43;&#10;&#10;&#10;&#10;#####################################################################&#10;# BUMP `JENKINS-WIKI-EXPORTER` DOCKER IMAGE AND HELM CHART VERSIONS #&#10;#####################################################################&#10;&#10;&#10;SOURCES&#10;=======&#10;&#10;jenkins-wiki-exporter&#10;---------------------&#10;Searching for version matching pattern &amp;#34;latest&amp;#34;&#10;✔ Github Release version &amp;#34;v1.12.1&amp;#34; found matching pattern &amp;#34;latest&amp;#34;&#10;&#10;&#10;CHANGELOG:&#10;----------&#10;&#10;Release published on the 2021-10-02 18:36:27 &amp;#43;0000 UTC at the url https://github.com/jenkins-infra/jenkins-wiki-exporter/releases/tag/v1.12.1&#10;&#10;&amp;lt;!-- Optional: add a release summary here --&amp;gt;&#10;* Dont allow non pull requests in the project from breaking the report (#303) @halkeye&#10;&#10;## 📦 Dependency updates&#10;&#10;* Bump node from 16.7.0 to 16.8.0 (#288) @dependabot&#10;* Bump jest from 27.0.6 to 27.1.0 (#287) @dependabot&#10;&#10;&#10;&#10;CONDITIONS:&#10;===========&#10;&#10;DockerContainerUsed&#10;-------------------&#10;✔ Key &amp;#34;image.repository&amp;#34;, in YAML file &amp;#34;/tmp/updatecli/jenkins-infra/helm-charts/charts/jenkins-wiki-exporter/values.yaml&amp;#34;, is correctly set to &amp;#34;jenkinsciinfra/jenkins-wiki-exporter&amp;#34;&#10;&#10;DockerImagePublished&#10;--------------------&#10;^[[B✔ The Docker image registry-1.docker.io/jenkinsciinfra/jenkins-wiki-exporter:v1.12.1 exists and is available.&#10;&#10;&#10;TARGETS&#10;========&#10;&#10;jenkins-wiki-exporter&#10;---------------------&#10;&#10;**Dry Run enabled**&#10;&#10;✔ Key &amp;#39;image.tag&amp;#39;, from file &amp;#39;/tmp/updatecli/jenkins-infra/helm-charts/charts/jenkins-wiki-exporter/values.yaml&amp;#39;, already set to v1.12.1, nothing else need to be done&#10;&#10;&#10;PULL REQUESTS&#10;=============&#10;&#10;&#10;=============================&#10;&#10;REPORTS:&#10;&#10;&#10;✔ UPDATECLI.YAML:&#10;&#9;Sources:&#10;&#9;&#9;✔ [jenkins-wiki-exporter] Get jenkins-infra/jenkins-wiki-exporter latest version (kind: githubRelease)&#10;&#9;Condition:&#10;&#9;&#9;✔ [DockerContainerUsed] Test jenkinsciinfra/jenkins-wiki-exporter:&amp;lt;latest_version&amp;gt; docker image tag (kind: yaml)&#10;&#9;&#9;✔ [DockerImagePublished] Test jenkinsciinfra/jenkins-wiki-exporter:&amp;lt;latest_version&amp;gt; docker image tag (kind: dockerimage)&#10;&#9;Target:&#10;&#9;&#9;✔ [jenkins-wiki-exporter] Update jenkins-wiki-exporter helm chart (kind: helmchart)&#10;&#10;&#10;&#10;Run Summary&#10;===========&#10;Pipeline(s) run:&#10; * Changed:&#9;0&#10; * Failed:&#9;0&#10; * Skipped:&#9;0&#10; * Succeeded:&#9;1&#10; * Total:&#9;1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_go_further"&gt;Go Further&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Updatecli is used in more scenarios and with many more to come.&#10;Please reach out if you have questions.&#10;Meanwhile, here are additional resources that you can use to go further.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_resource"&gt;Resource&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;To extend this pipeline, you can find more customization on the updatecli documentation website.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;In this pipeline we used the following resources:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="ulist"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/resource/yaml/"&gt;YAML&lt;/a&gt; - the &lt;code&gt;yaml&lt;/code&gt; resource used by the second condition.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/resource/github_release/"&gt;GitHub Release&lt;/a&gt; - the &lt;code&gt;githubrelease&lt;/code&gt; source.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/resource/helm_chart/"&gt;Helm Chart&lt;/a&gt; - the &lt;code&gt;helmchart&lt;/code&gt; target.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/scm/github/"&gt;GitHub&lt;/a&gt; - the &lt;code&gt;github&lt;/code&gt; scm.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/actions/github/"&gt;GitHub Pull Request&lt;/a&gt; - the &lt;code&gt;github/pullrequest&lt;/code&gt; action.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/plugins/resource/docker_image/"&gt;Docker Image&lt;/a&gt; - the &lt;code&gt;dockerimage&lt;/code&gt; resource used by the first condition.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_additional_workflows"&gt;Additional Workflows&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Updatecli shines and saves us time in many other situations such as:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="ulist"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/docker-compose/"&gt;Docker Compose&lt;/a&gt; - keeping a &lt;code&gt;docker-compose.yaml&lt;/code&gt; on the latest image tag or digest.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/dockerfile/"&gt;Dockerfile&lt;/a&gt; - how the Jenkins project keeps its Dockerfiles on the latest JDK.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/npm/"&gt;npm&lt;/a&gt; - tracking an npm dependency and refreshing the lock file.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="sect3"&gt;&#10;&lt;h4 id="_contributing"&gt;Contributing&lt;/h4&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;As a community-oriented project, all contributions are greatly appreciated!&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Here is a non-exhaustive list of possible contributions:&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="ulist"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;⭐️ this &lt;a href="https://github.com/updatecli/updatecli"&gt;updatecli/updatecli&lt;/a&gt; repository.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Propose a new feature request.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Highlight an existing feature request with :thumbsup:.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Contribute to any repository in the &lt;a href="https://github.com/updatecli/"&gt;updatecli&lt;/a&gt; organization&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Share the love&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;More information is available at &lt;a href="https://github.com/updatecli/updatecli/blob/main/CONTRIBUTING.adoc"&gt;CONTRIBUTING&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Guide: dockerfile</title><link>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/dockerfile/</link><pubDate>Fri, 20 Sep 2024 22:10:01 +0200</pubDate><guid>https://deploy-preview-3749--amazing-golick-2d0138.netlify.app/docs/guides/dockerfile/</guid><description>&lt;div class="sect1"&gt;&#10;&lt;h2 id="_dockerfile"&gt;Dockerfile&lt;/h2&gt;&#10;&lt;div class="sectionbody"&gt;&#10;&lt;div class="sect2"&gt;&#10;&lt;h3 id="_goal"&gt;Goal&lt;/h3&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;This guide analyzes how the Jenkins project automates its Dockerfile file updates.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;It’s one thing to publish a Docker image, but it’s another one to maintain it over time.&lt;/p&gt;&#10;&lt;/div&gt;</description></item></channel></rss>