ArgoCD GitOps Updater Action
January 25, 2026 ยท View on GitHub
GitHub Action for automated Helm chart and Docker image version updates. GitOps-friendly with ArgoCD/Kustomize support, auto-discovery, semantic versioning, and notifications (Slack/Teams/Discord/Telegram)
Automatically keep your GitOps repositories up-to-date by checking for new versions of Helm charts and Docker images, creating pull requests with updates, and notifying your team.
โจ Features
- ๐ Automated Version Updates - Automatically detect and update to latest semantic versions
- ๐ฏ Variant Preservation - Keeps image variants intact (alpine โ alpine, slim โ slim)
- ๐ Auto-Discovery - Automatically find Helm charts and Docker images in your repo
- ๐ฆ Multi-Registry Support - Docker Hub, ghcr.io, quay.io, gcr.io, and more
- ๐ Performance Optimized - Concurrent async processing for fast version checks
- ๐ Rate Limit Management - Per-registry rate limiting with authentication support
- ๐ Smart Notifications - Slack, Microsoft Teams, Discord, Telegram support
- โ ๏ธ Major Version Alerts - Get notified when major version updates are available
- ๐ซ Ignore Rules - Blacklist specific images/charts or versions with regex patterns
- ๐ท๏ธ Semantic Versioning - Intelligent version comparison and updates
- ๐ GitOps Native - Works with ArgoCD Applications and Kustomize
๐ Quick Start
Basic Usage
name: Update Versions
on:
schedule:
- cron: '0 2 * * 1' # Every Monday at 2 AM
workflow_dispatch:
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
config-path: '.update-config.yaml'
create-pr: true
With Auto-Discovery
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
auto-discover: true
create-pr: true
pr-title: 'chore: update dependencies'
With Docker Hub Authentication
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
config-path: '.update-config.yaml'
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
create-pr: true
With Notifications
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
config-path: '.update-config.yaml'
create-pr: true
notification-method: slack
slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
๐ Configuration File
You can either create .update-config.yaml manually or use auto-discovery to generate it automatically.
Manual Configuration
Create .update-config.yaml in your repository:
# Helm Charts
helmCharts:
- name: prometheus
repository: https://prometheus-community.github.io/helm-charts
chartName: prometheus
# Path to the file containing the version
files:
- path: apps/monitoring/prometheus/Chart.yaml
versionKey: dependencies[0].version
- name: grafana
repository: https://grafana.github.io/helm-charts
chartName: grafana
files:
- path: apps/monitoring/grafana/kustomization.yaml
versionKey: helmCharts[0].version
# Docker Images
dockerImages:
- id: postgres-primary
repository: postgres
registry: dockerhub
currentTag: "16.1-alpine"
files:
- path: apps/database/deployment.yaml
imageKey: spec.template.spec.containers[0].image
- id: redis
repository: redis
registry: dockerhub
currentTag: "7.2-alpine"
files:
- path: apps/cache/deployment.yaml
imageKey: spec.template.spec.containers[0].image
# Ignore certain updates (optional)
ignore:
dockerImages:
# Ignore by ID
- id: postgres-primary
# Ignore by repository and tag pattern
- repository: nginx
tagPattern: "^.*-perl$" # Ignore all perl variants
helmCharts:
# Ignore by name
- name: legacy-chart
# Ignore specific version patterns
- name: prometheus
versionPattern: "^25\\." # Ignore version 25.x
Auto-Discovery (Recommended for Getting Started)
Don't want to create the config manually? Use auto-discovery:
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
auto-discover: true
create-pr: true
This will:
- Automatically scan your repository for:
- ArgoCD Applications with Helm charts
- Kustomize files with Helm chart references
- Kubernetes manifests with Docker images
- Generate
.update-config.yamlwith all discovered resources - Create a PR with the generated config
- Stop before running updates (you review and merge the config first)
After merging the auto-discovery PR, subsequent runs will use the config file for updates. You can run auto-discovery periodically to find new resources, or disable it and only use the existing config.
See Auto-Discovery Workflow for a complete example.
๐ Inputs
| Input | Description | Required | Default |
|---|---|---|---|
config-path | Path to the update configuration YAML file | No | .update-config.yaml |
auto-discover | Auto-discover resources before updating | No | false |
working-directory | Working directory for the action | No | . |
create-pr | Create a pull request with changes | No | true |
pr-title | Title for the pull request | No | chore: update Helm charts & Docker images |
pr-branch | Branch name for the pull request | No | chore/update-versions |
pr-base | Base branch for the pull request | No | main |
commit-message | Commit message for changes | No | chore: update Helm charts & Docker images |
dry-run | Run in dry-run mode without making changes | No | false |
python-version | Python version to use | No | 3.14 |
notification-method | Notification method: telegram, slack, microsoft-teams, discord, or none | No | none |
telegram-bot-token | Telegram bot token for notifications | No | - |
telegram-chat-id | Telegram chat ID for notifications | No | - |
slack-webhook-url | Slack webhook URL for notifications | No | - |
teams-webhook-url | Microsoft Teams webhook URL for notifications | No | - |
discord-webhook-url | Discord webhook URL for notifications | No | - |
dockerhub-username | Docker Hub username (increases rate limit 100โ200 req/6h) | No | - |
dockerhub-token | Docker Hub access token | No | - |
github-token | GitHub token for ghcr.io authentication | No | ${{ github.token }} |
๐ค Outputs
| Output | Description |
|---|---|
discovery-changes-detected | Whether auto-discovery found new resources (true/false) |
discovery-pr-number | Discovery pull request number (if created) |
discovery-pr-url | Discovery pull request URL (if created) |
changes-detected | Whether any version update changes were detected (true/false) |
update-report | Summary report of updates made |
pr-number | Version update pull request number (if created) |
pr-url | Version update pull request URL (if created) |
๐ง Advanced Usage
Auto-Discovery Workflow
Automatically discover all Helm charts and Docker images in your repository:
name: Discover Resources
on:
workflow_dispatch:
jobs:
discover:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
auto-discover: true
create-pr: true
pr-title: 'chore: auto-discover new resources'
This will:
- Scan your repository for ArgoCD Applications, Kustomize files, and Kubernetes manifests
- Extract Helm charts and Docker images
- Create a PR with updated
.update-config.yaml - Stop before running version updates (you review and merge first)
Dry Run Mode
Test without making changes:
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
config-path: '.update-config.yaml'
dry-run: true
Notifications with Built-in Support
Recommended: Use the action's built-in notification support for Slack, Discord, Microsoft Teams, or Telegram:
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
config-path: '.update-config.yaml'
create-pr: true
# Built-in notification support - automatically sends formatted updates
notification-method: slack
slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
Benefits of built-in notifications:
- โ Automatically formatted with update details
- โ Includes PR links, operation status, and update summary
- โ No additional workflow steps needed
- โ Consistent formatting across all notification platforms
Supported methods: slack, discord, microsoft-teams, telegram, or none
See Notification Examples section below for detailed setup instructions for each platform.
Using Outputs
- uses: drumandbytes/argocd-gitops-updater-action@v2
id: updater
with:
config-path: '.update-config.yaml'
create-pr: true
- name: Comment on issue
if: steps.updater.outputs.changes-detected == 'true'
uses: actions/github-script@v7
with:
script: |
github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'Version Updates Available',
body: `${{ steps.updater.outputs.update-report }}`
});
๐ Authentication Setup
Docker Hub (Recommended)
Increase rate limits from 100 to 200 requests per 6 hours:
- Create access token at https://hub.docker.com/settings/security
- Add to repository secrets:
DOCKERHUB_USERNAMEDOCKERHUB_TOKEN
- Use in workflow:
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
GitHub Container Registry (ghcr.io)
The action automatically uses ${{ github.token }} for ghcr.io authentication. For custom tokens:
- uses: drumandbytes/argocd-gitops-updater-action@v2
with:
github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
๐ Performance & Rate Limits
Performance Features
- Async Processing: Concurrent async requests for fast version checks
- Smart Rate Limiting: Per-registry semaphores prevent API throttling
- Docker Hub: 3 concurrent (anonymous) / 5 concurrent (authenticated)
- GHCR: 10 concurrent
- Quay/GCR: 5 concurrent each
- Helm Concurrency: 5 parallel Helm chart checks
- Typical Performance: ~40-60s for 10-15 resources
Registry Rate Limits
| Registry | Anonymous | Authenticated | Action Limits |
|---|---|---|---|
| Docker Hub | 100 req/6h | 200 req/6h | 3 concurrent (anon) / 5 (auth) |
| ghcr.io | Limited | 5,000 req/h | 10 concurrent |
| quay.io | ~100 req/min | Higher | 5 concurrent |
| gcr.io | No strict limit | - | 5 concurrent |
Tip: Authenticate with Docker Hub to increase rate limits (100โ200 req/6h) and concurrency (3โ5).
๐ฏ Supported Registries
- โ
Docker Hub (
dockerhub,docker.io) - โ
GitHub Container Registry (
ghcr.io) - โ
Quay.io (
quay.io) - โ
Google Container Registry (
gcr.io) - โ Amazon ECR (public)
- โ Custom registries with standard APIs
๐ Notification Examples
The action has built-in notification support - no need to use external notification actions! Simply configure the appropriate webhook URL and notification method in the action inputs.
All notifications automatically include:
- ๐ฆ Update completion status
- ๐ Pull request link and number
- โ๏ธ Operation type (created/updated)
- ๐ PR title
- ๐ Detailed update summary
Slack
Prerequisites: You need a Slack workspace. If you don't have one, create at https://slack.com/create
Create Incoming Webhook:
- Go to https://api.slack.com/messaging/webhooks
- Click "Create your Slack app" โ "From scratch"
- Name your app (e.g., "Version Updater") and select your workspace
- Click "Incoming Webhooks" โ Toggle "Activate Incoming Webhooks" to ON
- Click "Add New Webhook to Workspace"
- Select the channel where notifications will be posted โ Click "Allow"
- Copy the webhook URL (starts with
https://hooks.slack.com/services/...)
Add to GitHub Secrets:
- Repository Settings โ Secrets and variables โ Actions โ New repository secret
- Name:
SLACK_WEBHOOK_URL - Value: Your webhook URL
Use in workflow:
notification-method: slack
slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
Microsoft Teams
โ ๏ธ Note: Microsoft Teams support is implemented according to the official Microsoft Teams Incoming Webhook API documentation but has not been personally tested by the maintainer due to Teams Free tier limitations. The implementation follows the same pattern as other notification platforms (Slack, Discord, Telegram) which have been tested. If you encounter issues, please report them.
Prerequisites: You need Microsoft Teams with a team and channel (work/school account). Free tier may have limitations.
Create Incoming Webhook:
- Open Microsoft Teams and go to your channel (e.g., "General")
- Click "..." (three dots) next to the channel name
- Select "Workflows" or "Connectors" (depends on Teams version):
- New Teams: Search for "Incoming Webhook" โ Add โ Configure โ Copy webhook URL
- Classic Teams: Select "Incoming Webhook" โ Configure โ Name it โ Create โ Copy webhook URL
Add to GitHub Secrets:
- Repository Settings โ Secrets and variables โ Actions โ New repository secret
- Name:
TEAMS_WEBHOOK_URL - Value: Your webhook URL
Use in workflow:
notification-method: microsoft-teams
teams-webhook-url: ${{ secrets.TEAMS_WEBHOOK_URL }}
Discord
Prerequisites: You need a Discord server. If you don't have one, create at https://discord.com
Create Webhook:
- Right-click on the channel where you want notifications โ "Edit Channel"
- Go to "Integrations" โ "Webhooks"
- Click "New Webhook" or "Create Webhook"
- Give it a name (e.g., "Version Updater") and optionally upload an avatar
- Click "Copy Webhook URL"
- Click "Save Changes"
Add to GitHub Secrets:
- Repository Settings โ Secrets and variables โ Actions โ New repository secret
- Name:
DISCORD_WEBHOOK_URL - Value: Your webhook URL
Use in workflow:
notification-method: discord
discord-webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
Telegram
Create a bot:
- Open Telegram and search for
@BotFather - Send
/newbotand follow prompts to choose a name and username - Copy the bot token (looks like
123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ)
Get your chat ID:
- For personal chat: Search for
@userinfobotโ Send any message โ Copy your chat ID - For group chat: Add your bot to a group โ Add
@userinfobottemporarily โ Send a message โ Copy the group chat ID (negative number) โ Remove@userinfobot
Add to GitHub Secrets:
- Repository Settings โ Secrets and variables โ Actions โ New repository secret
- Name:
TELEGRAM_BOT_TOKEN(paste the bot token) - Name:
TELEGRAM_CHAT_ID(paste the chat ID)
Use in workflow:
notification-method: telegram
telegram-bot-token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
telegram-chat-id: ${{ secrets.TELEGRAM_CHAT_ID }}
๐ ๏ธ Troubleshooting
Rate Limit Errors (429)
Problem: Too many requests to Docker Hub
Solution:
- Add Docker Hub authentication - Doubles rate limit from 100 to 200 requests per 6 hours (see Authentication Setup)
- Reduce update frequency - Run weekly instead of daily (change
cronschedule)
Major Version Not Updating
This is by design. The action only updates within the same major version for safety. Major version updates are reported in notifications but require manual intervention.
Auto-Discovery Not Finding Resources
Check:
- Resources are in standard ArgoCD/Kustomize formats
- YAML files have correct structure
- Run with
dry-run: trueto see what's being processed
PR Creation Fails
Common causes:
- No changes detected (check with
dry-run: truefirst) - Missing permissions (add
contents: writeandpull-requests: write) - Branch already exists (configure
pr-branchwith unique name)
๐ค Contributing
Contributions welcome! See CONTRIBUTING.md for development setup, code style, and PR guidelines.
The codebase includes:
- 111 unit tests with pytest
- ruff for linting and formatting
- CI workflow for automated testing
๐ License
MIT License - see LICENSE file for details
๐ Links
โญ Show Your Support
If this action helps you, please consider giving it a star! โญ