diff --git a/README.md b/README.md index 4808080..0e47dca 100644 --- a/README.md +++ b/README.md @@ -68,5 +68,18 @@ pre-bootstrap files: - `install.sh` - `uninstall.sh` +## Adopting a helm chart + +To adopt an existing helm chart, there is an adopt-helm.sh script. It is not perfectly +reliable, however, so ensure the output makes sense. + +1. Setup your helm release how you need it to work +2. `cd argo1` +2. `bash adopt-helm.sh release-name` +3. Follow configuration instructions +4. Validate templates/release-name.yaml + - Especially, check that the repoURL is correct. +5. Commit templates/release-name.yaml and values.yaml + [argo-crds]: https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/ diff --git a/argo1/adopt-helm.sh b/argo1/adopt-helm.sh new file mode 100644 index 0000000..b48928a --- /dev/null +++ b/argo1/adopt-helm.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +cd "$(dirname "$0")" + +SOURCE_RELEASE="$1" + +eval "$( + helm list -A -o json | jq -r --arg release $SOURCE_RELEASE ' + .[] + | select(.name == $release) + | ( + @sh "CHART=\( .chart | split("-") | .[0:-1] | join("-") )", + @sh "VERSION=\( .chart | split("-") | .[-1] )", + @sh "RELEASE=\( .name )", + @sh "NAMESPACE=\( .namespace )" + ) + ' +)" + +TEMPLATE="${PWD}/templates/${RELEASE}.yaml" +if [ -e "$TEMPLATE" ];then + 1>&2 echo "$TEMPLATE: already exists. aborting." + exit 1 +fi + +REPO="$( + helm repo list -o json \ + | jq -r '.[].url' \ + | xargs -P 8 -L 1 bash -c ' + if helm show readme --repo "$1" $0 > /dev/null 2>&1;then + echo $1 + fi + ' "$CHART" \ + | sort | uniq +)" + +REPOS_MATCHING="$(echo "$REPO" | grep . | wc -l | tr -d ' \t\n\r\v')" + +if [ x"$REPOS_MATCHING" != x"1" ];then + 1>&2 echo "found $REPOS_MATCHING repos with $CHART. aborting." + 1>&2 echo "$REPO" + exit 1 +fi + +if [ x"$CHART" = x"$VERSION" ];then 1>&2 echo "could not parse chart version from name"; exit 1; fi + +VALUES="$(helm get values -n "$NAMESPACE" "$RELEASE" -o yaml)" + +echo -n '# {{ if (index .Values "'"$RELEASE"'").enabled }} +--- +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: "{{ .Release.Name }}-'"$RELEASE"'" + namespace: argocd + finalizers: + - resources-finalizer.argocd.argoproj.io +spec: + project: default + source: + chart: "'"$CHART"'" + repoURL: "'"$REPO"'" + targetRevision: "'"$VERSION"'" + helm: + values: |- + {{ (index .Values "'"$RELEASE"'").values | nindent 8 }} + # the next line preserves the release name. + # this is optional but recommended for singleton services. + releaseName: "'"$RELEASE"'" + destination: + server: "https://kubernetes.default.svc" + namespace: "'"$NAMESPACE"'" + syncPolicy: + automated: + prune: true + selfHeal: true + syncOptions: + - CreateNamespace=true + retry: + limit: 10 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m0s +# {{- end }} +' > "$TEMPLATE" + +if [ x"$VALUES" = x"null" ];then + SAMPLE_VALUES="## (sample configs from $CHART -- choose one) ## + +### (minimal config) ### +$CHART: {enabled: true} + +### (skeleton config) ### +$CHART: + enabled: true + values: | + # values.yaml contents here +" +else + SAMPLE_VALUES=" +## (sample config from $CHART) ## + +$RELEASE: + enabled: true + values: | +$(echo "$VALUES" | sed -e 's/^/ /') +" +fi + +which pbcopy > /dev/null 2>&1 && (echo "$SAMPLE_VALUES" | pbcopy) + +printf '##### +A new template has been added at %s. + +Please finish configuring this template by adding the following to values.yaml and customizing: + +%s + +(this has also been copied to your clipboard on macos +' "$TEMPLATE" "$SAMPLE_VALUES"