@ -14,30 +14,32 @@ Parameters:
The resource group for the AKS cluster. Required when the registry ( using the -r parameter) is set to "aks" .
-b | --build-solution
Force a solution build before deployment ( default: false ) .
-d | --dns <dns or ip address>
Specifies the external DNS/ IP address of the Kubernetes cluster.
-d | --dns <dns or ip address> | --dns aks
Specifies the external DNS/ IP address of the Kubernetes cluster.
If 'aks' is set as value, the DNS value is retrieved from the AKS. --aks-name and --aks-rg are needed.
When --use-local-k8s is specified the external DNS is automatically set to localhost.
-h | --help
Displays this help text and exits the script.
--image-build
Build images ( default is to not build all images) .
--image-push
Upload images to the container registry ( default is not pushing to the custom registry)
-n | --app-name <the name of the app>
Specifies the name of the application ( default: eshop) .
--namespace <namespace name>
Specifies the namespace name to deploy the app. If it doesn' t exists it will be created ( default: eshop) .
-p | --docker-password <docker password>
The Docker password used to logon to the custom registry, supplied using the -r parameter.
-r | --registry <container registry>
Specifies the container registry to use ( required) , e.g. myregistry.azurecr.io.
--skip-clean
Do not clean the Kubernetes cluster ( default is to clean the cluster) .
--skip-image-build
Do not build images ( default is to build all images) .
--skip-image-push
Do not upload images to the container registry ( just run the Kubernetes deployment portion) .
Default is to push the images to the container registry.
--skip-infrastructure
Do not deploy infrastructure resources ( like sql-data, no-sql or redis) .
This is useful for production environments where infrastructure is hosted outside the Kubernetes cluster.
-t | --tag <docker image tag>
The tag used for the newly created docker images. Default: new ly cre ated, date-based time stamp, with 1-minute resolution .
-u | --docker-user <docker username>
The tag used for the newly created docker images. Default: latest.
-u | --docker-username <docker username>
The Docker username used to logon to the custom registry, supplied using the -r parameter.
--use-local-k8s
Deploy to a locally installed Kubernetes ( default: false ) .
@ -47,11 +49,10 @@ If using AKS and ACR see link for more info:
https://docs.microsoft.com/en-us/azure/container-registry/container-registry-auth-aks
WARNING! THE SCRIPT WILL COMPLETELY DESTROY ALL DEPLOYMENTS AND SERVICES VISIBLE
FROM THE CURRENT CONFIGURATION CONTEXT.
It is recommended that you create a separate namespace and confguration context
for the $app_name application, to isolate it from other applications on the cluster .
FROM THE CURRENT CONFIGURATION CONTEXT AND NAMESPACE .
It is recommended that you check your selected namespace, 'eshop' by default, is already in use.
Every deployment and service done in the namespace will be deleted .
For more information see https://kubernetes.io/docs/tasks/administer-cluster/namespaces/
You can use namespace.yaml file ( in the same directory) to create the namespace.
END
}
@ -59,17 +60,18 @@ END
app_name = 'eshop'
aks_name = ''
aks_rg = ''
build_images = 'yes '
build_images = ''
clean = 'yes'
build_solution = ''
container_registry = ''
docker_password = ''
docker_username = ''
dns = ''
image_tag = $( date '+%Y%m%d%H%M' )
push_images = 'yes '
image_tag = 'latest'
push_images = ''
skip_infrastructure = ''
use_local_k8s = ''
namespace = 'eshop'
while [ [ $# -gt 0 ] ] ; do
case " $1 " in
@ -86,15 +88,15 @@ while [[ $# -gt 0 ]]; do
-n | --app-name )
app_name = " $2 " ; shift 2; ;
-p | --docker-password )
docker_password = " $2 " ; shift; ;
docker_password = " $2 " ; shift 2 ; ;
-r | --registry )
container_registry = " $2 " ; shift 2; ;
--skip-clean )
clean = '' ; shift ; ;
--skip- image-build )
build_images = '' ; shift ; ;
--skip- image-push )
push_images = '' ; shift ; ;
--image-build )
build_images = 'yes ' ; shift ; ;
--image-push )
push_images = 'yes ' ; shift ; ;
--skip-infrastructure )
skip_infrastructure = 'yes' ; shift ; ;
-t | --tag )
@ -103,6 +105,8 @@ while [[ $# -gt 0 ]]; do
docker_username = " $2 " ; shift 2; ;
--use-local-k8s )
use_local_k8s = 'yes' ; shift ; ;
--namespace )
namespace = " $2 " ; shift 2; ;
*)
echo " Unknown option $1 "
usage; exit 2 ; ;
@ -124,10 +128,26 @@ if [[ $build_images ]]; then
docker rmi $( docker images -qf "dangling=true" )
fi
use_custom_registry = ''
if [ [ -n $container_registry ] ] ; then
echo " ################ Log into custom registry $container_registry ################## "
use_custom_registry = 'yes'
if [ [ -z $docker_username ] ] || [ [ -z $docker_password ] ] ; then
echo "Error: Must use -u (--docker-username) AND -p (--docker-password) if specifying custom registry"
exit 1
fi
docker login -u $docker_username -p $docker_password $container_registry
fi
if [ [ $push_images ] ] ; then
echo "#################### Pushing images to the container registry ####################"
services = ( basket.api catalog.api identity.api ordering.api marketing.api payment.api locations.api webmvc webspa webstatus)
if [ [ -z " $( docker image ls -q --filter= reference = eshop/$service :$image_tag ) " ] ] ; then
image_tag = linux-$image_tag
fi
for service in " ${ services [@] } "
do
echo " Pushing image for service $service ... "
@ -152,14 +172,23 @@ if [[ $dns == "aks" ]]; then
exit 1
fi
echo " Getting DNS of AKS of AKS $aks_name (in resource group $aks_rg ) "
dns = " $( az aks show -n $aks_name -g $aks_rg --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName) "
if [ [ -z dns ] ] ; then
echo " Getting AKS cluster $aks_name AKS (in resource group $aks_rg ) "
# JMESPath queries are case sensitive and httpapplicationrouting can be lowercase sometimes
jmespath_dnsqueries = ( \
addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName \
addonProfiles.httpapplicationrouting.config.HTTPApplicationRoutingZoneName \
)
for q in " ${ jmespath_dnsqueries [@] } "
do
dns = " $( az aks show -n $aks_name -g $aks_rg --query $q -o tsv) "
if [ [ -n $dns ] ] ; then break; fi
done
if [ [ -z $dns ] ] ; then
echo " Error: when getting DNS of AKS $aks_name (in resource group $aks_rg ). Please ensure AKS has httpRouting enabled AND Azure CLI is logged in and is of version 2.0.37 or higher. "
exit 1
fi
$dns = ${ dns //[ \" ]/ "" }
echo " DNS base found is $dns . Will use $aks_name . $dns for the app! "
dns = " $aks_name . $dns "
fi
# Initialization & check commands
@ -169,17 +198,12 @@ fi
if [ [ $clean ] ] ; then
echo "Cleaning previous helm releases..."
helm delete --purge $( helm ls -q)
echo "Previous releases deleted"
fi
use_custom_registry = ''
if [ [ -n $container_registry ] ] ; then
use_custom_registry = 'yes'
if [ [ -z $docker_user ] ] || [ [ -z $docker_password ] ] ; then
echo "Error: Must use -u (--docker-username) AND -p (--docker-password) if specifying custom registry"
exit 1
if [ [ -z $( helm ls -q --namespace $namespace ) ] ] ; then
echo "No previous releases found"
else
helm delete --purge $( helm ls -q --namespace $namespace )
echo "Previous releases deleted"
waitsecs = 10; while [ $waitsecs -gt 0 ] ; do echo -ne " $waitsecs \033[0K\r " ; sleep 1; : $(( waitsecs--)) ; done
fi
fi
@ -191,7 +215,7 @@ if [[ !$skip_infrastructure ]]; then
for infra in " ${ infras [@] } "
do
echo " Installing infrastructure: $infra "
helm install --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name= $app_name --set inf.k8s.dns= $dns --name= " $app_name - $infra " $infra
helm install --namespace $namespace --set " ingress.hosts={ $dns } " -- values app.yaml --values inf.yaml --values $ingress_values_file --set app.name= $app_name --set inf.k8s.dns= $dns --name= " $app_name - $infra " $infra
done
fi
@ -199,9 +223,9 @@ for chart in "${charts[@]}"
do
echo " Installing: $chart "
if [ [ $use_custom_registry ] ] ; then
helm install --set inf.registry.server= $container_registry --set inf.registry.login= $docker_username --set inf.registry.pwd= $docker_password --set inf.registry.secretName= eshop-docker-scret --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name= $app_name --set inf.k8s.dns= $dns --set image.tag= $image_tag --set image.pullPolicy= Always --name= " $app_name - $chart " $chart
helm install --namespace $namespace --set " ingress.hosts={ $dns } " -- set inf.registry.server= $container_registry --set inf.registry.login= $docker_username --set inf.registry.pwd= $docker_password --set inf.registry.secretName= eshop-docker-scret --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name= $app_name --set inf.k8s.dns= $dns --set image.tag= $image_tag --set image.pullPolicy= Always --name= " $app_name - $chart " $chart
elif [ [ $chart != "eshop-common" ] ] ; then # eshop-common is ignored when no secret must be deployed
helm install --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name= $app_name --set inf.k8s.dns= $dns --set image.tag= $image_tag --set image.pullPolicy= Always --name= " $app_name - $chart " $chart
helm install --namespace $namespace --set " ingress.hosts={ $dns } " -- values app.yaml --values inf.yaml --values $ingress_values_file --set app.name= $app_name --set inf.k8s.dns= $dns --set image.tag= $image_tag --set image.pullPolicy= Always --name= " $app_name - $chart " $chart
fi
done