From 97cc53b942e4f8e71540b807baab2fb569505001 Mon Sep 17 00:00:00 2001 From: Mykhailo Bobrovskyi Date: Mon, 5 Aug 2024 10:24:38 +0300 Subject: [PATCH] Enable shellcheck errors. (#2763) * Enable SC2269 shellcheck. * Enable SC1091 shellcheck. * Enable SC2155 shellcheck. * Enable SC2034 shellcheck. * Enable SC2046 shellcheck. * Enable SC2086 shellcheck. --- .shellcheckrc | 28 ----- .../kjobctl/hack/update-codegen.sh | 12 +- .../podtaintstolerations/hack/e2e-test.sh | 36 +++--- hack/dump_cache.sh | 6 +- hack/e2e-common.sh | 45 ++++---- hack/e2e-test.sh | 24 ++-- hack/multikueue-e2e-test.sh | 64 +++++------ hack/multiplatform-build.sh | 20 ++-- hack/push-chart.sh | 8 +- hack/update-codegen.sh | 10 +- hack/update-helm.sh | 104 +++++++++--------- hack/verify-shellcheck.sh | 1 - .../create-multikueue-kubeconfig.sh | 8 +- test/performance/e2e/jobs/run-test.sh | 4 +- test/performance/e2e/podgroups/run-test.sh | 2 +- 15 files changed, 180 insertions(+), 192 deletions(-) diff --git a/.shellcheckrc b/.shellcheckrc index 4e0fa658aa..01ec28916f 100644 --- a/.shellcheckrc +++ b/.shellcheckrc @@ -5,31 +5,3 @@ # we need this because we specify one file at a time in order to trivially # detect which files are failing external-sources=true - -# Currently disabled these errors will take care of them later - -# Not following: (error message here) -# This variable is assigned to itself, so the assignment does nothing. -# https://github.com/koalaman/shellcheck/wiki/SC2269 -disable=SC2269 -# Reasons include: file not found, no permissions, not included on the command line, not allowing shellcheck to follow files with -x, etc. -# https://github.com/koalaman/shellcheck/wiki/SC1091 -disable=SC1091 -# Since you double quoted this, it will not word split, and the loop will only run once -# https://github.com/koalaman/shellcheck/wiki/SC2066 -disable=SC2066 -# Double quote to prevent globbing and word splitting -# https://github.com/koalaman/shellcheck/wiki/SC2086 -disable=SC2086 -# foo appears unused. Verify it or export it -# https://github.com/koalaman/shellcheck/wiki/SC2034 -disable=SC2034 -# This {/} is literal. Check if ; is missing or quote the expression. -# https://github.com/koalaman/shellcheck/wiki/SC1083 -disable=SC1083 -# Declare and assign separately to avoid masking return values -# https://github.com/koalaman/shellcheck/wiki/SC2155 -disable=SC2155 -# Quote this to prevent word splitting -# https://github.com/koalaman/shellcheck/wiki/SC2046 -disable=SC2046 diff --git a/cmd/experimental/kjobctl/hack/update-codegen.sh b/cmd/experimental/kjobctl/hack/update-codegen.sh index 5b0d85b43b..bc9656b215 100755 --- a/cmd/experimental/kjobctl/hack/update-codegen.sh +++ b/cmd/experimental/kjobctl/hack/update-codegen.sh @@ -19,21 +19,23 @@ set -o nounset set -o pipefail GO_CMD=${1:-go} -KJOBCTL_ROOT=$(realpath $(dirname ${BASH_SOURCE[0]})/..) +CURRENT_DIR=$(dirname "${BASH_SOURCE[0]}") +KJOBCTL_ROOT=$(realpath "$CURRENT_DIR/..") KJOBCTL_PKG="sigs.k8s.io/kueue/cmd/experimental/kjobctl" -CODEGEN_PKG=$(cd $TOOLS_DIR && go mod download && $GO_CMD list -m -f "{{.Dir}}" k8s.io/code-generator) +CODEGEN_PKG=$(cd "$TOOLS_DIR" && go mod download && $GO_CMD list -m -f "{{.Dir}}" k8s.io/code-generator) -cd $(dirname ${BASH_SOURCE[0]})/.. +cd "$CURRENT_DIR/.." +# shellcheck source=/dev/null source "${CODEGEN_PKG}/kube_codegen.sh" # Generating conversion and defaults functions kube::codegen::gen_helpers \ - --boilerplate ${KJOBCTL_ROOT}/hack/boilerplate.go.txt \ + --boilerplate "${KJOBCTL_ROOT}/hack/boilerplate.go.txt" \ "${KJOBCTL_ROOT}" kube::codegen::gen_client \ - --boilerplate ${KJOBCTL_ROOT}/hack/boilerplate.go.txt \ + --boilerplate "${KJOBCTL_ROOT}/hack/boilerplate.go.txt" \ --output-dir "${KJOBCTL_ROOT}/client-go" \ --output-pkg "${KJOBCTL_PKG}/client-go" \ "${KJOBCTL_ROOT}" diff --git a/cmd/experimental/podtaintstolerations/hack/e2e-test.sh b/cmd/experimental/podtaintstolerations/hack/e2e-test.sh index 7d239051f8..98d8a3ea70 100755 --- a/cmd/experimental/podtaintstolerations/hack/e2e-test.sh +++ b/cmd/experimental/podtaintstolerations/hack/e2e-test.sh @@ -25,37 +25,37 @@ export GINKGO="$ROOT_DIR"/bin/ginkgo export KIND="$ROOT_DIR"/bin/kind function cleanup { - if [ $CREATE_KIND_CLUSTER == 'true' ]; then + if [ "$CREATE_KIND_CLUSTER" == 'true' ]; then if [ ! -d "$ARTIFACTS" ]; then mkdir -p "$ARTIFACTS" fi - kubectl logs -n kube-system kube-scheduler-kind-control-plane >$ARTIFACTS/kube-scheduler.log || true - kubectl logs -n kube-system kube-controller-manager-kind-control-plane >$ARTIFACTS/kube-controller-manager.log || true - kubectl logs -n kueue-system deployment/kueue-controller-manager >$ARTIFACTS/kueue-controller-manager.log || true - kubectl logs -n kueue-system deployment/kueue-podtaintstolerations >$ARTIFACTS/kueue-controller-manager.log || true - kubectl describe pods -n kueue-system >$ARTIFACTS/kueue-system-pods.log || true - $KIND delete cluster --name $KIND_CLUSTER_NAME + kubectl logs -n kube-system kube-scheduler-kind-control-plane > "$ARTIFACTS/kube-scheduler.log" || true + kubectl logs -n kube-system kube-controller-manager-kind-control-plane > "$ARTIFACTS/kube-controller-manager.log" || true + kubectl logs -n kueue-system deployment/kueue-controller-manager > "$ARTIFACTS/kueue-controller-manager.log" || true + kubectl logs -n kueue-system deployment/kueue-podtaintstolerations > "$ARTIFACTS/kueue-controller-manager.log" || true + kubectl describe pods -n kueue-system > "$ARTIFACTS/kueue-system-pods.log" || true + $KIND delete cluster --name "$KIND_CLUSTER_NAME" fi (cd test/e2e/config && $KUSTOMIZE edit set image controller=controller) } function startup { - if [ $CREATE_KIND_CLUSTER == 'true' ]; then + if [ "$CREATE_KIND_CLUSTER" == 'true' ]; then if [ ! -d "$ARTIFACTS" ]; then mkdir -p "$ARTIFACTS" fi $KIND create cluster --name "$KIND_CLUSTER_NAME" --image "$E2E_KIND_VERSION" --config "$SOURCE_DIR/kind-cluster.yaml" --wait 15m -v 5 >"$ARTIFACTS"/kind-create.log 2>&1 || { echo "unable to start the kind cluster " - cat $ARTIFACTS/kind-create.log + cat "$ARTIFACTS/kind-create.log" } - kubectl get nodes >$ARTIFACTS/kind-nodes.log || true - kubectl describe pods -n kube-system >$ARTIFACTS/kube-system-pods.log || true + kubectl get nodes > "$ARTIFACTS/kind-nodes.log" || true + kubectl describe pods -n kube-system > "$ARTIFACTS/kube-system-pods.log" || true fi } function kind_load { - $KIND load docker-image $CONTROLLER_IMAGE --name $KIND_CLUSTER_NAME + $KIND load docker-image "$CONTROLLER_IMAGE" --name "$KIND_CLUSTER_NAME" } function kueue_deploy { @@ -63,16 +63,16 @@ function kueue_deploy { } function controller_deploy { - (cd test/e2e/config && $KUSTOMIZE edit set image controller=$CONTROLLER_IMAGE) + (cd test/e2e/config && $KUSTOMIZE edit set image controller="$CONTROLLER_IMAGE") kubectl apply --server-side -k test/e2e/config } function taint_nodes { - kubectl taint nodes $KIND_CLUSTER_NAME-worker2 --overwrite tier=spot:NoSchedule - kubectl taint nodes $KIND_CLUSTER_NAME-worker2 --overwrite company.com/kueue-admission:NoSchedule + kubectl taint nodes "$KIND_CLUSTER_NAME-worker2" --overwrite tier=spot:NoSchedule + kubectl taint nodes "$KIND_CLUSTER_NAME-worker2" --overwrite company.com/kueue-admission:NoSchedule - kubectl taint nodes $KIND_CLUSTER_NAME-worker3 --overwrite tier=regular:NoSchedule - kubectl taint nodes $KIND_CLUSTER_NAME-worker3 --overwrite company.com/kueue-admission:NoSchedule + kubectl taint nodes "$KIND_CLUSTER_NAME-worker3" --overwrite tier=regular:NoSchedule + kubectl taint nodes "$KIND_CLUSTER_NAME-worker3" --overwrite company.com/kueue-admission:NoSchedule } trap cleanup EXIT @@ -81,4 +81,4 @@ taint_nodes kind_load kueue_deploy controller_deploy -$GINKGO --junit-report=junit.xml --output-dir=$ARTIFACTS -v ./test/e2e/... +$GINKGO --junit-report=junit.xml --output-dir="$ARTIFACTS" -v ./test/e2e/... diff --git a/hack/dump_cache.sh b/hack/dump_cache.sh index 33668a2a3d..1c6c643179 100755 --- a/hack/dump_cache.sh +++ b/hack/dump_cache.sh @@ -24,11 +24,11 @@ NAMESPACE=${NAMESPACE:-kueue-system} LEASE_NAME=${LEASE_NAME:-c1f6bfd2.kueue.x-k8s.io} DEBUG_IMAGE=${DEBUG_IMAGE:-us-central1-docker.pkg.dev/k8s-staging-images/kueue/debug:main} -leader=$(kubectl get lease -n ${NAMESPACE} ${LEASE_NAME} -o jsonpath='{.spec.holderIdentity}' | cut -d '_' -f 1) +leader=$(kubectl get lease -n "${NAMESPACE}" "${LEASE_NAME}" -o jsonpath='{.spec.holderIdentity}' | cut -d '_' -f 1) # When the FOLLOW environment variable is set, output the logs. if [ -v FOLLOW ]; then - kubectl logs -n ${NAMESPACE} ${leader} -f --tail=1 & + kubectl logs -n "${NAMESPACE}" "${leader}" -f --tail=1 & fi -kubectl debug -n ${NAMESPACE} ${leader} --image=${DEBUG_IMAGE} --target=manager --profile=restricted --image-pull-policy=IfNotPresent -- sh -c 'kill -USR2 1' +kubectl debug -n "${NAMESPACE}" "${leader}" --image="${DEBUG_IMAGE}" --target=manager --profile=restricted --image-pull-policy=IfNotPresent -- sh -c 'kill -USR2 1' diff --git a/hack/e2e-common.sh b/hack/e2e-common.sh index b08854d8d0..850e17f098 100644 --- a/hack/e2e-common.sh +++ b/hack/e2e-common.sh @@ -30,57 +30,58 @@ export KUBEFLOW_CRDS=${ROOT_DIR}/dep-crds/training-operator/ # $1 - cluster name function cluster_cleanup { - kubectl config use-context kind-$1 - $KIND export logs $ARTIFACTS --name $1 || true - kubectl describe pods -n kueue-system > $ARTIFACTS/$1-kueue-system-pods.log || true - kubectl describe pods > $ARTIFACTS/$1-default-pods.log || true - $KIND delete cluster --name $1 + kubectl config use-context "kind-$1" + $KIND export logs "$ARTIFACTS" --name "$1" || true + kubectl describe pods -n kueue-system > "$ARTIFACTS/$1-kueue-system-pods.log" || true + kubectl describe pods > "$ARTIFACTS/$1-default-pods.log" || true + $KIND delete cluster --name "$1" } # $1 cluster name # $2 cluster kind config function cluster_create { - $KIND create cluster --name $1 --image $E2E_KIND_VERSION --config $2 --wait 1m -v 5 > $ARTIFACTS/$1-create.log 2>&1 \ - || { echo "unable to start the $1 cluster "; cat $ARTIFACTS/$1-create.log ; } - kubectl config use-context kind-$1 - kubectl get nodes > $ARTIFACTS/$1-nodes.log || true - kubectl describe pods -n kube-system > $ARTIFACTS/$1-system-pods.log || true + $KIND create cluster --name "$1" --image "$E2E_KIND_VERSION" --config "$2" --wait 1m -v 5 > "$ARTIFACTS/$1-create.log" 2>&1 \ + || { echo "unable to start the $1 cluster "; cat "$ARTIFACTS/$1-create.log" ; } + kubectl config use-context "kind-$1" + kubectl get nodes > "$ARTIFACTS/$1-nodes.log" || true + kubectl describe pods -n kube-system > "$ARTIFACTS/$1-system-pods.log" || true } # $1 cluster function cluster_kind_load { - cluster_kind_load_image $1 $E2E_TEST_IMAGE - cluster_kind_load_image $1 $IMAGE_TAG + cluster_kind_load_image "$1" "$E2E_TEST_IMAGE" + cluster_kind_load_image "$1" "$IMAGE_TAG" } # $1 cluster # $2 image function cluster_kind_load_image { - $KIND load docker-image $2 --name $1 + $KIND load docker-image "$2" --name "$1" } # $1 cluster function cluster_kueue_deploy { - kubectl config use-context kind-${1} + kubectl config use-context "kind-${1}" kubectl apply --server-side -k test/e2e/config } #$1 - cluster name function install_jobset { - cluster_kind_load_image ${1} ${JOBSET_IMAGE} - kubectl config use-context kind-${1} - kubectl apply --server-side -f ${JOBSET_MANIFEST} + cluster_kind_load_image "${1}" "${JOBSET_IMAGE}" + kubectl config use-context "kind-${1}" + kubectl apply --server-side -f "${JOBSET_MANIFEST}" } #$1 - cluster name function install_kubeflow { - cluster_kind_load_image ${1} ${KUBEFLOW_IMAGE} - kubectl config use-context kind-${1} - kubectl apply -k ${KUBEFLOW_MANIFEST} + cluster_kind_load_image "${1}" ${KUBEFLOW_IMAGE} + kubectl config use-context "kind-${1}" + kubectl apply -k "${KUBEFLOW_MANIFEST}" } -export INITIAL_IMAGE=$($YQ '.images[] | select(.name == "controller") | [.newName, .newTag] | join(":")' config/components/manager/kustomization.yaml) +INITIAL_IMAGE=$($YQ '.images[] | select(.name == "controller") | [.newName, .newTag] | join(":")' config/components/manager/kustomization.yaml) +export INITIAL_IMAGE function restore_managers_image { - (cd config/components/manager && $KUSTOMIZE edit set image controller=$INITIAL_IMAGE) + (cd config/components/manager && $KUSTOMIZE edit set image controller="$INITIAL_IMAGE") } diff --git a/hack/e2e-test.sh b/hack/e2e-test.sh index b0ea34ec0f..05a313ef46 100755 --- a/hack/e2e-test.sh +++ b/hack/e2e-test.sh @@ -22,22 +22,23 @@ SOURCE_DIR="$(cd "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" ROOT_DIR="$SOURCE_DIR/.." export E2E_TEST_IMAGE=gcr.io/k8s-staging-perf-tests/sleep:v0.1.0 -source ${SOURCE_DIR}/e2e-common.sh +# shellcheck source=hack/e2e-common.sh +source "${SOURCE_DIR}/e2e-common.sh" function cleanup { - if [ $CREATE_KIND_CLUSTER == 'true' ] + if [ "$CREATE_KIND_CLUSTER" == 'true' ] then if [ ! -d "$ARTIFACTS" ]; then mkdir -p "$ARTIFACTS" fi - cluster_cleanup $KIND_CLUSTER_NAME + cluster_cleanup "$KIND_CLUSTER_NAME" fi #do the image restore here for the case when an error happened during deploy restore_managers_image } function startup { - if [ $CREATE_KIND_CLUSTER == 'true' ] + if [ "$CREATE_KIND_CLUSTER" == 'true' ] then if [ ! -d "$ARTIFACTS" ]; then mkdir -p "$ARTIFACTS" @@ -47,22 +48,23 @@ function startup { } function kind_load { - if [ $CREATE_KIND_CLUSTER == 'true' ] + if [ "$CREATE_KIND_CLUSTER" == 'true' ] then docker pull $E2E_TEST_IMAGE - cluster_kind_load $KIND_CLUSTER_NAME + cluster_kind_load "$KIND_CLUSTER_NAME" fi - docker pull registry.k8s.io/jobset/jobset:$JOBSET_VERSION - install_jobset $KIND_CLUSTER_NAME + docker pull "registry.k8s.io/jobset/jobset:$JOBSET_VERSION" + install_jobset "$KIND_CLUSTER_NAME" } function kueue_deploy { - (cd config/components/manager && $KUSTOMIZE edit set image controller=$IMAGE_TAG) - cluster_kueue_deploy $KIND_CLUSTER_NAME + (cd config/components/manager && $KUSTOMIZE edit set image controller="$IMAGE_TAG") + cluster_kueue_deploy "$KIND_CLUSTER_NAME" } trap cleanup EXIT startup kind_load kueue_deploy -$GINKGO $GINKGO_ARGS --junit-report=junit.xml --output-dir=$ARTIFACTS -v ./test/e2e/singlecluster/... +# shellcheck disable=SC2086 +$GINKGO $GINKGO_ARGS --junit-report=junit.xml --output-dir="$ARTIFACTS" -v ./test/e2e/singlecluster/... diff --git a/hack/multikueue-e2e-test.sh b/hack/multikueue-e2e-test.sh index 16da205d93..69dddbd68c 100755 --- a/hack/multikueue-e2e-test.sh +++ b/hack/multikueue-e2e-test.sh @@ -25,18 +25,19 @@ export MANAGER_KIND_CLUSTER_NAME=${KIND_CLUSTER_NAME}-manager export WORKER1_KIND_CLUSTER_NAME=${KIND_CLUSTER_NAME}-worker1 export WORKER2_KIND_CLUSTER_NAME=${KIND_CLUSTER_NAME}-worker2 -source ${SOURCE_DIR}/e2e-common.sh +# shellcheck source=hack/e2e-common.sh +source "${SOURCE_DIR}/e2e-common.sh" function cleanup { - if [ $CREATE_KIND_CLUSTER == 'true' ] + if [ "$CREATE_KIND_CLUSTER" == 'true' ] then if [ ! -d "$ARTIFACTS" ]; then mkdir -p "$ARTIFACTS" fi - cluster_cleanup $MANAGER_KIND_CLUSTER_NAME - cluster_cleanup $WORKER1_KIND_CLUSTER_NAME - cluster_cleanup $WORKER2_KIND_CLUSTER_NAME + cluster_cleanup "$MANAGER_KIND_CLUSTER_NAME" + cluster_cleanup "$WORKER1_KIND_CLUSTER_NAME" + cluster_cleanup "$WORKER2_KIND_CLUSTER_NAME" fi #do the image restore here for the case when an error happened during deploy restore_managers_image @@ -44,62 +45,61 @@ function cleanup { function startup { - if [ $CREATE_KIND_CLUSTER == 'true' ] + if [ "$CREATE_KIND_CLUSTER" == 'true' ] then if [ ! -d "$ARTIFACTS" ]; then mkdir -p "$ARTIFACTS" fi - KIND_VERSION=${E2E_KIND_VERSION/"kindest/node:v"/} - MANAGER_KIND_CONFIG="${SOURCE_DIR}/multikueue/manager-cluster.kind-${KIND_VERSION}.yaml" - if [ ! -f $MANAGER_KIND_CONFIG ]; then - MANAGER_KIND_CONFIG="${SOURCE_DIR}/multikueue/manager-cluster.kind.yaml" - fi - - echo "Using manager config: $MANAGER_KIND_CONFIG" + KIND_VERSION=${E2E_KIND_VERSION/"kindest/node:v"/} + MANAGER_KIND_CONFIG="${SOURCE_DIR}/multikueue/manager-cluster.kind-${KIND_VERSION}.yaml" + if [ ! -f "$MANAGER_KIND_CONFIG" ]; then + MANAGER_KIND_CONFIG="${SOURCE_DIR}/multikueue/manager-cluster.kind.yaml" + fi + echo "Using manager config: $MANAGER_KIND_CONFIG" cluster_create "$MANAGER_KIND_CLUSTER_NAME" "$MANAGER_KIND_CONFIG" - cluster_create $WORKER1_KIND_CLUSTER_NAME "$SOURCE_DIR/multikueue/worker-cluster.kind.yaml" - cluster_create $WORKER2_KIND_CLUSTER_NAME "$SOURCE_DIR/multikueue/worker-cluster.kind.yaml" + cluster_create "$WORKER1_KIND_CLUSTER_NAME" "$SOURCE_DIR/multikueue/worker-cluster.kind.yaml" + cluster_create "$WORKER2_KIND_CLUSTER_NAME" "$SOURCE_DIR/multikueue/worker-cluster.kind.yaml" fi } function kind_load { - if [ $CREATE_KIND_CLUSTER == 'true' ] + if [ "$CREATE_KIND_CLUSTER" == 'true' ] then docker pull $E2E_TEST_IMAGE - cluster_kind_load $MANAGER_KIND_CLUSTER_NAME - cluster_kind_load $WORKER1_KIND_CLUSTER_NAME - cluster_kind_load $WORKER2_KIND_CLUSTER_NAME + cluster_kind_load "$MANAGER_KIND_CLUSTER_NAME" + cluster_kind_load "$WORKER1_KIND_CLUSTER_NAME" + cluster_kind_load "$WORKER2_KIND_CLUSTER_NAME" # JOBSET SETUP - docker pull registry.k8s.io/jobset/jobset:$JOBSET_VERSION - install_jobset $MANAGER_KIND_CLUSTER_NAME - install_jobset $WORKER1_KIND_CLUSTER_NAME - install_jobset $WORKER2_KIND_CLUSTER_NAME + docker pull "registry.k8s.io/jobset/jobset:$JOBSET_VERSION" + install_jobset "$MANAGER_KIND_CLUSTER_NAME" + install_jobset "$WORKER1_KIND_CLUSTER_NAME" + install_jobset "$WORKER2_KIND_CLUSTER_NAME" # KUBEFLOW SETUP # MANAGER # Only install the CRDs and not the controller to be able to # have Kubeflow Jobs admitted without execution in the manager cluster. - kubectl config use-context kind-${MANAGER_KIND_CLUSTER_NAME} - kubectl apply -k ${KUBEFLOW_CRDS} + kubectl config use-context "kind-${MANAGER_KIND_CLUSTER_NAME}" + kubectl apply -k "${KUBEFLOW_CRDS}" # WORKERS docker pull kubeflow/training-operator:v1-855e096 - install_kubeflow $WORKER1_KIND_CLUSTER_NAME - install_kubeflow $WORKER2_KIND_CLUSTER_NAME + install_kubeflow "$WORKER1_KIND_CLUSTER_NAME" + install_kubeflow "$WORKER2_KIND_CLUSTER_NAME" fi } function kueue_deploy { - (cd config/components/manager && $KUSTOMIZE edit set image controller=$IMAGE_TAG) + (cd config/components/manager && $KUSTOMIZE edit set image controller="$IMAGE_TAG") - cluster_kueue_deploy $MANAGER_KIND_CLUSTER_NAME - cluster_kueue_deploy $WORKER1_KIND_CLUSTER_NAME - cluster_kueue_deploy $WORKER2_KIND_CLUSTER_NAME + cluster_kueue_deploy "$MANAGER_KIND_CLUSTER_NAME" + cluster_kueue_deploy "$WORKER1_KIND_CLUSTER_NAME" + cluster_kueue_deploy "$WORKER2_KIND_CLUSTER_NAME" } trap cleanup EXIT @@ -107,4 +107,4 @@ startup kind_load kueue_deploy -$GINKGO $GINKGO_ARGS --junit-report=junit.xml --output-dir=$ARTIFACTS -v ./test/e2e/multikueue/... +$GINKGO "$GINKGO_ARGS" --junit-report=junit.xml --output-dir="$ARTIFACTS" -v ./test/e2e/multikueue/... diff --git a/hack/multiplatform-build.sh b/hack/multiplatform-build.sh index 34f347cbd3..7de3770e5a 100755 --- a/hack/multiplatform-build.sh +++ b/hack/multiplatform-build.sh @@ -22,14 +22,14 @@ GO_BUILD_ENV=${GO_BUILD_ENV:-} GO_CMD=${GO_CMD:-go} LD_FLAGS=${LD_FLAGS:-} -BUILD_DIR=${BUILD_DIR} BUILD_NAME=${BUILD_NAME:-kueuectl} PLATFORMS=${PLATFORMS:-linux/amd64} -ROOT_PATH=$(realpath $(dirname ${BASH_SOURCE[0]})/..) +CURRENT_DIR=$(dirname "${BASH_SOURCE[0]}") +ROOT_PATH=$(realpath "${CURRENT_DIR}/..") BUILD_PATH=${ROOT_PATH}/${BUILD_DIR} -mkdir -p ${BUILD_PATH} +mkdir -p "${BUILD_PATH}" IFS="," for PLATFORM in ${PLATFORMS} ; do @@ -37,17 +37,17 @@ for PLATFORM in ${PLATFORMS} ; do export GOARCH="${PLATFORM#*/}" EXTENSION="" - if [ ${GOOS} == "windows" ]; then + if [ "${GOOS}" == "windows" ]; then EXTENSION=".exe" fi echo "Building for $PLATFORM platform" FULL_NAME=${BUILD_NAME}-${GOOS}-${GOARCH} - ${GO_BUILD_ENV} ${GO_CMD} build -ldflags="${LD_FLAGS}" -o ${BUILD_PATH}/${FULL_NAME}${EXTENSION} $1 + ${GO_BUILD_ENV} "${GO_CMD}" build -ldflags="${LD_FLAGS}" -o "${BUILD_PATH}/${FULL_NAME}${EXTENSION}" "$1" - mkdir -p ${BUILD_PATH}/tmp - cp ${ROOT_PATH}/LICENSE ${BUILD_PATH}/tmp - cp ${BUILD_PATH}/${FULL_NAME}${EXTENSION} ${BUILD_PATH}/tmp/${BUILD_NAME}${EXTENSION} - (cd ${BUILD_PATH}/tmp && tar -czf ${BUILD_PATH}/${FULL_NAME}.tar.gz ./*) - rm -R ${BUILD_PATH}/tmp + mkdir -p "${BUILD_PATH}/tmp" + cp "${ROOT_PATH}/LICENSE" "${BUILD_PATH}/tmp" + cp "${BUILD_PATH}/${FULL_NAME}${EXTENSION}" "${BUILD_PATH}/tmp/${BUILD_NAME}${EXTENSION}" + (cd "${BUILD_PATH}/tmp" && tar -czf "${BUILD_PATH}/${FULL_NAME}.tar.gz" ./*) + rm -R "${BUILD_PATH}/tmp" done diff --git a/hack/push-chart.sh b/hack/push-chart.sh index 1bdead6a82..388d82e373 100755 --- a/hack/push-chart.sh +++ b/hack/push-chart.sh @@ -38,13 +38,15 @@ then chart_version=${EXTRA_TAG} fi -readonly default_image_repo=$(${YQ} ".controllerManager.manager.image.repository" charts/kueue/values.yaml) +default_image_repo=$(${YQ} ".controllerManager.manager.image.repository" charts/kueue/values.yaml) +readonly default_image_repo + # Update the image repo, tag and policy ${YQ} e ".controllerManager.manager.image.repository = \"${image_repository}\" | .controllerManager.manager.image.tag = \"${chart_version}\" | .controllerManager.manager.image.pullPolicy = \"IfNotPresent\"" -i charts/kueue/values.yaml -${HELM} package --version ${chart_version} --app-version ${chart_version} charts/kueue -d ${DEST_CHART_DIR} +${HELM} package --version "${chart_version}" --app-version "${chart_version}" charts/kueue -d "${DEST_CHART_DIR}" # Revert the image changes ${YQ} e ".controllerManager.manager.image.repository = \"${default_image_repo}\" | .controllerManager.manager.image.tag = \"main\" | .controllerManager.manager.image.pullPolicy = \"Always\"" -i charts/kueue/values.yaml -${HELM} push bin/kueue-${chart_version}.tgz oci://${HELM_CHART_REPO} +${HELM} push "bin/kueue-${chart_version}.tgz" "oci://${HELM_CHART_REPO}" diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 95b11fcf3a..386aa49caa 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -19,10 +19,12 @@ set -o nounset set -o pipefail GO_CMD=${1:-go} -KUEUE_ROOT=$(realpath $(dirname ${BASH_SOURCE[0]})/..) +CURRENT_DIR=$(dirname "${BASH_SOURCE[0]}") +KUEUE_ROOT=$(realpath "${CURRENT_DIR}/..") CODEGEN_PKG=$($GO_CMD list -m -mod=readonly -f "{{.Dir}}" k8s.io/code-generator) -cd $(dirname ${BASH_SOURCE[0]})/.. +cd "${CURRENT_DIR}/.." +# shellcheck source=/dev/null source "${CODEGEN_PKG}/kube_codegen.sh" # TODO: remove the workaround when the issue is solved in the code-generator @@ -36,7 +38,7 @@ trap "rm sigs.k8s.io" EXIT kube::codegen::gen_helpers \ --input-pkg-root sigs.k8s.io/kueue/apis \ --output-base "${KUEUE_ROOT}" \ - --boilerplate ${KUEUE_ROOT}/hack/boilerplate.go.txt + --boilerplate "${KUEUE_ROOT}/hack/boilerplate.go.txt" # Generating OpenAPI for Kueue API extensions kube::codegen::gen_openapi \ @@ -50,7 +52,7 @@ kube::codegen::gen_client \ --input-pkg-root sigs.k8s.io/kueue/apis \ --output-pkg-root sigs.k8s.io/kueue/client-go \ --output-base "${KUEUE_ROOT}" \ - --boilerplate ${KUEUE_ROOT}/hack/boilerplate.go.txt \ + --boilerplate "${KUEUE_ROOT}/hack/boilerplate.go.txt" \ --with-watch \ --with-applyconfig diff --git a/hack/update-helm.sh b/hack/update-helm.sh index 9df51beffc..34f017524a 100755 --- a/hack/update-helm.sh +++ b/hack/update-helm.sh @@ -33,12 +33,17 @@ mkdir -p ${DEST_CRD_DIR} "${DEST_RBAC_DIR}" ${DEST_WEBHOOK_DIR} ${DEST_VISIBILIT # Add more excluded files separated by spaces EXCLUDE_FILES='kustomization.yaml kustomizeconfig.yaml' +# shellcheck disable=SC2086 +EXCLUDE_FILES_ARGS=$(printf "! -name %s " $EXCLUDE_FILES) # Copy all YAML files from the source directory to the destination directory cp ${SRC_CRD_DIR}/*.yaml ${DEST_CRD_DIR} -find $SRC_RBAC_DIR -name "*.yaml" $(printf "! -name %s " $EXCLUDE_FILES) -exec cp "{}" $DEST_RBAC_DIR \; -find $SRC_WEBHOOK_DIR -name "*.yaml" $(printf "! -name %s " $EXCLUDE_FILES) -exec cp "{}" $DEST_WEBHOOK_DIR \; -find $SRC_VISIBILITY_DIR -name "*.yaml" $(printf "! -name %s " $EXCLUDE_FILES) -exec cp "{}" $DEST_VISIBILITY_DIR \; +# shellcheck disable=SC2086 +find $SRC_RBAC_DIR -name "*.yaml" $EXCLUDE_FILES_ARGS -exec cp "{}" $DEST_RBAC_DIR \; +# shellcheck disable=SC2086 +find $SRC_WEBHOOK_DIR -name "*.yaml" $EXCLUDE_FILES_ARGS -exec cp "{}" $DEST_WEBHOOK_DIR \; +# shellcheck disable=SC2086 +find $SRC_VISIBILITY_DIR -name "*.yaml" $EXCLUDE_FILES_ARGS -exec cp "{}" $DEST_VISIBILITY_DIR \; $YQ -N -s '.kind' ${DEST_WEBHOOK_DIR}/manifests.yaml rm ${DEST_WEBHOOK_DIR}/manifests.yaml files=("MutatingWebhookConfiguration.yml" "ValidatingWebhookConfiguration.yml") @@ -151,7 +156,7 @@ EOF for output_file in "${DEST_CRD_DIR}"/*.yaml; do input_file="${output_file%.yaml}.yaml.test" mv "$output_file" "$input_file" - : >$output_file + : > "$output_file" while IFS= read -r line; do echo "$line" >>"$output_file" if [[ $line == "$search_cert_line" ]]; then @@ -159,32 +164,32 @@ for output_file in "${DEST_CRD_DIR}"/*.yaml; do elif [[ $line == "$search_webhook_line" ]]; then echo "$replace_webhook_line" >>"$output_file" fi - done <"$input_file" - rm $input_file - $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' $output_file + done < "$input_file" + rm "$input_file" + $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' "$output_file" done # Add RBAC files, replace names, namespaces in helm format, remove document separators (---) for output_file in "${DEST_RBAC_DIR}"/*.yaml; do - if [ "$(cat $output_file | $YQ '.metadata | has("name")')" = "true" ]; then - $YQ -N -i '.metadata.name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("name")')" = "true" ]; then + $YQ -N -i '.metadata.name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" fi - if [ "$(cat $output_file | $YQ '.metadata | has("namespace")')" = "true" ]; then - $YQ -N -i '.metadata.namespace = "{{ .Release.Namespace }}"' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("namespace")')" = "true" ]; then + $YQ -N -i '.metadata.namespace = "{{ .Release.Namespace }}"' "$output_file" fi - if [ "$(cat $output_file | $YQ '.roleRef | has("name")')" = "true" ]; then - $YQ -N -i '.roleRef.name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file + if [ "$(< "$output_file" $YQ '.roleRef | has("name")')" = "true" ]; then + $YQ -N -i '.roleRef.name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" fi - if [ "$(cat $output_file | $YQ '.subjects.[] | has("name")')" = "true" ]; then - $YQ -N -i '.subjects.[].name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file + if [ "$(< "$output_file" $YQ '.subjects.[] | has("name")')" = "true" ]; then + $YQ -N -i '.subjects.[].name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" fi - if [ "$(cat $output_file | $YQ '.subjects.[] | has("namespace")')" = "true" ]; then - $YQ -N -i '.subjects.[].namespace = "{{ .Release.Namespace }}"' $output_file + if [ "$(< "$output_file" $YQ '.subjects.[] | has("namespace")')" = "true" ]; then + $YQ -N -i '.subjects.[].namespace = "{{ .Release.Namespace }}"' "$output_file" fi - if [ "$(cat $output_file | $YQ '.metadata | has("labels")')" = "true" ]; then - $SED -i '/labels:.*/a\ {{- include "kueue.labels" . | nindent 4 }}' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("labels")')" = "true" ]; then + $SED -i '/labels:.*/a\ {{- include "kueue.labels" . | nindent 4 }}' "$output_file" else - $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' $output_file + $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' "$output_file" fi done @@ -195,22 +200,22 @@ webhook_files=( "${DEST_WEBHOOK_DIR}/service.yaml" ) for output_file in "${webhook_files[@]}"; do - if [ "$(cat $output_file | $YQ '.metadata | has("name")')" = "true" ]; then - $YQ -N -i '.metadata.name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("name")')" = "true" ]; then + $YQ -N -i '.metadata.name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" fi - if [ "$(cat $output_file | $YQ '.metadata | has("namespace")')" = "true" ]; then - $YQ -N -i '.metadata.namespace = "{{ .Release.Namespace }}"' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("namespace")')" = "true" ]; then + $YQ -N -i '.metadata.namespace = "{{ .Release.Namespace }}"' "$output_file" fi - $YQ -N -i '.webhooks.[].clientConfig.service.name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file - $YQ -N -i '.webhooks.[].clientConfig.service.namespace = "{{ .Release.Namespace }}"' $output_file - $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' $output_file + $YQ -N -i '.webhooks.[].clientConfig.service.name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" + $YQ -N -i '.webhooks.[].clientConfig.service.namespace = "{{ .Release.Namespace }}"' "$output_file" + $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' "$output_file" done # Add service values in the YAML files for output_file in ${DEST_WEBHOOK_DIR}/service.yaml; do input_file="${output_file%.yaml}.yaml.test" mv "$output_file" "$input_file" - : >$output_file + : > "$output_file" while IFS= read -r line; do echo "$line" >>"$output_file" if [[ $line == "$search_service_line" ]]; then @@ -218,7 +223,7 @@ for output_file in ${DEST_WEBHOOK_DIR}/service.yaml; do break fi done <"$input_file" - rm $input_file + rm "$input_file" done # Add webhook values in the YAML files @@ -226,7 +231,7 @@ new_files=("${DEST_WEBHOOK_DIR}/MutatingWebhookConfiguration.yml" "${DEST_WEBHOO for output_file in "${new_files[@]}"; do input_file="${output_file%.yaml}.yml.test" mv "$output_file" "$input_file" - : >$output_file + : > "$output_file" count=0 while IFS= read -r line; do if [[ $count -gt 0 ]]; then @@ -248,8 +253,8 @@ for output_file in "${new_files[@]}"; do count=$((count+2)) echo "$add_webhook_pod_validate" >>"$output_file" fi - done <"$input_file" - rm $input_file + done < "$input_file" + rm "$input_file" done echo "$add_webhook_line" > ${DEST_WEBHOOK_DIR}/webhook.yaml { @@ -262,36 +267,37 @@ rm ${DEST_WEBHOOK_DIR}/MutatingWebhookConfiguration.yml ${DEST_WEBHOOK_DIR}/Vali # Add visibility files, replace names, namespaces in helm format for output_file in "${DEST_VISIBILITY_DIR}"/*.yaml; do # The name of the v1alpha1.visibility.kueue.x-k8s.io APIService needs to remain unchanged. - if [ "$(cat $output_file | $YQ '.metadata | has("name")')" = "true" ] && - [ "$(cat $output_file | $YQ '.metadata.name | (. == "v1alpha1*")')" = "false" ]; then - $YQ -N -i '.metadata.name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("name")')" = "true" ] && + [ "$(< "$output_file" $YQ '.metadata.name | (. == "v1alpha1*")')" = "false" ]; then + $YQ -N -i '.metadata.name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" fi # The namespace of the visibility-server-auth-reader rolebinding needs to remain unchanged. - if [ "$(cat $output_file | $YQ '.metadata | has("namespace")')" = "true" ] && - [ "$(cat $output_file | $YQ '.metadata.namespace | (. == "kube-system")')" = "false" ]; then - $YQ -N -i '.metadata.namespace = "{{ .Release.Namespace }}"' $output_file + if [ "$(< "$output_file" $YQ '.metadata | has("namespace")')" = "true" ] && + [ "$(< "$output_file" $YQ '.metadata.namespace | (. == "kube-system")')" = "false" ]; then + $YQ -N -i '.metadata.namespace = "{{ .Release.Namespace }}"' "$output_file" fi - if [ "$(cat $output_file | $YQ '.spec.service | has("name")')" = "true" ]; then - $YQ -N -i '.spec.service.name |= "{{ include \"kueue.fullname\" . }}-" + .' $output_file + if [ "$(< "$output_file" $YQ '.spec.service | has("name")')" = "true" ]; then + $YQ -N -i '.spec.service.name |= "{{ include \"kueue.fullname\" . }}-" + .' "$output_file" fi - if [ "$(cat $output_file | $YQ '.spec.service | has("namespace")')" = "true" ]; then - $YQ -N -i '.spec.service.namespace = "{{ .Release.Namespace }}"' $output_file + if [ "$(< "$output_file" $YQ '.spec.service | has("namespace")')" = "true" ]; then + $YQ -N -i '.spec.service.namespace = "{{ .Release.Namespace }}"' "$output_file" fi - if [ "$(cat $output_file | $YQ '.subjects.[] | has("namespace")')" = "true" ]; then - $YQ -N -i '.subjects.[].namespace = "{{ .Release.Namespace }}"' $output_file + if [ "$(< "$output_file" $YQ '.subjects.[] | has("namespace")')" = "true" ]; then + $YQ -N -i '.subjects.[].namespace = "{{ .Release.Namespace }}"' "$output_file" fi - if [ "$(cat $output_file | $YQ '.kind | select(. == "Service")')" ]; then + if [ "$(< "$output_file" $YQ '.kind | select(. == "Service")')" ]; then + # shellcheck disable=SC2086 cat <> $output_file selector: {{- include "kueue.selectorLabels" . | nindent 4 }} EOT fi - $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' $output_file + $SED -i '/^metadata:.*/a\ labels:\n {{- include "kueue.labels" . | nindent 4 }}' "$output_file" { echo '{{- if include "kueue.isFeatureGateEnabled" (dict "List" .Values.controllerManager.featureGates "Feature" "VisibilityOnDemand") }}' - cat $output_file + cat "$output_file" echo "{{- end }}" - }> ${output_file}.tmp - mv ${output_file}.tmp ${output_file} + } > "${output_file}.tmp" + mv "${output_file}.tmp" "${output_file}" done diff --git a/hack/verify-shellcheck.sh b/hack/verify-shellcheck.sh index 07f4b9fce8..417da2ae11 100755 --- a/hack/verify-shellcheck.sh +++ b/hack/verify-shellcheck.sh @@ -21,7 +21,6 @@ set -o pipefail # allow overriding docker cli, which should work fine for this script DOCKER="${DOCKER:-docker}" -SHELLCHECK_VERSION="0.9.0" SHELLCHECK_IMAGE="docker.io/koalaman/shellcheck-alpine:v0.9.0@sha256:e19ed93c22423970d56568e171b4512c9244fc75dd9114045016b4a0073ac4b7" # Initialize an empty array for scripts to check diff --git a/site/static/examples/multikueue/create-multikueue-kubeconfig.sh b/site/static/examples/multikueue/create-multikueue-kubeconfig.sh index a184b0fedc..e1044fc310 100644 --- a/site/static/examples/multikueue/create-multikueue-kubeconfig.sh +++ b/site/static/examples/multikueue/create-multikueue-kubeconfig.sh @@ -150,7 +150,7 @@ EOF # Get or create a secret bound to the new service account. SA_SECRET_NAME=$(kubectl get -n ${NAMESPACE} sa/${MULTIKUEUE_SA} -o "jsonpath={.secrets[0]..name}") -if [ -z $SA_SECRET_NAME ] +if [ -z "$SA_SECRET_NAME" ] then kubectl apply -f - < ${KUBECONFIG_OUT} < "${KUBECONFIG_OUT}" <