- Added debug mode, structured ConfigMap pattern, and README to all charts - Migrated all flat-structure charts to hierarchical values under chartname key - Fixed templates to use correct hierarchical paths - Renamed helm-rustical key to rustical, added HPA support - Fixed ingress YAML parsing (oxicloud), nested env vars (rustical) - Pushed all normalized charts to OCI registry as 1.0.0+ and updated ArgoCD apps
174 lines
4.4 KiB
Bash
Executable file
174 lines
4.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
PROJECTS_DIR="k8s/services/argo"
|
|
APPS_DIR="k8s/argo-apps"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $(basename "$0") [OPTIONS]
|
|
|
|
List and manage source repos in ArgoCD projects.
|
|
|
|
OPTIONS:
|
|
-l, --list List all source repos (default)
|
|
-u, --unused List unused source repos
|
|
-d, --delete-unused Delete unused source repos from projects
|
|
-h, --help Show this help message
|
|
|
|
Examples:
|
|
$(basename "$0") # List all source repos
|
|
$(basename "$0") -u # List unused source repos
|
|
$(basename "$0") -d # Delete unused source repos
|
|
EOF
|
|
}
|
|
|
|
get_all_project_repos() {
|
|
awk '/^[[:space:]]*sourceRepos:/,/^[[:space:]]*[a-z]+:/' "$PROJECTS_DIR"/project-*.yaml | \
|
|
grep -E '^[[:space:]]+-[[:space:]]+' | \
|
|
sed 's/^[[:space:]]*- //' | \
|
|
sort -u
|
|
}
|
|
|
|
get_all_app_repos() {
|
|
grep -E '(^\s+-\s+repoURL:|^\s+repoURL:)' "$APPS_DIR"/*.yaml 2>/dev/null | \
|
|
sed 's/.*repoURL: *//' | \
|
|
sort -u
|
|
}
|
|
|
|
get_project_name_from_repo() {
|
|
local repo="$1"
|
|
for project_file in "$PROJECTS_DIR"/project-*.yaml; do
|
|
local project_name
|
|
project_name=$(basename "$project_file" .yaml | sed 's/^project-//')
|
|
if awk '/^[[:space:]]*sourceRepos:/,/^[[:space:]]*[a-z]+:/' "$project_file" | \
|
|
grep -qE "^[[:space:]]+- ${repo//\./\\.}$"; then
|
|
echo "$project_name"
|
|
return
|
|
fi
|
|
done
|
|
}
|
|
|
|
list_all() {
|
|
echo "=== All Source Repos in ArgoCD Projects ==="
|
|
echo ""
|
|
while IFS= read -r repo; do
|
|
local project
|
|
project=$(get_project_name_from_repo "$repo")
|
|
echo "[$project] $repo"
|
|
done < <(get_all_project_repos)
|
|
}
|
|
|
|
list_unused() {
|
|
local all_repos
|
|
local all_app_repos
|
|
all_repos=$(get_all_project_repos)
|
|
all_app_repos=$(get_all_app_repos)
|
|
|
|
echo "=== Unused Source Repos ==="
|
|
echo ""
|
|
|
|
local found_unused=false
|
|
while IFS= read -r repo; do
|
|
if ! echo "$all_app_repos" | grep -qF -- "$repo"; then
|
|
found_unused=true
|
|
local project
|
|
project=$(get_project_name_from_repo "$repo")
|
|
echo "[$project] $repo"
|
|
fi
|
|
done < <(echo "$all_repos")
|
|
|
|
if [ "$found_unused" = false ]; then
|
|
echo "No unused source repos found."
|
|
fi
|
|
}
|
|
|
|
delete_unused() {
|
|
local all_repos
|
|
local all_app_repos
|
|
all_repos=$(get_all_project_repos)
|
|
all_app_repos=$(get_all_app_repos)
|
|
|
|
local found_unused=false
|
|
local to_delete=()
|
|
|
|
while IFS= read -r repo; do
|
|
if ! echo "$all_app_repos" | grep -qF -- "$repo"; then
|
|
found_unused=true
|
|
to_delete+=("$repo")
|
|
fi
|
|
done < <(echo "$all_repos")
|
|
|
|
if [ "$found_unused" = false ]; then
|
|
echo "No unused source repos found."
|
|
return
|
|
fi
|
|
|
|
echo "The following source repos will be deleted:"
|
|
echo ""
|
|
for repo in "${to_delete[@]}"; do
|
|
local project
|
|
project=$(get_project_name_from_repo "$repo")
|
|
echo "[$project] $repo"
|
|
done
|
|
echo ""
|
|
|
|
read -p "Are you sure? [y/N] " -r
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Aborted."
|
|
return
|
|
fi
|
|
|
|
for repo in "${to_delete[@]}"; do
|
|
for project_file in "$PROJECTS_DIR"/project-*.yaml; do
|
|
if grep -q "sourceRepos:" "$project_file"; then
|
|
local escaped_repo
|
|
escaped_repo="${repo//\./\\.}"
|
|
if grep -qE "^[[:space:]]+- $escaped_repo$" "$project_file"; then
|
|
sed -i "s|^[[:space:]]*- $escaped_repo$||" "$project_file"
|
|
sed -i '/^[[:space:]]*-$/d' "$project_file"
|
|
sed -i '/^[[:space:]]*$/d' "$project_file"
|
|
echo "Deleted '$repo' from $(basename "$project_file")"
|
|
fi
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
COMMAND="list_all"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-l|--list)
|
|
COMMAND="list_all"
|
|
;;
|
|
-u|--unused)
|
|
COMMAND="list_unused"
|
|
;;
|
|
-d|--delete-unused)
|
|
COMMAND="delete_unused"
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
case "$COMMAND" in
|
|
list_all)
|
|
list_all
|
|
;;
|
|
list_unused)
|
|
list_unused
|
|
;;
|
|
delete_unused)
|
|
delete_unused
|
|
;;
|
|
esac
|