#!/bin/bash function check_version() { chart_path=${1:?"No chart path provided to [Version Check]"} target_branch=${2:?"No target branch provided to [Version Check]"} new=$(git diff "$target_branch" -- "$chart_path" | sed -nr 's/^\+version: (.*)$/\1/p') old=$(git diff "$target_branch" -- "$chart_path" | sed -nr 's/^\-version: (.*)$/\1/p') if [[ -z "$new" ]]; then echo -e "\t❌ Chart version: Not changed" curr_result=1 fi echo -e "\tπŸ”™ Old Chart Version: $old" echo -e "\tπŸ†• New Chart Version: $new" if [[ $(echo "$new\n$old" | sort -V -r | head -n1) != "$old" ]]; then echo -e "\tβœ… Chart version: Bumped" else echo -e "\t❌ Chart version: Not bumped or downgraded" curr_result=1 fi } export -f check_version function check_chart_schema(){ chart_path=${1:?"No chart path provided to [Chart.yaml lint]"} yamale_output=$(yamale --schema .github/chart_schema.yaml "$chart_path/Chart.yaml") yamale_exit_code=$? while IFS= read -r line; do echo -e "\t$line" done <<< "$yamale_output" if [ $yamale_exit_code -ne 0 ]; then echo -e "\t❌ Chart Schema: Failed" curr_result=1 else echo -e "\tβœ… Chart Schema: Passed" fi } export -f check_chart_schema function helm_lint(){ chart_path=${1:?"No chart path provided to [Helm lint]"} # Print only errors and warnings helm_lint_output=$(helm lint --quiet "$chart_path") helm_lint_exit_code=$? while IFS= read -r line; do echo -e "\t$line" done <<< "$helm_lint_output" if [ $helm_lint_exit_code -ne 0 ]; then echo -e "\t❌ Helm Lint: Failed" curr_result=1 else echo -e "\tβœ… Helm Lint: Passed" fi } export -f helm_lint function yaml_lint(){ file_path=${1:?"No file path provided to [YAML lint]"} yaml_lint_output=$(yamllint --config-file .github/yaml-lint-conf.yaml "$file_path") yaml_lint_exit_code=$? while IFS= read -r line; do echo -e "\t$line" done <<< "$yaml_lint_output" if [ $yaml_lint_exit_code -ne 0 ]; then echo -e "\t❌ YAML Lint: Failed [$file_path]" curr_result=1 else echo -e "\tβœ… YAML Lint: Passed [$file_path]" fi } export -f yaml_lint function lint_chart(){ chart_path=${1:?"No chart path provided to [Lint Chart]"} target_branch=${2:?"No target branch provided to [Lint Chart]"} status_file=${3:?"No status file provided to [Lint Chart]"} curr_result_file=/tmp/$(basename "$chart_path") curr_result=0 { start_time=$(date +%s) echo '---------------------------------------------------------------------------------------' echo "## πŸ”Linting [$chart_path]" echo '----------------------------------------------' echo '' echo "πŸ‘£ Helm Lint - [$chart_path]" helm_lint "$chart_path" echo "πŸ‘£ Chart Version - [$chart_path] against [$target_branch]" check_version "$chart_path" "$target_branch" echo "πŸ‘£ Chart Schema - [$chart_path]" check_chart_schema "$chart_path" echo "πŸ‘£ YAML Lint - [$chart_path/Chart.yaml]" yaml_lint "$chart_path/Chart.yaml" echo "πŸ‘£ YAML Lint - [$chart_path/values.yaml]" yaml_lint "$chart_path/values.yaml" for values in $chart_path/ci/*values.yaml; do if [ -f "${values}" ]; then echo "πŸ‘£ YAML Lint - [$values]" yaml_lint "$values" fi done end_time=$(date +%s) diff_time=$((end_time - start_time)) echo -e "\nResult:" if [ $curr_result -ne 0 ]; then echo "❌ Linting [$chart_path]: Failed - Took $diff_time seconds" | tee -a "$result_file" else echo "βœ… Linting [$chart_path]: Passed - Took $diff_time seconds" | tee -a "$result_file" fi echo '---------------------------------------------------------------------------------------' echo '' } > "$curr_result_file" cat "$curr_result_file" echo $curr_result >> "$status_file" } export -f lint_chart # Start of script charts=$1 target_branch=${2:-"origin/master"} status_file="/tmp/status" exit_code=0 result_file=${result_file:?"No result file provided"} changed=$(echo $charts | jq --raw-output '.[]') echo "πŸ“‚ Charts to lint:" for chart in $changed; do echo -e "\t- πŸ“„ $chart" done echo '' start_time=$(date +%s) # Run lint_chart in parallel parallel --jobs $(($(nproc) * 2)) "lint_chart {} $target_branch $status_file" ::: $changed || true if grep -q 1 "$status_file"; then exit_code=1 fi end_time=$(date +%s) diff_time=$((end_time - start_time)) echo '------------------------------------' # Print summary sorted=$(cat "$result_file" | sort) sorted=$(echo "$sorted" | sed 's/βœ…/:heavy_check_mark:/g') sorted=$(echo "$sorted" | sed 's/❌/:heavy_multiplication_x:/g') echo "# πŸ“ Linting results:" | tee "$result_file" echo '=====================================================================================' echo "$sorted" | tee -a "$result_file" echo '' echo -e "Total Charts Linted: **$(echo "$sorted" | wc -l)**" | tee -a "$result_file" echo -e "Total Charts Passed: **$(echo "$sorted" | grep -c 'heavy_check_mark')**" | tee -a "$result_file" echo -e "Total Charts Failed: **$(echo "$sorted" | grep -c 'heavy_multiplication_x')**" | tee -a "$result_file" echo '=====================================================================================' echo '' | tee -a "$result_file" if [ $exit_code -ne 0 ]; then echo "❌ Linting: **Failed** - Took $diff_time seconds" | tee -a "$result_file" else echo "βœ… Linting: **Passed** - Took $diff_time seconds" | tee -a "$result_file" fi exit $exit_code