-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelmlint.sh
executable file
·146 lines (121 loc) · 4.56 KB
/
helmlint.sh
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
#!/usr/bin/env bash
# -----------------------------------------------------------------------
# Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------
# helmlint.sh
# run `helm lint` on all helm charts that are found
# -----------------------------------------------------------------------
# [TODO] use set -e else errors can fly under the radar
set +e -o pipefail
declare -g iam="${0##*/}"
# verify that we have helm installed
command -v helm >/dev/null 2>&1 || { echo "helm not found, please install it" >&2; exit 1; }
echo "# helmlint.sh, using helm version: $(helm version -c --short) #"
# Collect success/failure, and list/types of failures
fail_lint=0
declare -a failed_deps=()
declare -a failed_lint=()
declare -a failed_reqs=()
# when not running under Jenkins, use current dir as workspace
WORKSPACE=${WORKSPACE:-.}
# cleanup repos if `clean` option passed as parameter
# update then move set -u to set [+-]e -o pipefail above
# if [[ $# -gt 0 ]] && [[ "$1" = 'clean' ]]; then <--- allow set -u
if [ "$1" = "clean" ]
then
echo "Removing any downloaded charts"
find "${WORKSPACE}" -type d -name 'charts' -exec rm -rf {} \;
fi
# now that $1 is checked, error on undefined vars
set -u
# loop on result of 'find -name Chart.yaml'
while IFS= read -r -d '' chart
do
chartdir=$(dirname "${chart}")
echo "Checking chart: $chartdir"
# update dependencies (if any)
if ! helm dependency update "${chartdir}";
then
fail_lint=1
failed_deps+=("${chartdir}")
fi
# lint the chart (with values.yaml if it exists)
if [ -f "${chartdir}/values.yaml" ]; then
helm lint --strict --values "${chartdir}/values.yaml" "${chartdir}"
else
helm lint --strict "${chartdir}"
fi
rc=$?
if [[ $rc != 0 ]]; then
fail_lint=1
failed_lint+=("${chartdir}")
fi
# -----------------------------------------------------------------------
# check that requirements are available if they're specified
# how is this check different than helm dep up above ?
# -----------------------------------------------------------------------
# later helm versions allow requirements.yaml to be defined directly in
# Chart.yaml so an explicit check may no longer be needed.
#
# Should we err when requirements.yaml detected to cleanup old code ?
# -----------------------------------------------------------------------
if [ -f "${chartdir}/requirements.yaml" ];
then
echo "Chart has requirements.yaml, checking availability"
if ! helm dependency update "${chartdir}"; then
fail_lint=1
failed_reqs+=("${chartdir}")
fi
# remove charts dir after checking for availability, as this chart might be
# required by other charts in the next loop
rm -rf "${chartdir}/charts"
fi
done < <(find "${WORKSPACE}" -name Chart.yaml -print0)
if [[ $fail_lint != 0 ]]; then
cat <<EOM
** -----------------------------------------------------------------------
** ${iam}: Errors Detected
** -----------------------------------------------------------------------
EOM
# echo "Charts that failed to lint: $failed_lint"
if [ ${#failed_lint[@]} -gt 0 ]; then
echo "Charts that failed to lint:"
for chart in "${failed_lint[@]}";
do
echo " $chart"
done
fi
if [ ${#failed_deps[@]} -gt 0 ]; then
echo "Charts that failed helm dependency update:"
for chart in "${failed_deps[@]}";
do
echo " $chart"
done
fi
if [ ${#failed_reqs[@]} -gt 0 ]; then
echo "Charts with failures in requirements.yaml:"
for chart in "${failed_reqs[@]}";
do
echo " $chart"
done
fi
echo
echo "See Also:"
echo " o https://wiki.opennetworking.org/display/VOLTHA/make+lint-helm"
echo
exit 1
fi
echo "# helmlint.sh Success! - all charts linted and have valid requirements.yaml #"
exit 0