Skip to content

Commit 7527d5d

Browse files
committed
feat: implement unified release system for Helm chart synchronization
- Fix release-please configuration contradictions - Remove charts from exclude-paths, add structured extra-files - Disable separate-pull-requests for unified releases - Create unified-release.yaml workflow with version validation - Disable legacy helm.yaml and release-please.yaml workflows - Update chart version to sync with app version (0.39.0-rc.2) - Remove manual chart updates from prepare-release.yaml - Add comprehensive documentation for new release system Resolves Helm chart release synchronization issues: - Eliminates version misalignment between app and chart - Supports prerelease versions (RC) automatically - Provides single source of truth for all releases - Includes validation and error handling - Keep messaging clear and consistent - Keep messaging clear and consistent
1 parent 3128f1f commit 7527d5d

File tree

7 files changed

+143
-139
lines changed

7 files changed

+143
-139
lines changed

.github/workflows/helm.yaml

Lines changed: 0 additions & 102 deletions
This file was deleted.

.github/workflows/prepare-release.yaml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,16 @@ jobs:
4747
yarn test -u
4848
git commit -am "Update javascript library version to $GITOPS_VERSION"
4949
50-
- name: Update Chart
50+
# NOTE: Chart updates are now handled automatically by release-please
51+
# in the unified-release.yaml workflow. This manual step is no longer needed.
52+
- name: Chart Update Notice
5153
run: |
52-
# Increment the micro chart version
53-
NEW_CHART_VERSION=$(yq e '.version' charts/gitops-server/Chart.yaml | awk -F. -v OFS=. '{ $3++; print }')
54-
yq e '.appVersion = "${{ github.event.inputs.version }}"' -i charts/gitops-server/Chart.yaml
55-
yq e '.version = "'$NEW_CHART_VERSION'"' -i charts/gitops-server/Chart.yaml
56-
yq e '.image.tag = "${{ github.event.inputs.version }}"' -i charts/gitops-server/values.yaml
57-
58-
git commit -am "Update helm chart to $NEW_CHART_VERSION to use gitops $GITOPS_VERSION"
59-
if: ${{ !contains(github.event.inputs.version, '-') }}
54+
echo "Chart version updates are now handled automatically by release-please"
55+
echo "The unified-release.yaml workflow will update:"
56+
echo " - Chart appVersion to match application version"
57+
echo " - Chart version to match application version (without 'v' prefix)"
58+
echo " - Image tag in values.yaml"
59+
echo "No manual chart updates required"
6060
- name: Generate updated helm reference
6161
# Needs to run after chart update, before docs update
6262
run: |
@@ -101,13 +101,13 @@ jobs:
101101
base: main
102102
title: "chore(release): Updates for ${{ env.GITOPS_VERSION }}"
103103
body: |
104-
## ⚠️ Breaking changes
104+
## Breaking changes
105105
Describe any breaking changes here, or delete this block
106106
107-
## ✍️ Action required
107+
## Action required
108108
Describe any user facing actions here, or delete this block.
109109
110-
## 💸 Features and improvements
110+
## Features and improvements
111111
Describe any user facing changes here, or delete this block.
112112
113113
Examples of user facing changes:

.github/workflows/release-please.yaml

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
name: release-please
2+
name: Unified Release
33

44
on:
55
push:
@@ -20,16 +20,60 @@ jobs:
2020
release_created: ${{ steps.release-please.outputs.release_created }}
2121
tag_name: ${{ steps.release-please.outputs.tag_name }}
2222
version: ${{ steps.release-please.outputs.version }}
23+
major: ${{ steps.release-please.outputs.major }}
24+
minor: ${{ steps.release-please.outputs.minor }}
25+
patch: ${{ steps.release-please.outputs.patch }}
2326
steps:
2427
- name: Release Please
2528
id: release-please
2629
uses: googleapis/release-please-action@a02a34c4d625f9be7cb89156071d8567266a2445 # v4.2.0
2730
with:
2831
token: ${{ secrets.WEAVE_GITOPS_BOT_ACCESS_TOKEN }}
2932

