diff --git a/Changelog.md b/Changelog.md index 7e886c48052c51888a697cdaa88e8e5f031cc708..e6781760983adf3404d6b460b64e5cb1d6afe576 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,13 @@ # Changelog +## [1.4.4] - 2019-03-18 +### Added +* debug-option which outputs executed commands and their arguments +* `--pull` to always try to pull newer images before building + +### Fixed +* Dockerfile is now context-sensitive when not specified explicitly (default docker-behaviour) + ## [1.4.3] - 2019-03-14 ### Added * option to specify the path to the Dockerfile @@ -86,4 +94,5 @@ [1.4.0]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.3.2...release%2F1.4.0 [1.4.1]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.4.0...release%2F1.4.1 [1.4.2]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.4.1...release%2F1.4.2 -[1.4.3]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.4.2...release%2F1.4.3 \ No newline at end of file +[1.4.3]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.4.2...release%2F1.4.3 +[1.4.4]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.4.3...release%2F1.4.4 \ No newline at end of file diff --git a/Readme.md b/Readme.md index 6edbb72e11a6c98443dcfd5fe47ded317625e2cb..789eac2afe239e91e4ff2fb6663f783589f94f29 100644 --- a/Readme.md +++ b/Readme.md @@ -97,6 +97,7 @@ From now on charts located in this repository can be deployed by using the `--ch * `--namespace`: sets the k8s-namespace where the deployment is located. This string is provided by the k8s-admin. * `--service-account`: this is the name of the service-account, that is used to perform the deployment. * `--reset`: this ignores eventually existing config-folders of docker, helm and kubectl and removes them. +* `--debug`: outputs executed commands ## docker build @@ -107,6 +108,8 @@ From now on charts located in this repository can be deployed by using the `--ch * `--reset`: this ignores eventually existing config-folders of docker, helm and kubectl and removes them. * `--image-name`: sets the image name in the local docker-registry. Can be useful for following builds to build upon existing builds * `--docker-file`: sets the path to the Dockerfile +* `--pull`: tells docker to always pull newer images before building +* `--debug`: outputs executed commands ## docker publish @@ -116,6 +119,7 @@ From now on charts located in this repository can be deployed by using the `--ch * `--tags`: sets the tags of the image. Provide multiple `--tag`-options if you wish to tag an image with multiple tags. * `--reset`: this ignores eventually existing config-folders of docker, helm and kubectl and removes them. * `--image-name`: specifys the image name in the local docker-registry to publish +* `--debug`: outputs executed commands ## docker deploy @@ -131,6 +135,7 @@ From now on charts located in this repository can be deployed by using the `--ch * `--set-string`: overrides the values from `Values.yaml` in the helm-charts as string. Provide multiple `--set-string`-options if you want to provide multiple overrides. * `--timeout`: sets the timeout for helm. defaults to `60` seconds. * `--reset`: this ignores eventually existing config-folders of docker, helm and kubectl and removes them. +* `--debug`: outputs executed commands ## docker undeploy @@ -141,6 +146,7 @@ From now on charts located in this repository can be deployed by using the `--ch * `--service-account`: this is the name of the service-account, that is used to perform the deployment. This string is provided by the k8s-admin * `--name`: sets the name of the deployment. * `--reset`: this ignores eventually existing config-folders of docker, helm and kubectl and removes them. +* `--debug`: outputs executed commands ## docker add-repo @@ -152,6 +158,7 @@ From now on charts located in this repository can be deployed by using the `--ch * `--name`: sets the name of the repo to add. * `--repo-url`: sets the repository-url of the repo to add. * `--reset`: this ignores eventually existing config-folders of docker, helm and kubectl and removes them. +* `--debug`: outputs executed commands # Assumptions diff --git a/assets/deployer b/assets/deployer index ea44aa845c4b744765357fef42cb217550efac7a..0282e8cb110fe877942b7d4b281cfc0ab9594619 100755 --- a/assets/deployer +++ b/assets/deployer @@ -9,7 +9,7 @@ context="context" account="account" ca_file="${HOME}/k8s-ca.crt" image_file="" -docker_file="Dockerfile" +docker_file="" dockerconfig="" tags="" helmargs="" @@ -25,7 +25,8 @@ repo_url="" build_context="." timeout="60" reset="" - +dockerargs="" +debug="" ! getopt --test > /dev/null if [[ ${PIPESTATUS[0]} -ne 4 ]]; then echo "I’m sorry, `getopt --test` failed in this environment." @@ -33,7 +34,7 @@ if [[ ${PIPESTATUS[0]} -ne 4 ]]; then fi OPTIONS= -LONGOPTS=docker-config:,tag:,build-arg:,values:,set:,set-string:,charts:,name:,token:,certificate-authority:,namespace:,cluster-url:,service-account:,output:,input:,repo-url:,build-context:,timeout:,reset,image-name:,docker-file: +LONGOPTS=docker-config:,tag:,build-arg:,values:,set:,set-string:,charts:,name:,token:,certificate-authority:,namespace:,cluster-url:,service-account:,output:,input:,repo-url:,build-context:,timeout:,reset,image-name:,docker-file:,pull,debug # -use ! and PIPESTATUS to get exit code with errexit set # -temporarily store output to be able to check for errors @@ -120,9 +121,17 @@ while true; do shift 2 ;; --docker-file) - docker_file="$2" + docker_file="-f $2" shift 2 ;; + --pull) + dockerargs="${dockerargs} --pull" + shift + ;; + --debug) + debug="true" + shift + ;; --) shift break @@ -135,12 +144,19 @@ while true; do esac done +debug() { + if [ "$debug" != "true" ];then return; fi + echo -e "\n[$(date +'%Y-%m-%d')] ${FUNCNAME[1]}: $@" +} + prepare_kubectl() { local out local args="" if [ "${reset}" == "true" ];then echo -ne "Removing \".kube\" folder (because \"--reset\" was provided) ..." + + debug "rm -rf ${HOME}/.kube/*" out=`rm -rf ${HOME}/.kube/*` if [ "$?" != "0" ];then echo "failed" @@ -183,6 +199,7 @@ prepare_kubectl() { fi echo -ne "\tSetting cluster..." + debug "kubectl config set-cluster \"${cluster_name}\" --server=${cluster_url}${args}" out=`kubectl config set-cluster "${cluster_name}" --server=${cluster_url}${args}` if [ "$?" != "0" ];then echo "failed" @@ -192,6 +209,7 @@ prepare_kubectl() { echo "done" echo -ne "\tSetting credentials..." + debug "kubectl config set-credentials \"${account}\" --token=\"$(echo ${token} | base64 -d)" out=`kubectl config set-credentials "${account}" --token="$(echo ${token} | base64 -d)"` if [ "$?" != "0" ];then echo "failed" @@ -201,6 +219,7 @@ prepare_kubectl() { echo "done" echo -ne "\tSetting context..." + debug "kubectl config set-context \"${context}\" --user=\"${account}\" --cluster=\"${cluster_name}\"" out=`kubectl config set-context "${context}" --user="${account}" --cluster="${cluster_name}"` if [ "$?" != "0" ];then echo "failed" @@ -210,6 +229,7 @@ prepare_kubectl() { echo "done" echo -ne "\tActivating context..." + debug "kubectl config use-context \"${context}\"" out=`kubectl config use-context "${context}"` if [ "$?" != "0" ];then echo "failed" @@ -220,6 +240,7 @@ prepare_kubectl() { echo -ne "\tTesting context..." for resource in deployment service configmap;do + debug "kubectl --namespace=\"${namespace}\" auth can-i create $resource" out=`kubectl --namespace="${namespace}" auth can-i create $resource` if [ "$?" != "0" ];then echo "failed" @@ -235,6 +256,7 @@ prepare_kubectl() { prepare_helm() { if [ "${reset}" == "true" ];then echo -ne "Removing \".helm\" folder (because \"--reset\" was provided) ..." + debug "rm -rf ${HOME}/.helm/*" out=`rm -rf ${HOME}/.helm/*` if [ "$?" != "0" ];then echo "failed" @@ -249,6 +271,7 @@ prepare_helm() { echo -ne "Preparing helm..." + debug "helm init --wait --tiller-namespace=\"${namespace}\" --service-account=\"${service_account}\" --upgrade --force-upgrade" out=`helm init --wait --tiller-namespace="${namespace}" --service-account="${service_account}" --upgrade --force-upgrade` if [ "$?" != "0" ];then echo "failed!" @@ -276,7 +299,7 @@ helm_add_repo() { fi local cmd="helm repo add --tiller-connection-timeout=120 --tiller-namespace=\"${namespace}\" ${name} ${repo_url}" - + debug "$cmd" local out=`$cmd 2>&1` if [ "$?" != "0" ];then echo "failed" @@ -306,6 +329,7 @@ helm_deploy() { local cmd if [ "$(helm ls --tiller-namespace=${namespace} --namespace=${namespace} --pending --deleted --failed --short | grep ${name})" != "" ];then + debug "helm delete --tiller-namespace=${namespace} --purge ${name}" out=`helm delete --tiller-namespace=${namespace} --purge ${name} 2>&1` if [ "$?" != "0" ];then echo "failed" @@ -317,7 +341,7 @@ helm_deploy() { helmargs=$(echo -e "$helmargs" | sed -E 's/(^[[:space:]]*)|([[:space:]]*$)//g') cmd="helm upgrade --install --wait --timeout=${timeout} --tiller-namespace=${namespace} --namespace=${namespace}" cmd="$cmd --namespace=${namespace} --recreate-pods ${name} ${charts} ${helmargs}" - + debug "$cmd" out=`$cmd 2>&1` if [ "$?" != "0" ];then echo "failed" @@ -339,6 +363,7 @@ helm_undeploy() { local out + debug "helm delete --tiller-namespace=\"${namespace}\" ${name}" out=`helm delete --tiller-namespace="${namespace}" ${name} 2>&1` if [ "$?" != "0" ];then @@ -358,6 +383,7 @@ prepare_image_publisher() { if [ "${reset}" == "true" ];then echo -ne "Removing \".docker\" folder (because \"--reset\" was provided) ..." + debug "rm -rf ${HOME}/.docker/*" out=`rm -rf ${HOME}/.docker/*` if [ "$?" != "0" ];then echo "failed" @@ -371,6 +397,7 @@ prepare_image_publisher() { fi echo -ne "Setting docker auth config ..." + debug "mkdir -p ${HOME}/.docker && echo \"${dockerconfig}\" >${HOME}/.docker/config.json" mkdir -p ${HOME}/.docker && echo "${dockerconfig}" >${HOME}/.docker/config.json if [ "$?" != "0" ];then echo "failed" @@ -389,6 +416,7 @@ save_image() { return 0 fi + debug "docker save --output=${image_file} ${image_name}" out=`docker save --output=${image_file} ${image_name} 2>&1` if [ "$?" != "0" ];then echo "failed" @@ -403,14 +431,15 @@ build_image() { echo -ne "building image..." local out - local cmd="docker build --pull --cache-from=${image_name}" + local cmd="docker build ${dockerargs} --cache-from=${image_name}" for arg in $buildargs;do - echo "adding $arg to build command" + echo -e "\nadding $arg to build command" cmd="$cmd --build-arg $arg --build-arg ${arg,,}" done - cmd="$cmd -t ${image_name} -f ${docker_file} ${build_context}" + cmd="$cmd -t ${image_name} ${docker_file} ${build_context}" + debug "$cmd" out=`$cmd 2>&1` if [ "$?" != "0" ];then echo "failed" @@ -435,6 +464,7 @@ import_image() { return 0 fi + debug "docker load --input=${image_file}" out=`docker load --input=${image_file} 2>&1` if [ "$?" != "0" ];then echo "failed" @@ -465,12 +495,14 @@ publish_image() { echo "" for tag in $tags; do echo -ne "\t${name}:${tag}..." + debug "docker tag ${image_name} ${name}:${tag}" out=`docker tag ${image_name} ${name}:${tag} 2>&1` if [ "$?" != "0" ];then echo "failed" echo "$out" return 1 fi + debug "docker push ${name}:${tag}" out=`docker push ${name}:${tag} 2>&1` if [ "$?" != "0" ];then echo "failed" diff --git a/docker-compose.yml b/docker-compose.yml index 744b76f895c23baae6ba26b4f47df21cf16a2f75..35f64393b19e7be37792a38f928e02bb3becfa34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,5 @@ version: '2' services: - build: - build: . - volumes: - - ./:/app - - ./assets/deployer:/usr/local/bin/deployer - depends_on: - - docker - environment: - DOCKER_HOST: tcp://docker:2375 - command: deployer build --output .tmp/image.tar.gz - init: build: . volumes: @@ -50,6 +39,17 @@ services: DOCKER_HOST: tcp://docker:2375 command: deployer init --namespace test --cluster-url https://172.18.85.125:6443 --certificate-authority ${ca_cert} --token ${token} --service-account test --docker-config "${docker_config}" --reset + build: + build: . + volumes: + - ./:/app + - ./assets/deployer:/usr/local/bin/deployer + depends_on: + - docker + environment: + DOCKER_HOST: tcp://docker:2375 + command: deployer build --output .tmp/image.tar.gz + build-no-save: build: . volumes: @@ -61,6 +61,17 @@ services: DOCKER_HOST: tcp://docker:2375 command: deployer build + build-with-pull: + build: . + volumes: + - ./:/app + - ./assets/deployer:/usr/local/bin/deployer + depends_on: + - docker + environment: + DOCKER_HOST: tcp://docker:2375 + command: deployer build --pull + build-custom-context: build: . volumes: