Create a container image with the buidler, so we can avoid copying the builder binary into the env container during the env container build. Gather both stdout and stderr of a build into the logs. * Add Dockerfile for builder + update release scripts * Improve logging of buildermgr and builder * Add support for environment-scoped buildcmd * Fix fork/exec wd when package is a file * Update tests to also include builder image * Add logging to builder's fork/exec
349 lines
6.9 KiB
Bash
Executable File
349 lines
6.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#
|
|
# Test runner. Shell scripts that build fission CLI and server, push a
|
|
# docker image to GCR, deploy it on a cluster, and run tests against
|
|
# that deployment.
|
|
#
|
|
|
|
set -euo pipefail
|
|
|
|
ROOT=$(dirname $0)/..
|
|
|
|
helm_setup() {
|
|
helm init
|
|
}
|
|
|
|
gcloud_login() {
|
|
KEY=${HOME}/gcloud-service-key.json
|
|
if [ ! -f $KEY ]
|
|
then
|
|
echo $FISSION_CI_SERVICE_ACCOUNT | base64 -d - > $KEY
|
|
fi
|
|
|
|
gcloud auth activate-service-account --key-file $KEY
|
|
}
|
|
|
|
build_and_push_fission_bundle() {
|
|
image_tag=$1
|
|
|
|
pushd $ROOT/fission-bundle
|
|
./build.sh
|
|
docker build -t $image_tag .
|
|
|
|
gcloud_login
|
|
|
|
gcloud docker -- push $image_tag
|
|
popd
|
|
}
|
|
|
|
build_and_push_fetcher() {
|
|
image_tag=$1
|
|
|
|
pushd $ROOT/environments/fetcher/cmd
|
|
./build.sh
|
|
docker build -t $image_tag .
|
|
|
|
gcloud_login
|
|
|
|
gcloud docker -- push $image_tag
|
|
popd
|
|
}
|
|
|
|
|
|
build_and_push_builder() {
|
|
image_tag=$1
|
|
|
|
pushd $ROOT/builder/cmd
|
|
./build.sh
|
|
docker build -t $image_tag .
|
|
|
|
gcloud_login
|
|
|
|
gcloud docker -- push $image_tag
|
|
popd
|
|
}
|
|
|
|
build_and_push_fluentd(){
|
|
image_tag=$1
|
|
|
|
pushd $ROOT/logger/fluentd
|
|
docker build -t $image_tag .
|
|
|
|
gcloud_login
|
|
|
|
gcloud docker -- push $image_tag
|
|
popd
|
|
|
|
}
|
|
|
|
build_and_push_env_runtime() {
|
|
env=$1
|
|
image_tag=$2
|
|
|
|
pushd $ROOT/environments/$env/
|
|
docker build -t $image_tag .
|
|
|
|
gcloud_login
|
|
|
|
gcloud docker -- push $image_tag
|
|
popd
|
|
}
|
|
|
|
build_and_push_env_builder() {
|
|
env=$1
|
|
image_tag=$2
|
|
builder_image=$3
|
|
|
|
pushd $ROOT/environments/$env/builder
|
|
|
|
docker build -t $image_tag --build-arg BUILDER_IMAGE=${builder_image} .
|
|
|
|
gcloud_login
|
|
|
|
gcloud docker -- push $image_tag
|
|
popd
|
|
}
|
|
|
|
build_fission_cli() {
|
|
pushd $ROOT/fission
|
|
go build .
|
|
popd
|
|
}
|
|
|
|
clean_tpr_crd_resources() {
|
|
# clean tpr & crd resources to avoid testing error (ex. no kind "HttptriggerList" is registered for version "fission.io/v1")
|
|
# thirdpartyresources part should be removed after kubernetes test cluster is upgrade to 1.8+
|
|
kubectl --namespace default get thirdpartyresources| grep -v NAME| grep "fission.io"| awk '{print $1}'|xargs -I@ bash -c "kubectl --namespace default delete thirdpartyresources @" || true
|
|
kubectl --namespace default get crd| grep -v NAME| grep "fission.io"| awk '{print $1}'|xargs -I@ bash -c "kubectl --namespace default delete crd @" || true
|
|
}
|
|
|
|
generate_test_id() {
|
|
echo $(date|md5sum|cut -c1-6)
|
|
}
|
|
|
|
helm_install_fission() {
|
|
id=$1
|
|
image=$2
|
|
imageTag=$3
|
|
fetcherImage=$4
|
|
fetcherImageTag=$5
|
|
controllerNodeport=$6
|
|
routerNodeport=$7
|
|
fluentdImage=$8
|
|
|
|
ns=f-$id
|
|
fns=f-func-$id
|
|
|
|
helmVars=image=$image,imageTag=$imageTag,fetcherImage=$fetcherImage,fetcherImageTag=$fetcherImageTag,functionNamespace=$fns,controllerPort=$controllerNodeport,routerPort=$routerNodeport,pullPolicy=Always,analytics=false,logger.fluentdImage=$fluentdImage
|
|
|
|
helm_setup
|
|
|
|
echo "Deleting failed releases"
|
|
helm list --failed -q|xargs -I@ bash -c "helm delete @"
|
|
|
|
echo "Installing fission"
|
|
helm install \
|
|
--wait \
|
|
--timeout 600 \
|
|
--name $id \
|
|
--set $helmVars \
|
|
--namespace $ns \
|
|
--debug \
|
|
$ROOT/charts/fission-all
|
|
|
|
helm list
|
|
}
|
|
|
|
wait_for_service() {
|
|
id=$1
|
|
svc=$2
|
|
|
|
ns=f-$id
|
|
while true
|
|
do
|
|
ip=$(kubectl -n $ns get svc $svc -o jsonpath='{...ip}')
|
|
if [ ! -z $ip ]
|
|
then
|
|
break
|
|
fi
|
|
echo Waiting for service $svc...
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
wait_for_services() {
|
|
id=$1
|
|
|
|
wait_for_service $id controller
|
|
wait_for_service $id router
|
|
}
|
|
|
|
helm_uninstall_fission() {
|
|
if [ ! -z ${FISSION_TEST_SKIP_DELETE:+} ]
|
|
then
|
|
echo "Fission uninstallation skipped"
|
|
return
|
|
fi
|
|
echo "Uninstalling fission"
|
|
helm delete --purge $1
|
|
}
|
|
|
|
set_environment() {
|
|
id=$1
|
|
ns=f-$id
|
|
|
|
export FISSION_URL=http://$(kubectl -n $ns get svc controller -o jsonpath='{...ip}')
|
|
export FISSION_ROUTER=$(kubectl -n $ns get svc router -o jsonpath='{...ip}')
|
|
|
|
# set path to include cli
|
|
export PATH=$ROOT/fission:$PATH
|
|
}
|
|
|
|
dump_function_pod_logs() {
|
|
ns=$1
|
|
fns=$2
|
|
|
|
functionPods=$(kubectl -n $fns get pod -o name -l functionName)
|
|
for p in $functionPods
|
|
do
|
|
echo "--- function pod logs $p ---"
|
|
containers=$(kubectl -n $fns get $p -o jsonpath={.spec.containers[*].name})
|
|
for c in $containers
|
|
do
|
|
echo "--- function pod logs $p: container $c ---"
|
|
kubectl -n $fns logs $p $c
|
|
echo "--- end function pod logs $p: container $c ---"
|
|
done
|
|
echo "--- end function pod logs $p ---"
|
|
done
|
|
}
|
|
|
|
dump_fission_logs() {
|
|
ns=$1
|
|
fns=$2
|
|
component=$3
|
|
|
|
echo --- $component logs ---
|
|
kubectl -n $ns get pod -o name | grep $component | xargs kubectl -n $ns logs
|
|
echo --- end $component logs ---
|
|
}
|
|
|
|
dump_fission_crd() {
|
|
type=$1
|
|
echo --- All objects of type $type ---
|
|
kubectl --all-namespaces=true get $type -o yaml
|
|
echo --- End objects of type $type ---
|
|
}
|
|
|
|
dump_fission_crds() {
|
|
dump_fission_crd function.fission.io
|
|
dump_fission_crd package.fission.io
|
|
dump_fission_crd httptrigger.fission.io
|
|
dump_fission_crd environment.fission.io
|
|
}
|
|
|
|
dump_env_pods() {
|
|
fns=$1
|
|
|
|
echo --- All environment pods ---
|
|
kubectl -n $fns get pod -o yaml
|
|
echo --- End environment pods ---
|
|
}
|
|
|
|
dump_all_fission_resources() {
|
|
ns=$1
|
|
|
|
echo "--- All objects in the fission namespace $ns ---"
|
|
kubectl -n $ns get all
|
|
echo "--- End objects in the fission namespace $ns ---"
|
|
}
|
|
|
|
dump_system_info() {
|
|
echo "--- System Info ---"
|
|
go version
|
|
docker version
|
|
kubectl version
|
|
helm version
|
|
echo "--- End System Info ---"
|
|
}
|
|
|
|
dump_logs() {
|
|
id=$1
|
|
|
|
ns=f-$id
|
|
fns=f-func-$id
|
|
|
|
dump_all_fission_resources $ns
|
|
dump_env_pods $fns
|
|
dump_fission_logs $ns $fns controller
|
|
dump_fission_logs $ns $fns router
|
|
dump_fission_logs $ns $fns buildermgr
|
|
dump_fission_logs $ns $fns executor
|
|
dump_function_pod_logs $ns $fns
|
|
dump_fission_crds
|
|
}
|
|
|
|
export FAILURES=0
|
|
|
|
run_all_tests() {
|
|
id=$1
|
|
|
|
export FISSION_NAMESPACE=f-$id
|
|
export FUNCTION_NAMESPACE=f-func-$id
|
|
|
|
for file in $ROOT/test/tests/test_*.sh
|
|
do
|
|
echo ------- Running $file -------
|
|
if $file
|
|
then
|
|
echo SUCCESS: $file
|
|
else
|
|
echo FAILED: $file
|
|
export FAILURES=$(($FAILURES+1))
|
|
fi
|
|
done
|
|
}
|
|
|
|
install_and_test() {
|
|
image=$1
|
|
imageTag=$2
|
|
fetcherImage=$3
|
|
fetcherImageTag=$4
|
|
fluentdImage=$5
|
|
fluentdImageTag=$6
|
|
|
|
controllerPort=31234
|
|
routerPort=31235
|
|
|
|
clean_tpr_crd_resources
|
|
|
|
id=$(generate_test_id)
|
|
trap "helm_uninstall_fission $id" EXIT
|
|
if ! helm_install_fission $id $image $imageTag $fetcherImage $fetcherImageTag $controllerPort $routerPort $fluentdImage:$fluentdImageTag
|
|
then
|
|
dump_logs $id
|
|
exit 1
|
|
fi
|
|
|
|
wait_for_services $id
|
|
set_environment $id
|
|
|
|
run_all_tests $id
|
|
|
|
dump_logs $id
|
|
|
|
if [ $FAILURES -ne 0 ]
|
|
then
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
# if [ $# -lt 2 ]
|
|
# then
|
|
# echo "Usage: test.sh [image] [imageTag]"
|
|
# exit 1
|
|
# fi
|
|
# install_and_test $1 $2
|