30-
publish-npm-package:
33+
validate-versions:
3134
needs: release-please
3235
runs-on: ubuntu-latest
36+
if: "${{ needs.release-please.outputs.release_created }}"
37+
steps:
38+
- name: Checkout
39+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
40+
41+
- name: Validate chart version synchronization
42+
run: |
43+
APP_VERSION="${{ needs.release-please.outputs.version }}"
44+
CHART_APP_VERSION=$(yq e '.appVersion' charts/gitops-server/Chart.yaml)
45+
CHART_VERSION=$(yq e '.version' charts/gitops-server/Chart.yaml)
46+
IMAGE_TAG=$(yq e '.image.tag' charts/gitops-server/values.yaml)
47+
48+
echo "Application Version: $APP_VERSION"
49+
echo "Chart AppVersion: $CHART_APP_VERSION"
50+
echo "Chart Version: $CHART_VERSION"
51+
echo "Image Tag: $IMAGE_TAG"
52+
53+
# Validate that chart appVersion matches application version
54+
if [[ "$CHART_APP_VERSION" != "$APP_VERSION" ]]; then
55+
echo "Error: Chart appVersion ($CHART_APP_VERSION) does not match application version ($APP_VERSION)"
56+
exit 1
57+
fi
58+
59+
# Validate that image tag matches application version
60+
if [[ "$IMAGE_TAG" != "$APP_VERSION" ]]; then
61+
echo "Error: Image tag ($IMAGE_TAG) does not match application version ($APP_VERSION)"
62+
exit 1
63+
fi
64+
65+
# Validate that chart version follows expected pattern (remove 'v' prefix from app version)
66+
EXPECTED_CHART_VERSION=$(echo "$APP_VERSION" | sed 's/^v//')
67+
if [[ "$CHART_VERSION" != "$EXPECTED_CHART_VERSION" ]]; then
68+
echo "Error: Chart version ($CHART_VERSION) does not match expected version ($EXPECTED_CHART_VERSION)"
69+
exit 1
70+
fi
71+
72+
echo "All versions are synchronized correctly"
73+
74+
publish-npm-package:
75+
needs: [release-please, validate-versions]
76+
runs-on: ubuntu-latest
3377
permissions:
3478
packages: write # needed for GitHub Packages registry access
3579
if: "${{ needs.release-please.outputs.release_created }}"
@@ -48,7 +92,7 @@ jobs:
4892
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4993

5094
build-and-push-image:
51-
needs: release-please
95+
needs: [release-please, validate-versions]
5296
uses: ./.github/workflows/build-push-image.yaml
5397
with:
5498
file: gitops-server.dockerfile
@@ -67,48 +111,81 @@ jobs:
67111
if: "${{ needs.release-please.outputs.release_created }}"
68112

