#!/bin/bash usage() { echo -n "Usage: ${0} " echo exit 1 } # --- Settings RootDir=${1} if [ -z "${RootDir}" ] ; then usage fi RegistryService=cloud21.cvtt.vpn:5500 RegistryProtocol=http ConfigUrl=http://cloud23.cvtt.vpn:6789/admin/docker_images ReleaseHost="cloud21.cvtt.vpn" ReleasePort="22" ReleaseUser="cvttdist" ReleaseDir="/home/cvttdist/software/cvtt2" DIMAGES_CONFIG=$(curl -s ${ConfigUrl} | ${HOME}/bin/hjson -j) # RootDir=/home/oleg/prod SetVersionScript=/home/oleg/prod/ops/scripts/set_version.sh # --------------- D E B U G mkdir -p ${RootDir} build_docker_image() { title=${1} image_name=${2} docker_dev=${3} project=${4} echo "Building ${title}..." echo "ImageName=${image_name}" echo "DockerDev=${docker_dev}" echo "BasedOnDist=${project}" # Get Latest DIST version echo "Checking for latest version of ${project} on ${ReleaseUser}@${ReleaseHost}:${ReleaseDir}" image_version=$(get_latest_dist_version ${project}) if [ -z "${image_version}" ]; then echo "No latest version found for ${project}" exit 1 fi echo "Latest version is ${image_version}" if image_exists "${image_name}" "${image_version}"; then echo "Image $image_name:$image_version exists in the registry. Building is not required." return fi echo "Image $image_name:$image_version does not exist in the registry." echo "getting lastest version of ${project} on ${ReleaseUser}@${ReleaseHost}:${ReleaseDir}" ${SetVersionScript} ${project} ${image_version} DockerDir=./docker_dev/${docker_dev} echo "Building ${title}... on ${DockerDev}" Cmd="docker build" Cmd+=" -t ${image_name}" Cmd+=" -t ${image_name}:latest" Cmd+=" -t ${image_name}:${image_version}" Cmd+=" -f ${DockerDir}/Dockerfile ${RootDir}" echo ${Cmd} eval ${Cmd} || exit Cmd="docker tag" Cmd+=" ${image_name}:latest" Cmd+=" ${RegistryService}/${image_name}:latest" echo ${Cmd} eval ${Cmd} || exit Cmd="docker tag" Cmd+=" ${image_name}:${image_version}" Cmd+=" ${RegistryService}/${image_name}:${image_version}" echo ${Cmd} eval ${Cmd} || exit Cmd="docker push" Cmd+=" ${RegistryService}/${image_name}:latest" echo ${Cmd} eval ${Cmd} || exit Cmd="docker push" Cmd+=" ${RegistryService}/${image_name}:${image_version}" echo ${Cmd} eval ${Cmd} || exit } image_exists() { image_name=${1} version=${2} response=$(curl -s -o /dev/null -w "%{http_code}" "${RegistryProtocol}://${RegistryService}/v2/${image_name}/manifests/${version}" -H "Accept: application/vnd.docker.distribution.manifest.v2+json") if [ "$response" -eq 200 ]; then return 0 else return 1 fi } get_latest_dist_version() { project=${1} Version=$(ssh -q -p ${ReleasePort} ${ReleaseUser}@${ReleaseHost} "ls -tr ${ReleaseDir}/${project} | tail -1" ) echo "${Version}" } echo RootDir=${RootDir} cd ${RootDir} echo "Getting latest version of docker_dev" Cmd="${SetVersionScript} docker_dev latest" echo ${Cmd} eval ${Cmd} echo "${DIMAGES_CONFIG}" | jq -c 'to_entries[]' | while IFS= read -r item; do # Extract key (name) and values title=$(echo "$item" | jq -r '.key') image_name=$(echo "$item" | jq -r '.value.image_name') docker_dev=$(echo "$item" | jq -r '.value.docker_dev') project=$(echo "$item" | jq -r '.value.based_on_dist') build_docker_image "$title" "$image_name" "$docker_dev" "$project" done exit #=============================================================================== #===============================================================================