#!/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) SetVersionScript=${HOME}/prod/set_version.sh # --------------- D E B U G mkdir -p ${RootDir} build_docker_image() { title=${1} image_name=${2} docker_dev_path=${3} project=${4} echo "Building ${title}..." echo "ImageName=${image_name}" echo "DockerDevPath=${docker_dev_path}" 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}" Cmd="${SetVersionScript} ${project} ${image_version}" echo ${Cmd} eval ${Cmd} convert_symlink_to_dir ${project} DockerDir=./docker_dev/${docker_dev_path} 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} 1>&2 || 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 echo "Removing the copy of ${project} from ${RootDir}" Cmd="rm -rf ${RootDir}/${project}" echo ${Cmd} eval ${Cmd} } convert_symlink_to_dir() { project=${1} echo "***** DEBUG 1 $(ls -l ${RootDir}/${project})" if [ -L ${RootDir}/${project} ]; then echo "Converting symlink ${RootDir}/${project} to directory" Cmd="mv ${RootDir}/${project} ${RootDir}/${project}.symlink" echo ${Cmd} && eval ${Cmd} src_path=$(readlink -f ${RootDir}/${project}.symlink) Cmd="cp -r ${src_path} ${RootDir}/${project}" echo ${Cmd} && eval ${Cmd} fi if [ -d ${project} ]; then echo "${RootDir}/${project} is a Directory" fi Cmd="rm ${RootDir}/${project}.symlink" echo ${Cmd} && eval ${Cmd} echo "***** DEBUG 2 $(ls -l ${RootDir}/${project})" } 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 } print_all_reg_images() { project=${1} # Fetch all repositories (images) from the registry repositories=$(curl -s "${RegistryProtocol}://${RegistryService}/v2/_catalog" | jq -r '.repositories[]') # Iterate over each repository to get its tags for repo in $repositories; do # Fetch all tags for the repository tags=$(curl -s "${RegistryProtocol}://${RegistryService}/v2/$repo/tags/list" | jq -r '.tags[]') # List each tag for tag in $tags; do if [ "${project}" == "" ];then echo "$repo:$tag" else echo "$repo:$tag" | grep ${project} fi done done } 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} convert_symlink_to_dir docker_dev 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_path=$(echo "$item" | jq -r '.value.docker_dev_path') project=$(echo "$item" | jq -r '.value.based_on_project') build_docker_image "$title" "$image_name" "$docker_dev_path" "$project" done Cmd="docker images" echo ${Cmd} eval ${Cmd} Cmd="rm -rf ${RootDir}/docker_dev" echo ${Cmd} eval ${Cmd} #=============================================================================== #===============================================================================