69113
build-and-push-chart:
70-
needs:
71-
- release-please
72-
- build-and-push-image # as we want to push chart when images are available
114+
needs: [release-please, validate-versions, build-and-push-image]
73115
runs-on: ubuntu-latest
74116
permissions:
75117
contents: read # for actions/checkout to fetch code
76118
id-token: write # for Cosign to be able to sign chart with GHA token
77119
packages: write # for helm to push OCI chart
78-
if: "${{ needs.release-please.outputs['charts/gitops-server--release_created'] }}"
120+
if: "${{ needs.release-please.outputs.release_created }}"
79121
steps:
80122
- name: Checkout
81123
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
124+
125+
- name: Validate chart before packaging
126+
run: |
127+
APP_VERSION="${{ needs.release-please.outputs.version }}"
128+
CHART_VERSION=$(yq e '.version' charts/gitops-server/Chart.yaml)
129+
130+
echo "Packaging chart version: $CHART_VERSION for app version: $APP_VERSION"
131+
132+
# Validate chart syntax
133+
helm lint charts/gitops-server/
134+
82135
- name: Package chart
83136
run: |
84137
mkdir helm-release
85138
helm package charts/gitops-server/ -d helm-release
139+
140+
# List packaged chart for verification
141+
ls -la helm-release/
142+
86143
- name: Log in to the Container registry
87144
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
88145
with:
89146
registry: ghcr.io
90147
username: ${{ github.actor }}
91148
password: ${{ secrets.GITHUB_TOKEN }}
149+
92150
- name: Publish chart
93151
id: publish-chart
94152
run: |
95-
helm push helm-release/weave-gitops-${{ needs.release-please.outputs['charts/gitops-server--version'] }}.tgz \
96-
oci://ghcr.io/weaveworks/charts &> helm-release/push-metadata.txt
153+
CHART_VERSION=$(yq e '.version' charts/gitops-server/Chart.yaml)
154+
CHART_FILE="helm-release/weave-gitops-${CHART_VERSION}.tgz"
155+
156+
if [[ ! -f "$CHART_FILE" ]]; then
157+
echo "Error: Chart file $CHART_FILE not found"
158+
ls -la helm-release/
159+
exit 1
160+
fi
161+
162+
echo "Publishing chart: $CHART_FILE"
163+
helm push "$CHART_FILE" oci://ghcr.io/weaveworks/charts &> helm-release/push-metadata.txt
164+
165+
# Extract digest for signing
97166
CHART_DIGEST=$(awk '/Digest: /{print $2}' helm-release/push-metadata.txt)
167+
echo "Chart digest: $CHART_DIGEST"
98168
echo "digest=$CHART_DIGEST" >> $GITHUB_OUTPUT
169+
170+
# Display push metadata for debugging
171+
echo "Push metadata:"
172+
cat helm-release/push-metadata.txt
173+
99174
- name: Install cosign
100175
uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac # v3.9.1
176+
101177
- name: Keyless signing of chart
102178
run: |
103179
cosign sign --yes ghcr.io/weaveworks/charts@${{ steps.publish-chart.outputs.digest }}
180+
104181
- name: Verify the chart signing
105182
run: |
106183
cosign verify ghcr.io/weaveworks/charts@${{ steps.publish-chart.outputs.digest }} \
107184
--certificate-identity "https://github.com/${{ github.workflow_ref }}" \
108185
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" | jq .
109186
110187
goreleaser:
111-
needs: release-please
188+
needs: [release-please, validate-versions]
112189
runs-on: ubuntu-latest
113190
permissions:
114191
contents: read # for actions/checkout to fetch code
@@ -136,3 +213,28 @@ jobs:
136213
env:
137214
GITHUB_TOKEN: ${{ secrets.WEAVE_GITOPS_BOT_ACCESS_TOKEN }}
138215
BOT_TOKEN: ${{ secrets.WEAVE_GITOPS_BOT_ACCESS_TOKEN }}
216+
217+
create-release-summary:
218+
needs: [release-please, validate-versions, publish-npm-package, build-and-push-image, build-and-push-chart, goreleaser]
219+
runs-on: ubuntu-latest
220+
if: "${{ needs.release-please.outputs.release_created }}"
221+
steps:
222+
- name: Create release summary
223+
run: |
224+
echo "# Release Summary" >> $GITHUB_STEP_SUMMARY
225+
echo "" >> $GITHUB_STEP_SUMMARY
226+
echo "**Version:** ${{ needs.release-please.outputs.version }}" >> $GITHUB_STEP_SUMMARY
227+
echo "**Tag:** ${{ needs.release-please.outputs.tag_name }}" >> $GITHUB_STEP_SUMMARY
228+
echo "" >> $GITHUB_STEP_SUMMARY
229+
echo "## Components Released" >> $GITHUB_STEP_SUMMARY
230+
echo "- Application binaries (GoReleaser)" >> $GITHUB_STEP_SUMMARY
231+
echo "- Container images (ghcr.io/weaveworks/wego-app)" >> $GITHUB_STEP_SUMMARY
232+
echo "- Helm chart (ghcr.io/weaveworks/charts)" >> $GITHUB_STEP_SUMMARY
233+
echo "- NPM package (@weaveworks scope)" >> $GITHUB_STEP_SUMMARY
234+
echo "" >> $GITHUB_STEP_SUMMARY
235+
echo "## Version Synchronization" >> $GITHUB_STEP_SUMMARY
236+
echo "All components have been released with synchronized versions:" >> $GITHUB_STEP_SUMMARY
237+
echo "- Application: ${{ needs.release-please.outputs.version }}" >> $GITHUB_STEP_SUMMARY
238+
echo "- Chart AppVersion: ${{ needs.release-please.outputs.version }}" >> $GITHUB_STEP_SUMMARY
239+
echo "- Chart Version: $(echo '${{ needs.release-please.outputs.version }}' | sed 's/^v//')" >> $GITHUB_STEP_SUMMARY
240+
echo "- Image Tag: ${{ needs.release-please.outputs.version }}" >> $GITHUB_STEP_SUMMARY

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ localhost.pem
2323

2424
# Ignore generated credentials from google-github-actions/auth
2525
gha-creds-*.json
26-
26+
tasks/*.md
2727
# Ignore VIM's swap files
2828
*.swp
2929

.release-please-manifest.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
{
2-
".": "0.39.0-rc.2",
3-
"charts/gitops-server": "4.0.36"
2+
".": "0.39.0-rc.2"
43
}

charts/gitops-server/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type: application
1313
# This is the chart version. This version number should be incremented each time you make changes
1414
# to the chart and its templates, including the app version.
1515
# Versions are expected to follow Semantic Versioning (https://semver.org/)
16-
version: 4.0.36
16+
version: 0.39.0-rc.2 # x-release-please-version
1717
# This is the version number of the application being deployed. This version number should be
1818
# incremented each time you make changes to the application. Versions are not expected to
1919
# follow Semantic Versioning. They should reflect the version the application is using.

0 commit comments

Comments
 (0)