-
Notifications
You must be signed in to change notification settings - Fork 2
605 lines (521 loc) · 22.6 KB
/
Copy pathrelease.yml
File metadata and controls
605 lines (521 loc) · 22.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
name: Build and Release Helm Chart
on:
push:
branches:
- main # Main branch updates
tags:
- 'v*' # v* tags for release
workflow_dispatch:
inputs:
ref:
description: 'Branch or tag to build (e.g., main, v0.1.0)'
required: false
type: string
default: 'main'
sync_to_doc:
description: 'Sync index.yaml to curvine-doc repository after build'
required: true
type: boolean
default: false
jobs:
validate-inputs:
runs-on: ubuntu-latest
outputs:
manual_ref: ${{ steps.validate.outputs.manual_ref }}
steps:
- name: Validate manual workflow inputs
id: validate
run: |
if [[ "${{ github.event_name }}" != "workflow_dispatch" ]]; then
echo "manual_ref=" >> "$GITHUB_OUTPUT"
exit 0
fi
REF="${{ inputs.ref }}"
if [[ -z "$REF" ]]; then
REF="main"
fi
if [[ "$REF" == "latest" ]]; then
echo "::error title=Invalid ref::ref=latest is an outdated git tag. Use ref=main to build and sync the testing release."
exit 1
fi
echo "manual_ref=$REF" >> "$GITHUB_OUTPUT"
echo "Validated manual ref: $REF"
build-charts:
needs: validate-inputs
runs-on: ubuntu-latest
strategy:
matrix:
chart:
- name: curvine-csi
path: curvine-csi
- name: curvine
path: curvine-runtime
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_dispatch' && needs.validate-inputs.outputs.manual_ref || github.ref }}
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@v4.3.0
with:
version: 'latest'
- name: Extract tag/version information
id: tag
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
REF="${{ needs.validate-inputs.outputs.manual_ref }}"
if [[ "$REF" == v* ]]; then
TAG="$REF"
IS_TAG=true
IS_BRANCH_BUILD=false
else
TAG="latest"
IS_TAG=false
IS_BRANCH_BUILD=true
fi
# Handle tag push
elif [[ "$GITHUB_REF" == refs/tags/* ]]; then
TAG=${GITHUB_REF#refs/tags/}
IS_TAG=true
IS_BRANCH_BUILD=false
# Handle main branch push
elif [[ "$GITHUB_REF" == refs/heads/main ]]; then
TAG="latest"
IS_TAG=false
IS_BRANCH_BUILD=true
else
echo "Error: Unexpected ref: $GITHUB_REF"
exit 1
fi
# Extract version from tag (remove 'v' prefix if present)
if [[ "$TAG" == v* ]]; then
VERSION=${TAG#v}
elif [ "$IS_BRANCH_BUILD" == "true" ]; then
# For branch builds, version is set after reading Chart.yaml
VERSION=""
else
VERSION=$TAG
fi
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "is_tag=$IS_TAG" >> $GITHUB_OUTPUT
echo "is_branch_build=$IS_BRANCH_BUILD" >> $GITHUB_OUTPUT
echo "Tag/Version: $TAG ($VERSION)"
echo "Is Tag: $IS_TAG"
echo "Is Branch Build: $IS_BRANCH_BUILD"
- name: Set chart version
id: version
run: |
CURRENT_VERSION=$(grep '^version:' ${{ matrix.chart.path }}/Chart.yaml | awk '{print $2}' | tr -d '"')
echo "Current Chart version for ${{ matrix.chart.name }}: $CURRENT_VERSION"
if [ "${{ steps.tag.outputs.is_branch_build }}" == "true" ]; then
FINAL_VERSION="0.0.0-dev"
APP_VERSION="latest"
else
FINAL_VERSION="${{ steps.tag.outputs.version }}"
APP_VERSION="${FINAL_VERSION}"
fi
sed -i "s/^version:.*/version: $FINAL_VERSION/" ${{ matrix.chart.path }}/Chart.yaml
sed -i "s/^appVersion:.*/appVersion: \"$APP_VERSION\"/" ${{ matrix.chart.path }}/Chart.yaml
echo "version=$FINAL_VERSION" >> $GITHUB_OUTPUT
echo "app_version=$APP_VERSION" >> $GITHUB_OUTPUT
echo "Updated Chart.yaml version to: $FINAL_VERSION, appVersion to: $APP_VERSION"
cat ${{ matrix.chart.path }}/Chart.yaml
- name: Validate Helm chart
run: |
cd ${{ matrix.chart.path }}
if [ "${{ matrix.chart.name }}" = "curvine" ]; then
helm repo add openkruise https://openkruise.github.io/charts/
helm dependency build .
fi
helm lint .
if [ "${{ matrix.chart.name }}" = "curvine" ]; then
helm template test . | grep 'snapshot_entries = 1000000'
helm template test . | grep 'snapshot_entries' | grep -qv 'e+'
fi
- name: Package Helm chart
id: package
run: |
mkdir -p dist
cd ${{ matrix.chart.path }}
if [ "${{ matrix.chart.name }}" = "curvine" ]; then
helm repo add openkruise https://openkruise.github.io/charts/
helm dependency build .
fi
helm package . --destination ../dist
cd ../dist
CHART_FILE=$(ls *.tgz)
echo "chart_file=dist/$CHART_FILE" >> $GITHUB_OUTPUT
echo "chart_name=$CHART_FILE" >> $GITHUB_OUTPUT
echo "Packaged chart for ${{ matrix.chart.name }}: $CHART_FILE"
- name: Generate chart checksum
id: checksum
run: |
cd dist
DIGEST=$(sha256sum *.tgz | awk '{print $1}')
echo "digest=$DIGEST" >> $GITHUB_OUTPUT
echo "${{ matrix.chart.name }} Digest (SHA256): $DIGEST"
- name: Upload chart artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.chart.name }}-${{ steps.tag.outputs.tag }}
path: dist/*.tgz
retention-days: 90
- name: Build Summary
run: |
echo "## Build Summary - ${{ matrix.chart.name }}" >> $GITHUB_STEP_SUMMARY
echo "- **Chart**: ${{ matrix.chart.name }}" >> $GITHUB_STEP_SUMMARY
echo "- **Release Tag**: ${{ steps.tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY
echo "- **Chart Version**: ${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "- **App Version**: ${{ steps.version.outputs.app_version }}" >> $GITHUB_STEP_SUMMARY
echo "- **Chart Package**: ${{ steps.package.outputs.chart_name }}" >> $GITHUB_STEP_SUMMARY
echo "- **Digest (SHA256)**: ${{ steps.checksum.outputs.digest }}" >> $GITHUB_STEP_SUMMARY
create-release:
needs:
- validate-inputs
- build-charts
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_dispatch' && needs.validate-inputs.outputs.manual_ref || github.ref }}
fetch-depth: 0
- name: Resolve source metadata
id: source
run: |
SOURCE_SHA=$(git rev-parse HEAD)
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
SOURCE_REF="${{ needs.validate-inputs.outputs.manual_ref }}"
else
SOURCE_REF="${GITHUB_REF_NAME}"
fi
echo "source_ref=$SOURCE_REF" >> "$GITHUB_OUTPUT"
echo "source_sha=$SOURCE_SHA" >> "$GITHUB_OUTPUT"
echo "Source ref: $SOURCE_REF"
echo "Source SHA: $SOURCE_SHA"
- name: Extract tag/version information
id: tag
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
REF="${{ needs.validate-inputs.outputs.manual_ref }}"
if [[ "$REF" == v* ]]; then
TAG="$REF"
IS_TAG=true
IS_BRANCH_BUILD=false
else
TAG="latest"
IS_TAG=false
IS_BRANCH_BUILD=true
fi
# Handle tag push
elif [[ "$GITHUB_REF" == refs/tags/* ]]; then
TAG=${GITHUB_REF#refs/tags/}
IS_TAG=true
IS_BRANCH_BUILD=false
# Handle main branch push
elif [[ "$GITHUB_REF" == refs/heads/main ]]; then
TAG="latest"
IS_TAG=false
IS_BRANCH_BUILD=true
else
echo "Error: Unexpected ref: $GITHUB_REF"
exit 1
fi
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "is_tag=$IS_TAG" >> $GITHUB_OUTPUT
echo "is_branch_build=$IS_BRANCH_BUILD" >> $GITHUB_OUTPUT
echo "Tag: $TAG"
echo "Is Tag: $IS_TAG"
echo "Is Branch Build: $IS_BRANCH_BUILD"
- name: Download all chart artifacts
uses: actions/download-artifact@v4
with:
path: dist
pattern: '*-${{ steps.tag.outputs.tag }}'
merge-multiple: true
- name: Generate unified checksums
id: checksums
run: |
cd dist
sha256sum *.tgz > checksums.txt
echo "Generated unified checksums.txt:"
cat checksums.txt
- name: Determine release type
id: release
run: |
IS_V_TAG=false
if [[ "${{ steps.tag.outputs.tag }}" == v* ]]; then
IS_V_TAG=true
fi
# v* tags create normal releases
# branch builds create/update the "latest" testing release
if [ "${{ steps.tag.outputs.is_tag }}" == "true" ] && [ "$IS_V_TAG" == "true" ]; then
RELEASE_TYPE="tag"
RELEASE_TAG="${{ steps.tag.outputs.tag }}"
elif [ "${{ steps.tag.outputs.is_branch_build }}" == "true" ]; then
RELEASE_TYPE="latest"
RELEASE_TAG="latest"
else
RELEASE_TYPE="none"
RELEASE_TAG=""
fi
echo "release_type=$RELEASE_TYPE" >> $GITHUB_OUTPUT
echo "release_tag=$RELEASE_TAG" >> $GITHUB_OUTPUT
echo "should_release=$([ "$RELEASE_TYPE" != "none" ] && echo "true" || echo "false")" >> $GITHUB_OUTPUT
echo "Release Type: $RELEASE_TYPE"
echo "Release Tag: $RELEASE_TAG"
- name: Clean stale assets from latest release
if: steps.release.outputs.release_type == 'latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
if ! gh release view latest --repo "${GITHUB_REPOSITORY}" >/dev/null 2>&1; then
echo "No existing latest release; skip asset cleanup."
exit 0
fi
mapfile -t asset_names < <(
gh release view latest --repo "${GITHUB_REPOSITORY}" \
--json assets \
--jq '.assets[] | select(.name | test("\\.tgz$|^checksums\\.txt$")) | .name'
)
if [ "${#asset_names[@]}" -eq 0 ]; then
echo "No chart assets to delete on latest release."
exit 0
fi
for asset_name in "${asset_names[@]}"; do
echo "Deleting release asset: ${asset_name}"
gh release delete-asset latest "${asset_name}" --repo "${GITHUB_REPOSITORY}" -y
done
- name: Create/Update GitHub Release (v* tag)
if: steps.release.outputs.release_type == 'tag'
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.release.outputs.release_tag }}
name: Release ${{ steps.release.outputs.release_tag }}
body: |
## Helm Charts Release ${{ steps.release.outputs.release_tag }}
### Chart Information
- **Tag**: ${{ steps.release.outputs.release_tag }}
- **Commit**: ${{ steps.source.outputs.source_sha }}
This release includes two Helm charts:
- **curvine-csi**: CSI Driver for Curvine storage
- **curvine**: Curvine distributed cache system
### Installation
#### Curvine Runtime
```bash
helm repo add curvineio https://curvineio.github.io/curvine-doc/helm-charts
helm repo update
helm upgrade --install curvine curvineio/curvine
```
#### Curvine CSI Driver
```bash
helm repo add curvineio https://curvineio.github.io/curvine-doc/helm-charts
helm repo update
helm upgrade --install curvine-csi curvineio/curvine-csi
```
### Files
- curvine-csi chart package
- curvine chart package
- checksums.txt (SHA256 checksums for both charts)
files: |
dist/*.tgz
dist/checksums.txt
draft: false
prerelease: ${{ contains(steps.release.outputs.release_tag, '-') || contains(steps.release.outputs.release_tag, 'alpha') || contains(steps.release.outputs.release_tag, 'beta') || contains(steps.release.outputs.release_tag, 'rc') }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create/Update GitHub Release (branch build -> latest)
if: steps.release.outputs.release_type == 'latest'
uses: softprops/action-gh-release@v2
with:
tag_name: latest
name: Latest Release (Testing Branch Build)
body: |
## Latest Helm Charts Release (For Testing Only)
⚠️ **This is a testing release that is overwritten by the latest branch build.**
- Use this for development and testing purposes only
- For production use, please use versioned releases (v*)
- Chart versions are fixed (e.g., 0.0.0-dev) and overwrite previous builds
### Chart Information
- **Ref**: ${{ steps.source.outputs.source_ref }}
- **Commit**: ${{ steps.source.outputs.source_sha }}
This release includes two Helm charts:
- **curvine-csi-dev**: CSI Driver for Curvine storage (testing version)
- **curvine-dev**: Curvine distributed cache system (testing version)
### Installation
Download and install manually from release assets below, or use:
```bash
# Download specific chart
wget https://github.com/CurvineIO/curvine-helm/releases/download/latest/curvine-*.tgz
helm upgrade --install curvine ./curvine-*.tgz
```
### Files
- curvine-csi chart package (version: 0.0.0-dev)
- curvine chart package (version: 0.0.0-dev)
- checksums.txt (SHA256 checksums for both charts)
> **Note**: This release is automatically overwritten. Do not use in production!
files: |
dist/*.tgz
dist/checksums.txt
draft: false
prerelease: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Release Summary
run: |
echo "## Release Summary" >> $GITHUB_STEP_SUMMARY
echo "- **Release Type**: ${{ steps.release.outputs.release_type }}" >> $GITHUB_STEP_SUMMARY
echo "- **Release Tag**: ${{ steps.release.outputs.release_tag }}" >> $GITHUB_STEP_SUMMARY
echo "- **Is Tag**: ${{ steps.tag.outputs.is_tag }}" >> $GITHUB_STEP_SUMMARY
echo "- **Is Branch Build**: ${{ steps.tag.outputs.is_branch_build }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Packaged Charts" >> $GITHUB_STEP_SUMMARY
ls -lh dist/*.tgz >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Checksums" >> $GITHUB_STEP_SUMMARY
cat dist/checksums.txt >> $GITHUB_STEP_SUMMARY
sync-to-helm-repo:
needs:
- validate-inputs
- create-release
# Auto-sync on main or v* tag push; manual workflow_dispatch via sync_to_doc
if: always() && needs.create-release.result == 'success' && ((github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))) || (github.event_name == 'workflow_dispatch' && inputs.sync_to_doc == true))
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout source repository
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_dispatch' && needs.validate-inputs.outputs.manual_ref || github.ref }}
path: source-repo
fetch-depth: 0
- name: Resolve sync source metadata
id: source
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
SOURCE_REF="${{ needs.validate-inputs.outputs.manual_ref }}"
else
SOURCE_REF="${GITHUB_REF_NAME}"
fi
SOURCE_SHA=$(git -C source-repo rev-parse HEAD)
# Branch builds publish to the "latest" testing release, not a tag named after the branch.
if [[ "$SOURCE_REF" == v* ]]; then
TAG="$SOURCE_REF"
VERSION="${TAG#v}"
else
TAG="latest"
VERSION="latest"
fi
echo "source_ref=$SOURCE_REF" >> "$GITHUB_OUTPUT"
echo "source_sha=$SOURCE_SHA" >> "$GITHUB_OUTPUT"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Sync source ref: $SOURCE_REF"
echo "Sync source SHA: $SOURCE_SHA"
echo "Release tag for download: $TAG"
- name: Checkout curvine-doc repository
uses: actions/checkout@v4
with:
repository: CurvineIO/curvine-doc
token: ${{ secrets.CURVINE_DOC_TOKEN }}
path: curvine-doc
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@v4.3.0
with:
version: 'latest'
- name: Prepare existing index.yaml for merge
run: |
mkdir -p temp-charts
INDEX_PATH="curvine-doc/static/helm-charts/index.yaml"
if [ ! -f "$INDEX_PATH" ]; then
echo "::error title=Missing index.yaml::Expected $INDEX_PATH in curvine-doc. Bootstrap the public Helm index in curvine-doc before syncing releases."
exit 1
fi
if [ ! -s "$INDEX_PATH" ]; then
echo "::error title=Empty index.yaml::$INDEX_PATH is empty. Refusing to regenerate the public index without merge input."
exit 1
fi
cp "$INDEX_PATH" temp-charts/old-index.yaml
echo "Loaded existing index.yaml from curvine-doc git repository:"
head -20 temp-charts/old-index.yaml
- name: Download current release charts
run: |
cd temp-charts
RELEASE_TAG="${{ steps.source.outputs.tag }}"
echo "Downloading charts from release: $RELEASE_TAG"
# Download using GitHub CLI
gh release download "$RELEASE_TAG" \
--repo CurvineIO/curvine-helm \
--pattern "*.tgz"
echo "Downloaded charts:"
ls -lh *.tgz
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Generate merged index.yaml with Release URLs
run: |
cd temp-charts
RELEASE_TAG="${{ steps.source.outputs.tag }}"
echo "Merging new charts into existing index.yaml..."
helm repo index . \
--url "https://github.com/CurvineIO/curvine-helm/releases/download/${RELEASE_TAG}" \
--merge old-index.yaml
echo "Generated index.yaml (first 100 lines):"
head -100 index.yaml
echo ""
echo "Entries count:"
grep -c "version:" index.yaml || echo "0"
- name: Copy index.yaml to curvine-doc
run: |
mkdir -p curvine-doc/static/helm-charts
cp temp-charts/index.yaml curvine-doc/static/helm-charts/index.yaml
echo "✅ Copied merged index.yaml to curvine-doc/static/helm-charts/"
- name: Commit and push to curvine-doc
run: |
cd curvine-doc
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add static/helm-charts/index.yaml
# Check if there are changes to commit
if git diff --staged --quiet; then
echo "No changes to index.yaml"
else
COMMIT_MSG="chore(helm): update index.yaml from release ${{ steps.source.outputs.tag }}
Auto-generated by GitHub Actions
Source: CurvineIO/curvine-helm@${{ steps.source.outputs.source_sha }}
Release: ${{ steps.source.outputs.tag }}
This index.yaml includes all historical versions with URLs pointing to GitHub Releases."
git commit -m "$COMMIT_MSG"
git push
echo "✅ Successfully pushed index.yaml to curvine-doc repository"
fi
- name: Sync Summary
run: |
echo "## Helm Repository Sync Complete" >> $GITHUB_STEP_SUMMARY
echo "- **Version**: ${{ steps.source.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "- **Release Tag**: ${{ steps.source.outputs.tag }}" >> $GITHUB_STEP_SUMMARY
echo "- **Source Commit**: ${{ steps.source.outputs.source_sha }}" >> $GITHUB_STEP_SUMMARY
echo "- **Status**: ✅ Synced successfully" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Architecture" >> $GITHUB_STEP_SUMMARY
echo "- **Charts Storage**: GitHub Releases (curvine-helm)" >> $GITHUB_STEP_SUMMARY
echo "- **Index Location**: curvine-doc/static/helm-charts/index.yaml" >> $GITHUB_STEP_SUMMARY
echo "- **Chart URLs**: Point to GitHub Releases" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### URLs" >> $GITHUB_STEP_SUMMARY
echo "- **Index**: https://curvineio.github.io/curvine-doc/helm-charts/index.yaml" >> $GITHUB_STEP_SUMMARY
echo "- **Charts**: https://github.com/CurvineIO/curvine-helm/releases" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Usage" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo "helm repo add curvineio https://curvineio.github.io/curvine-doc/helm-charts" >> $GITHUB_STEP_SUMMARY
echo "helm repo update" >> $GITHUB_STEP_SUMMARY
echo "helm search repo curvineio" >> $GITHUB_STEP_SUMMARY
echo "helm upgrade --install curvine curvineio/curvine" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY