A GitHub Action to update Helm dependencies of a given chart.
The action is nothing but a Python wrapper that iterates over every dependency in a Chart.yaml
to generate a manifest.yaml
that is then used by Updatecli to perform the upgrade of the dependencies.
Inputs | Description | Required | Default |
---|---|---|---|
|
Path to the Helm chart folder. |
Yes |
|
|
Path to a README.adoc with AsciiDoc attributes in the format |
No |
|
|
Upgrade strategy to use. Valid values are |
No |
|
|
Comma-separated list of dependencies to exclude from the update. |
No |
|
|
Run the action in dry-run mode to check possible updates but do not perform any update. |
No |
|
Outputs | Description |
---|---|
|
String containing the update type that was effectively performed. Outputs one of the following values: |
Below you will find a sample workflow that uses this action.
---
name: "chart-update"
on:
schedule:
- cron: "0 7 * * 1-5"
workflow_dispatch:
inputs:
update-strategy:
description: "Update strategy to use. Valid values are 'patch', 'minor' or 'major'"
type: choice
options:
- "patch"
- "minor"
- "major"
required: true
excluded-dependencies:
description: "Comma-separated list of dependencies to exclude from the update (i.e. 'dependency1,dependency2,dependency3')"
type: string
required: false
default: ""
dry-run:
description: "Activate dry-run mode"
type: boolean
required: false
default: true
# Define global settings for all the steps.
env:
author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
jobs:
chart-update-schedule:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'schedule' }}
strategy:
matrix:
update-strategy: ["minor", "major"]
steps:
- name: "Check out the repository"
uses: actions/checkout@v4
- name: "Upgrade Helm chart dependencies"
id: deps-update
uses: camptocamp/[email protected]
with:
chart-path: "charts/argocd"
readme-path: "README.adoc"
update-strategy: "${{ matrix.update-strategy }}"
- name: "Create Pull Request for a minor/patch update"
if: ${{ steps.deps-update.outputs.update-type != 'none' && steps.deps-update.outputs.update-type != 'major' }}
id: minor-pr
uses: peter-evans/create-pull-request@v5
env:
pr-title: "feat(chart): ${{ steps.deps-update.outputs.update-type }} update of dependencies on argocd chart"
branch: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}-argocd"
labels: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}"
with:
commit-message: ${{ env.pr-title }}
author: ${{ env.author }}
committer: ${{ env.author }}
branch: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}-argocd"
title: ${{ env.pr-title }}
labels: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}"
body: |
:robot: I have updated the chart *beep* *boop*
---
## Description of the changes
This PR updates the dependencies of the **argocd** Helm chart.
The maximum version bump was a **${{ steps.deps-update.outputs.update-type }}** step.
- name: "Create Pull Request for a major update"
if: ${{ steps.deps-update.outputs.update-type != 'none' && steps.deps-update.outputs.update-type == 'major' }}
id: major-pr
uses: peter-evans/create-pull-request@v5
env:
# This step does not have a branch and labels environment variable, because it is forcefully a major update,
# unlike the previous step, which can either be a patch, minor or major update.
pr-title: "feat(chart)!: major update of dependencies on argocd chart"
with:
commit-message: ${{ env.pr-title }}
author: ${{ env.author }}
committer: ${{ env.author }}
branch: "chart-autoupdate-major-argocd"
title: ${{ env.pr-title }}
labels: "chart-autoupdate-major"
body: |
:robot: I have updated the chart *beep* *boop*
---
## Description of the changes
This PR updates the dependencies of the **argocd** Helm chart.
:warning: This was a **major** update! Please check the changelog of the updated dependencies and **take notice of any breaking changes before merging**. :warning:
chart-update-manual:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' }}
steps:
- name: "Check out the repository"
uses: actions/checkout@v4
- name: "Upgrade Helm chart dependencies"
id: deps-update
uses: camptocamp/[email protected]
with:
chart-path: "charts/argocd"
readme-path: "README.adoc"
excluded-dependencies: ${{ inputs.excluded-dependencies }}
update-strategy: "${{ inputs.update-strategy }}"
dry-run: "${{ inputs.dry-run }}"
- name: "Create Pull Request for a minor/patch update"
if: ${{ !inputs.dry-run && steps.deps-update.outputs.update-type != 'none' && steps.deps-update.outputs.update-type != 'major' }}
id: minor-pr
uses: peter-evans/create-pull-request@v5
env:
pr-title: "feat(chart): ${{ steps.deps-update.outputs.update-type }} update of dependencies on argocd chart"
branch: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}-argocd"
labels: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}"
with:
commit-message: ${{ env.pr-title }}
author: ${{ env.author }}
committer: ${{ env.author }}
branch: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}-argocd"
title: ${{ env.pr-title }}
labels: "chart-autoupdate-${{ steps.deps-update.outputs.update-type }}"
body: |
:robot: I have updated the chart *beep* *boop*
---
## Description of the changes
This PR updates the dependencies of the **argocd** Helm chart.
The maximum version bump was a **${{ steps.deps-update.outputs.update-type }}** step.
- name: "Create Pull Request for a major update"
if: ${{ !inputs.dry-run && steps.deps-update.outputs.update-type != 'none' && steps.deps-update.outputs.update-type == 'major' }}
id: major-pr
uses: peter-evans/create-pull-request@v5
env:
# This step does not have a branch and labels environment variable, because it is forcefully a major update,
# unlike the previous step, which can either be a patch, minor or major update.
pr-title: "feat(chart)!: major update of dependencies on argocd chart"
with:
commit-message: ${{ env.pr-title }}
author: ${{ env.author }}
committer: ${{ env.author }}
branch: "chart-autoupdate-major-argocd"
title: ${{ env.pr-title }}
labels: "chart-autoupdate-major"
body: |
:robot: I have updated the chart *beep* *boop*
---
## Description of the changes
This PR updates the dependencies of the **argocd** Helm chart.
:warning: This was a **major** update! Please check the changelog of the updated dependencies and **take notice of any breaking changes before merging**. :warning:
It is possible to use the Python script without the said action, but it requires to have Updatecli installed on the environment in which it is executed.
For more information about the flags the script supports, you only have to run python3 ./helm_dependency_bumper.py --help
.
-
The action expects a root path to a single chart and the directory must contain a
Chart.yaml
file. -
The versions of the dependencies are expected to be in the format
x.x.x
without av
prefix and without any other characters like^
or~
.
The Python script on which this action is based upon is inspired by this blog post.
Also note this other GitHub action that exists. We decided to create our own action because that one seems to only support an update to the latest version without the possibility of pinning to minor or patch versions. Besides, we wanted to use Updatecli to perform the update of the dependencies, in order to avoid having to develop all the Python logic needed to parse the index.yaml
provided in Helm repositories.
The following references were used to create this action:
-
https://docs.github.com/en/actions/creating-actions/creating-a-docker-container-action
-
https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions
-
https://blog.promaton.com/how-to-set-up-automated-helm-chart-upgrades-e292192a9aad
-
https://pythonspeed.com/articles/activate-virtualenv-dockerfile/