#!/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} test_script=${5} 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}" return 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 "================================================================================" echo "Building ${title}... on ${DockerDir}" echo "================================================================================" 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 1 if [ ! -z "${test_script}" ]; then if [ ! -f ${DockerDir}/${test_script} ]; then echo "Test script ${test_script} is missing" exit 1 fi echo "Running test script ${test_script} for ${image_name}" Cmd="docker cp ${DockerDir}/${test_script} ${image_name}:/" echo ${Cmd} eval ${Cmd} 1>&2 || exit 1 Cmd="docker exec ${image_name} chmod +x /${test_script}" echo ${Cmd} eval ${Cmd} 1>&2 || exit 1 Cmd="docker run" Cmd+=" --rm" Cmd+=" -d" Cmd+=" --name test-container" Cmd+=" ${image_name}" Cmd+=" /bin/bash -c /${TestScript}" echo ${Cmd} eval ${Cmd} 1>&2 || exit 1 echo "Removing test script ${test_script} from ${image_name}" Cmd="docker exec ${image_name} rm /${test_script}" echo ${Cmd} eval ${Cmd} 1>&2 || exit 1 fi : <<'COMMENT' ------------------------- Every single docker_dev project must have a test script image_test.sh that is copied to the image's root directory. ------------------------- Cmd="docker run" Cmd+=" --rm" Cmd+=" -d" Cmd+=" --name test-container" Cmd+=" ${image_name}" Cmd+=" /bin/bash -c /${TestScript}" echo ${Cmd} eval ${Cmd} 1>&2 || exit 1 # Get the exit status of the test script docker wait test-container # Check the exit status of the container EXIT_STATUS=$? # Analyze the exit status if [ ${EXIT_STATUS} -ne 0 ]; then echo "Tests Failed" exit 1 fi COMMENT 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} print_all_reg_images ${project} } convert_symlink_to_dir() { project=${1} 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} } 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} repositories=$(curl -s "${RegistryProtocol}://${RegistryService}/v2/_catalog" | jq -r '.repositories[]') 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 "------------------------------------- Starting ${0} ${*}" 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 Jobs=() while IFS= read -r item; do Jobs+=("$item") done < <(echo "${DIMAGES_CONFIG}" | jq -c 'to_entries[]') for item in "${Jobs[@]}"; 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') test_script=$(echo "$item" | jq -r '.value.test_script') build_docker_image "$title" "$image_name" "$docker_dev_path" "$project" "${test_script}" done Cmd="rm -rf ${RootDir}/docker_dev" echo ${Cmd} eval ${Cmd} echo "Done ${0} ${*}" #=============================================================================== #===============================================================================