initial commit
All checks were successful
Build and Publish TechDocs / build-and-publish (push) Successful in 1m15s
All checks were successful
Build and Publish TechDocs / build-and-publish (push) Successful in 1m15s
Change-Id: I2e2564a72b6be9af536235fc3795fd788fd9257b
This commit is contained in:
67
.circleci/config.yml
Normal file
67
.circleci/config.yml
Normal file
@@ -0,0 +1,67 @@
|
||||
version: 2
|
||||
jobs:
|
||||
lint-scripts:
|
||||
docker:
|
||||
- image: koalaman/shellcheck-alpine
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: |
|
||||
shellcheck -x .circleci/install_charts.sh
|
||||
shellcheck -x .circleci/install_tools.sh
|
||||
shellcheck -x .circleci/release.sh
|
||||
lint-charts:
|
||||
docker:
|
||||
- image: quay.io/helmpack/chart-testing:latest
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: |
|
||||
ct lint --all --validate-maintainers=false --config .circleci/ct.yaml
|
||||
install-charts:
|
||||
machine: true
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
no_output_timeout: 20m
|
||||
command: .circleci/install_charts.sh
|
||||
release-charts:
|
||||
machine: true
|
||||
steps:
|
||||
- checkout
|
||||
- add_ssh_keys:
|
||||
fingerprints:
|
||||
- "7f:84:3b:70:a1:c8:63:8e:dc:5f:51:51:b8:f4:7c:76"
|
||||
- run:
|
||||
command: |
|
||||
echo "export GIT_REPOSITORY_URL=$CIRCLE_REPOSITORY_URL" >> $BASH_ENV
|
||||
echo "export GIT_USERNAME=$CIRCLE_PROJECT_USERNAME" >> $BASH_ENV
|
||||
.circleci/install_tools.sh
|
||||
.circleci/release.sh
|
||||
workflows:
|
||||
version: 2
|
||||
lint-test-release:
|
||||
jobs:
|
||||
- lint-scripts:
|
||||
filters:
|
||||
branches:
|
||||
ignore: gh-pages
|
||||
- lint-charts:
|
||||
filters:
|
||||
branches:
|
||||
ignore: gh-pages
|
||||
- install-charts:
|
||||
requires:
|
||||
- lint-charts
|
||||
filters:
|
||||
branches:
|
||||
ignore: gh-pages
|
||||
- release-charts:
|
||||
requires:
|
||||
- lint-charts
|
||||
- install-charts
|
||||
filters:
|
||||
tags:
|
||||
ignore: /.*/
|
||||
branches:
|
||||
only: main
|
||||
1
.circleci/ct.yaml
Normal file
1
.circleci/ct.yaml
Normal file
@@ -0,0 +1 @@
|
||||
chart-dirs: .
|
||||
126
.circleci/install_charts.sh
Executable file
126
.circleci/install_charts.sh
Executable file
@@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -o errexit
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
|
||||
readonly CT_VERSION=latest
|
||||
readonly KIND_VERSION=v0.31.0
|
||||
readonly CLUSTER_NAME=chart-testing
|
||||
readonly REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel)}"
|
||||
readonly KEDA_VERSION=2.19.0
|
||||
|
||||
find_latest_tag() {
|
||||
if ! git describe --tags --abbrev=0 2>/dev/null; then
|
||||
git rev-list --max-parents=0 --first-parent HEAD
|
||||
fi
|
||||
}
|
||||
|
||||
create_ct_container() {
|
||||
echo "Starting Chart Testing container"
|
||||
docker run --rm --interactive --detach --network host --name ct \
|
||||
--volume "$(pwd)/.circleci/ct.yaml:/etc/ct/ct.yaml" \
|
||||
--volume "$(pwd):/workdir" \
|
||||
--workdir /workdir \
|
||||
"quay.io/helmpack/chart-testing:${CT_VERSION}" \
|
||||
cat
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
echo "Removing ct container"
|
||||
docker kill ct >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
docker_exec() {
|
||||
docker exec --interactive --tty ct "$@"
|
||||
}
|
||||
|
||||
create_kind_cluster() {
|
||||
echo "Installing kind"
|
||||
curl -sSLo kind "https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-linux-amd64"
|
||||
chmod +x kind
|
||||
sudo mv kind /usr/local/bin/kind
|
||||
|
||||
echo "Creating cluster"
|
||||
kind create cluster --name "${CLUSTER_NAME}" --wait 5m -q
|
||||
|
||||
echo "Copying kubeconfig to container"
|
||||
local kubeconfig
|
||||
kubeconfig="$(pwd)/kube-config"
|
||||
kind get kubeconfig --name "${CLUSTER_NAME}" | tee "${kubeconfig}"
|
||||
docker_exec mkdir -p /root/.kube
|
||||
docker cp "${kubeconfig}" ct:/root/.kube/config
|
||||
|
||||
docker_exec kubectl cluster-info
|
||||
docker_exec kubectl get nodes
|
||||
}
|
||||
|
||||
install_local_path_provisioner() {
|
||||
docker_exec kubectl delete storageclass standard
|
||||
docker_exec kubectl apply -f "https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml"
|
||||
}
|
||||
|
||||
install_keda() {
|
||||
docker_exec kubectl apply -f "https://github.com/kedacore/keda/releases/download/v${KEDA_VERSION}/keda-${KEDA_VERSION}-core.yaml" || true
|
||||
}
|
||||
|
||||
install_charts() {
|
||||
docker_exec ct install --all
|
||||
echo
|
||||
}
|
||||
|
||||
main() {
|
||||
pushd "${REPO_ROOT}" >/dev/null
|
||||
|
||||
echo "Fetching tags"
|
||||
git fetch --tags
|
||||
|
||||
local latest_tag
|
||||
latest_tag=$(find_latest_tag)
|
||||
|
||||
local latest_tag_rev
|
||||
latest_tag_rev=$(git rev-parse --verify "${latest_tag}")
|
||||
echo "${latest_tag_rev} ${latest_tag} (latest tag)"
|
||||
|
||||
local head_rev
|
||||
head_rev=$(git rev-parse --verify HEAD)
|
||||
echo "${head_rev} HEAD"
|
||||
|
||||
if [[ "${latest_tag_rev}" == "${head_rev}" ]]; then
|
||||
echo "No code changes. Nothing to release."
|
||||
exit
|
||||
fi
|
||||
|
||||
echo "Identifying changed charts since tag ${latest_tag}"
|
||||
|
||||
local changed_charts=()
|
||||
readarray -t changed_charts <<< "$(git diff --find-renames --name-only "${latest_tag_rev}" | grep '\.yaml$' | cut -d '/' -f 1 | sort -u)"
|
||||
|
||||
if [[ -n "${changed_charts[*]}" ]]; then
|
||||
local changes_pending=no
|
||||
for chart in "${changed_charts[@]}"; do
|
||||
if [[ -f "${chart}/Chart.yaml" ]]; then
|
||||
changes_pending=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "${changes_pending}" == "yes" ]]; then
|
||||
create_ct_container
|
||||
trap cleanup EXIT
|
||||
|
||||
create_kind_cluster
|
||||
install_local_path_provisioner
|
||||
install_keda
|
||||
install_charts
|
||||
else
|
||||
echo "Nothing to do. No chart changes detected."
|
||||
fi
|
||||
else
|
||||
echo "Nothing to do. No chart changes detected."
|
||||
fi
|
||||
|
||||
popd >/dev/null
|
||||
}
|
||||
|
||||
main
|
||||
33
.circleci/install_tools.sh
Executable file
33
.circleci/install_tools.sh
Executable file
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -o errexit
|
||||
|
||||
readonly HELM_VERSION=3.19.4
|
||||
readonly CHART_RELEASER_VERSION=1.8.1
|
||||
|
||||
install_helm() {
|
||||
echo "Installing Helm"
|
||||
curl -sSLO "https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz"
|
||||
sudo mkdir -p "/usr/local/helm-v${HELM_VERSION}"
|
||||
sudo tar -xzf "helm-v${HELM_VERSION}-linux-amd64.tar.gz" -C "/usr/local/helm-v${HELM_VERSION}"
|
||||
sudo ln -s "/usr/local/helm-v${HELM_VERSION}/linux-amd64/helm" /usr/local/bin/helm
|
||||
sudo chmod +x /usr/local/helm-v${HELM_VERSION}/linux-amd64/helm
|
||||
rm -f "helm-v${HELM_VERSION}-linux-amd64.tar.gz"
|
||||
}
|
||||
|
||||
install_cr() {
|
||||
echo "Installing Chart Releaser"
|
||||
curl -sSLO "https://github.com/helm/chart-releaser/releases/download/v${CHART_RELEASER_VERSION}/chart-releaser_${CHART_RELEASER_VERSION}_linux_amd64.tar.gz"
|
||||
sudo mkdir -p "/usr/local/chart-releaser-v${CHART_RELEASER_VERSION}"
|
||||
sudo tar -xzf "chart-releaser_${CHART_RELEASER_VERSION}_linux_amd64.tar.gz" -C "/usr/local/chart-releaser-v${CHART_RELEASER_VERSION}"
|
||||
sudo ln -s "/usr/local/chart-releaser-v${CHART_RELEASER_VERSION}/cr" /usr/local/bin/cr
|
||||
sudo chmod +x "/usr/local/chart-releaser-v${CHART_RELEASER_VERSION}/cr"
|
||||
rm -f "chart-releaser_${CHART_RELEASER_VERSION}_linux_amd64.tar.gz"
|
||||
}
|
||||
|
||||
main() {
|
||||
install_helm
|
||||
install_cr
|
||||
}
|
||||
|
||||
main
|
||||
105
.circleci/release.sh
Executable file
105
.circleci/release.sh
Executable file
@@ -0,0 +1,105 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -o nounset
|
||||
|
||||
: "${CR_TOKEN:?Environment variable CR_TOKEN must be set}"
|
||||
: "${GIT_REPOSITORY_URL:?Environment variable GIT_REPOSITORY_URL must be set}"
|
||||
: "${GIT_USERNAME:?Environment variable GIT_USERNAME must be set}"
|
||||
: "${GIT_EMAIL:?Environment variable GIT_EMAIL must be set}"
|
||||
|
||||
readonly OWNER=haproxytech
|
||||
readonly GIT_REPO=helm-charts
|
||||
readonly PACKAGE_PATH=.deploy
|
||||
readonly CHARTS_URL=https://haproxytech.github.io/helm-charts
|
||||
readonly REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel)}"
|
||||
|
||||
find_latest_tag() {
|
||||
if ! git describe --tags --abbrev=0 2>/dev/null; then
|
||||
git rev-list --max-parents=0 --first-parent HEAD
|
||||
fi
|
||||
}
|
||||
|
||||
package_chart() {
|
||||
local chart="$1"
|
||||
helm dependency build "${chart}"
|
||||
helm package "${chart}" --destination "${PACKAGE_PATH}"
|
||||
}
|
||||
|
||||
release_charts() {
|
||||
echo "Upload Helm chart packages to GitHub"
|
||||
cr upload -o "${OWNER}" -r "${GIT_REPO}" -p "${PACKAGE_PATH}"
|
||||
|
||||
echo "Upload Helm chart packages to GHCR OCI"
|
||||
echo "${HELM_GH_TOKEN}" | helm registry login ghcr.io --username "${OWNER}" --password-stdin
|
||||
|
||||
for chart in "${PACKAGE_PATH}"/*.tgz; do
|
||||
helm push "${chart}" "oci://ghcr.io/${OWNER}/${GIT_REPO}"
|
||||
done
|
||||
}
|
||||
|
||||
update_index() {
|
||||
echo "Generating Helm chart index"
|
||||
git config user.email "${GIT_EMAIL}"
|
||||
git config user.name "${GIT_USERNAME}"
|
||||
git checkout gh-pages
|
||||
|
||||
cr index -i index.yaml -o "${OWNER}" -r "${GIT_REPO}" -c "${CHARTS_URL}" -p "${PACKAGE_PATH}"
|
||||
|
||||
git add index.yaml
|
||||
git commit --message="Update index.yaml" --signoff
|
||||
git push "${GIT_REPOSITORY_URL}" gh-pages
|
||||
}
|
||||
|
||||
main() {
|
||||
pushd "${REPO_ROOT}" >/dev/null || exit 1
|
||||
|
||||
echo "Fetching tags"
|
||||
git fetch --tags
|
||||
|
||||
local latest_tag
|
||||
latest_tag=$(find_latest_tag)
|
||||
|
||||
local latest_tag_rev
|
||||
latest_tag_rev=$(git rev-parse --verify "${latest_tag}")
|
||||
echo "${latest_tag_rev} ${latest_tag} (latest tag)"
|
||||
|
||||
local head_rev
|
||||
head_rev=$(git rev-parse --verify HEAD)
|
||||
echo "${head_rev} HEAD"
|
||||
|
||||
if [[ "${latest_tag_rev}" == "${head_rev}" ]]; then
|
||||
echo "No code changes. Nothing to release."
|
||||
exit
|
||||
fi
|
||||
|
||||
mkdir -p "${PACKAGE_PATH}"
|
||||
|
||||
echo "Identifying changed charts since tag ${latest_tag}"
|
||||
|
||||
local changed_charts=()
|
||||
readarray -t changed_charts <<< "$(git diff --find-renames --name-only "${latest_tag_rev}" | grep 'Chart.yaml$' | cut -d '/' -f 1 | sort -u)"
|
||||
|
||||
if [[ -n "${changed_charts[*]}" ]]; then
|
||||
local release_pending=no
|
||||
for chart in "${changed_charts[@]}"; do
|
||||
if [[ -f "${chart}/Chart.yaml" ]]; then
|
||||
release_pending=yes
|
||||
echo "Packaging chart ${chart}"
|
||||
package_chart "${chart}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "${release_pending}" == "yes" ]]; then
|
||||
release_charts
|
||||
update_index
|
||||
else
|
||||
echo "Nothing to do. No chart changes detected."
|
||||
fi
|
||||
else
|
||||
echo "Nothing to do. No chart changes detected."
|
||||
fi
|
||||
|
||||
popd >/dev/null || exit 1
|
||||
}
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user