{"id":281,"date":"2025-07-10T12:18:19","date_gmt":"2025-07-10T12:18:19","guid":{"rendered":"https:\/\/infivit.com\/blog\/?p=281"},"modified":"2025-07-14T09:57:55","modified_gmt":"2025-07-14T09:57:55","slug":"argo-cd-image-updater","status":"publish","type":"post","link":"https:\/\/infivit.com\/blog\/argo-cd-image-updater\/","title":{"rendered":"\ud83d\ude80 Accelerate Deployments with Argo CD Image Updater"},"content":{"rendered":"\n<p>In the fast-moving world of software development, <strong>continuous integration and continuous delivery (CI\/CD)<\/strong> have become essential for delivering quality features at speed. At Infivit, we recently streamlined CI\/CD pipeline for one of our client by integrating <strong>GitHub Actions<\/strong> with <strong>Argo CD Image Updater<\/strong>, resulting in a significant boost in <strong>deployment automation, developer velocity, and operational efficiency<\/strong>.<\/p>\n\n\n\n<p>In this blog, we\u2019ll walk through how this setup works\u2014and more importantly, how it helps <strong>save time, reduce manual effort<\/strong>, and <strong>accelerate feature delivery<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"462\" src=\"https:\/\/infivit.com\/blog\/wp-content\/uploads\/Screenshot-2025-07-03-170642-1-1024x462.png\" alt=\"\" class=\"wp-image-282\" srcset=\"https:\/\/infivit.com\/blog\/wp-content\/uploads\/Screenshot-2025-07-03-170642-1-1024x462.png 1024w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/Screenshot-2025-07-03-170642-1-300x135.png 300w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/Screenshot-2025-07-03-170642-1-768x347.png 768w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/Screenshot-2025-07-03-170642-1-1536x693.png 1536w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/Screenshot-2025-07-03-170642-1.png 1894w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd27 Why We Chose This Stack<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">GitHub Actions for CI<\/h4>\n\n\n\n<p>GitHub Actions allows us to run CI workflows directly from our repositories. With every code push:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test cases are run<\/li>\n\n\n\n<li>Code is linted<\/li>\n\n\n\n<li>Docker images are built and pushed to GHCR<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Argo CD for CD<\/h4>\n\n\n\n<p>Argo CD continuously syncs Kubernetes clusters with our Git repositories. It uses a <strong>GitOps model<\/strong> to ensure our clusters always reflect the state defined in Git.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Argo CD Image Updater: The Missing Link<\/strong><\/h4>\n\n\n\n<p>This tool automatically monitors image registries and <strong>updates Kubernetes manifests in Git when new image tags are available<\/strong>\u2014removing the need for manual version bumps in YAML files.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2699\ufe0f Our CI\/CD Pipeline at a Glance<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><br>A[Developer pushes code to GitHub] --&gt; B[GitHub Actions triggered]<br>B --&gt; C[Docker image built]<br>C --&gt; D[Image pushed to GHCR]<br>D --&gt; E[Argo CD Image Updater detects new tag]<br>E --&gt; F[Deployment YAML updated in Git]<br>F --&gt; G[Argo CD syncs cluster]<br>G --&gt; H[Application updated in Kubernetes]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udee0\ufe0f  Step-by-Step Setup<\/h3>\n\n\n\n<p>Now that we&#8217;ve seen how the flow works, let\u2019s walk through the step-by-step setup of the CI\/CD pipeline using GitHub Actions, Argo CD, and Argo CD Image Updater.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udc33 1. Install Docker<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>Download from: <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\" target=\"_blank\" rel=\"noopener\">https:\/\/www.docker.com\/products\/docker-desktop<\/a><\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udc19 2. GitHub Repository Setup<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>Create a GitHub repo to store:\nApplication code (e.g., Node.js app)\nKubernetes manifests (<span style=\"background-color: initial;font-family: inherit;font-size: inherit;text-align: initial;color: inherit\">deployment.yaml,service.yaml)<\/span>\nGitHub Actions workflow (<span style=\"background-color: initial;font-family: inherit;font-size: inherit;text-align: initial;color: inherit\">.github\/workflows\/deploy.yml<\/span>)<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u2638\ufe0f 3. Install &amp; Configure Kubernetes Cluster<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl-linux\/\" target=\"_blank\" rel=\"noopener\">https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl-linux\/<\/a><\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\ude80 4. Install Argo CD<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code><a href=\"https:\/\/argo-cd.readthedocs.io\/en\/stable\/operator-manual\/installation\/#installation\" target=\"_blank\" rel=\"noopener\">https:\/\/argo-cd.readthedocs.io\/en\/stable\/operator-manual\/installation\/#installation<\/a><\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd10 5. Install Argo CD Image Updater<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code><a href=\"https:\/\/argocd-image-updater.readthedocs.io\/en\/stable\/install\/installation\/\" target=\"_blank\" rel=\"noopener\">https:\/\/argocd-image-updater.readthedocs.io\/en\/stable\/install\/installation\/<\/a><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configure Git access (if using <code>write-back-method: git<\/code>)<\/li>\n\n\n\n<li>Optionally configure image registry credentials via Kubernetes secrets.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udce6 6. Configure GitHub Actions<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>Add <span style=\"background-color: initial;font-family: inherit;font-size: inherit;text-align: initial;color: inherit\">.github\/workflows\/deploy.yml<\/span>\nSet up GitHub Secrets:\n<code>GHCR_TOKEN<span style=\"background-color: initial;font-family: inherit;font-size: inherit;text-align: initial;color: inherit\">,<\/span> DOCKER_USERNAME<span style=\"background-color: initial;font-family: inherit;font-size: inherit;text-align: initial;color: inherit\">, etc<\/span><\/code><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde9 Step-by-Step Implementation<\/h3>\n\n\n\n<p><strong>1.  Set Up GitHub Actions (CI)<\/strong><\/p>\n\n\n\n<p>Create .github\/workflows\/deploy.yml:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name: CI Pipeline\n\non:\n \n push:\n    branches: &#091; main ]\n\njobs:\n  \n   build:\n       runs-on: ubuntu-latest\n       steps:\n       -  name: Checkout code\n          uses: actions\/checkout@v3\n\n    - name: Log in to GHCR\n      run: echo \"${{ secrets.GITHUB_TOKEN }}\" | docker login ghcr.io -u ${{ github.actor }} --password-stdin\n\n    - name: Build and push Docker image\n      run: |\n        docker build -t ghcr.io\/your_username\/your-app:${{ github.sha }} .\n        docker push ghcr.io\/your_username\/your-app:${{ github.sha }}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfmEhj8Oco6PiyM-4eaMmEhV_fmC0SrKcwYZ5kPxOle-PenRJs0_Ptspp44JUmTagIHvl8cqr5I-PUh5psPeasUbj_rsVfQU-NQs2pysItqLXNY1sKxv_rL6aF_BnVyLYITb-SzQw?key=2nHvfZzK_t6mz6GHv7ZkBQ\" alt=\"\" \/><\/figure>\n\n\n\n<p><strong>2.&nbsp; Configure Argo CD Application&nbsp;<\/strong><\/p>\n\n\n\n<p>Your application.yaml might look like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: my-app\nspec:\n  source:\n    repoURL: https:\/\/github.com\/your_username\/your-repo\n    targetRevision: HEAD\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: default\n  syncPolicy:\n    automated:\n      prune: true<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>3.&nbsp; Creating an Argo CD Application through GUI<\/strong><\/h5>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Step-by-Step Guide<\/strong><\/h4>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>1. \ud83d\udd10 Log in to the Argo CD Dashboard<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Login with your Argo CD admin credentials.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeYmtTA4DLtD3yXPVE0Vs3F2-Grp3nDTQlnlTEYRA1XUDQKyP7MzdM_Gp_GePolUJ8IMOAFRQQSg_U3ZygmqSixIFQu66w_zoN-_jZTjM_ZxtXFeDEX7V5IU1_2CxXNXL772u9blw?key=2nHvfZzK_t6mz6GHv7ZkBQ\" alt=\"\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>2. \u2795 Click on \u201cNEW APP\u201d<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On the top-right corner, click the <strong>\u201c+ NEW APP\u201d<\/strong> button to create a new application.<img decoding=\"async\" width=\"624\" height=\"279\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeIbBHWN_XibwxwHtT-nhd4XbQZIfJES9Ypvz2vp2XOGJIkfzJl0LuTYsYIngTWPrLiDJTva9_MURV3DeO9b9_wFNo6EaKlWbf-38BHDjs9pyxajiX3CdNw1HiZXPVu0Ag3fGkH?key=2nHvfZzK_t6mz6GHv7ZkBQ\"><\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>3. \ud83d\udcdd Fill Out Application Info<\/strong><\/h5>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Field<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><tr><td><strong>Application Name<\/strong><\/td><td>Name of your app, e.g., grade-submission-api<\/td><\/tr><tr><td><strong>Project<\/strong><\/td><td>Leave as default (or select your project)<\/td><\/tr><tr><td><strong>Sync Policy<\/strong><\/td><td>Choose automatic or manual (you can enable self-heal\/prune later)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>4. \ud83d\udcc1 Define Source Repository<\/strong><\/h5>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Field<\/strong><\/td><td><strong>Example<\/strong><\/td><\/tr><tr><td><strong>Repository URL<\/strong><\/td><td>https:\/\/github.com\/your_username\/your-repo.git<\/td><\/tr><tr><td><strong>Revision<\/strong><\/td><td>HEAD or a branch name (e.g., main)<\/td><\/tr><tr><td><strong>Path<\/strong><\/td><td>. or path to your Kubernetes manifests (e.g., manifests\/)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>5. \u2638\ufe0f Configure the Destination<\/strong><\/h5>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Field<\/strong><\/td><td><strong>Value<\/strong><\/td><\/tr><tr><td><strong>Cluster URL<\/strong><\/td><td>https:\/\/kubernetes.default.svc (for in-cluster)<\/td><\/tr><tr><td><strong>Namespace<\/strong><\/td><td>e.g., default or production<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>6. \u2705 Create and Sync<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click <strong>\u201cCreate\u201d<\/strong> to finish.<\/li>\n\n\n\n<li>Once created, click <strong>\u201cSYNC\u201d<\/strong> to deploy the app to your Kubernetes cluster.<\/li>\n\n\n\n<li>You\u2019ll see real-time status like Synced, Healthy, OutOfSync, etc<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>4. \ud83d\udd04 Configure Argo CD Image Updater<\/strong><\/h4>\n\n\n\n<p>Add these annotations to your deployment YAML:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>metadata:\n\n&nbsp;annotations:\n\n&nbsp;&nbsp;&nbsp;argocd-image-updater.argoproj.io\/image-list: ghcr.io\/your_username\/your-app\n\n&nbsp;&nbsp;&nbsp;argocd-image-updater.argoproj.io\/write-back-method: git\n\n&nbsp;&nbsp;&nbsp;argocd-image-updater.argoproj.io\/your_username_your-app.update-strategy: latest<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"503\" src=\"https:\/\/infivit.com\/blog\/wp-content\/uploads\/image-6-1024x503.png\" alt=\"\" class=\"wp-image-287\" srcset=\"https:\/\/infivit.com\/blog\/wp-content\/uploads\/image-6-1024x503.png 1024w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/image-6-300x147.png 300w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/image-6-768x377.png 768w, https:\/\/infivit.com\/blog\/wp-content\/uploads\/image-6.png 1431w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u2705 Now, Image Updater will:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detect a new image pushed to<br><\/li>\n\n\n\n<li>Commit a change to your deployment YAML with the new image tag<br><\/li>\n\n\n\n<li>Argo CD auto-syncs and deploys it to your cluster<br><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe3GBDW3mFpIkVgkn-N3oez-d16Wr96lc2q5Am1g_asy7XxydRcpGZ59L6fbXzRtYQvejYKNZ1pDuur_0SpfnHqNDLxJdYb9JFbKr-SyfVx9BG1chMm-eU4wUcmf2hUQH0QRiFH?key=2nHvfZzK_t6mz6GHv7ZkBQ\" alt=\"\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>\u2705 Final Result<\/strong><\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Dev pushes code to GitHub<br><\/li>\n\n\n\n<li>GitHub Actions builds &amp; pushes a Docker image<br><\/li>\n\n\n\n<li>Argo CD Image Updater detects the new image<br><\/li>\n\n\n\n<li>Updates deployment manifest in Git<br><\/li>\n\n\n\n<li>Argo CD syncs and deploys it to Kubernetes<br><\/li>\n\n\n\n<li>Your app is automatically updated!<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>In the fast-moving world of software development, continuous integration and continuous delivery (CI\/CD) have become essential for delivering quality features at speed. At Infivit, we recently streamlined CI\/CD pipeline for one of our client by integrating GitHub Actions with Argo CD Image Updater, resulting in a significant boost in deployment automation, developer velocity, and operational &#8230; <a title=\"\ud83d\ude80 Accelerate Deployments with Argo CD Image Updater\" class=\"read-more\" href=\"https:\/\/infivit.com\/blog\/argo-cd-image-updater\/\" aria-label=\"Read more about \ud83d\ude80 Accelerate Deployments with Argo CD Image Updater\">Read more<\/a><\/p>\n","protected":false},"author":8,"featured_media":290,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[16,17,15,18,19],"class_list":["post-281","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd","tag-argo","tag-argocd","tag-ci-cd","tag-gitops","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/posts\/281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/comments?post=281"}],"version-history":[{"count":7,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/posts\/281\/revisions"}],"predecessor-version":[{"id":296,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/posts\/281\/revisions\/296"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/media\/290"}],"wp:attachment":[{"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/media?parent=281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/categories?post=281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infivit.com\/blog\/wp-json\/wp\/v2\/tags?post=281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}