2016-10-19 08:32:00 +02:00
#!/bin/bash
#docker version: 1.11.2
#docker-compose version: 1.7.1
#Harbor version: 0.4.0
set +e
set -o noglob
#
# Set Colors
#
bold = $( tput bold)
underline = $( tput sgr 0 1)
reset = $( tput sgr0)
red = $( tput setaf 1)
green = $( tput setaf 76)
white = $( tput setaf 7)
tan = $( tput setaf 202)
blue = $( tput setaf 25)
#
# Headers and Logging
#
underline( ) { printf " ${ underline } ${ bold } %s ${ reset } \n " " $@ "
}
h1( ) { printf " \n ${ underline } ${ bold } ${ blue } %s ${ reset } \n " " $@ "
}
h2( ) { printf " \n ${ underline } ${ bold } ${ white } %s ${ reset } \n " " $@ "
}
debug( ) { printf " ${ white } %s ${ reset } \n " " $@ "
}
info( ) { printf " ${ white } ➜ %s ${ reset } \n " " $@ "
}
success( ) { printf " ${ green } ✔ %s ${ reset } \n " " $@ "
}
error( ) { printf " ${ red } ✖ %s ${ reset } \n " " $@ "
}
warn( ) { printf " ${ tan } ➜ %s ${ reset } \n " " $@ "
}
bold( ) { printf " ${ bold } %s ${ reset } \n " " $@ "
}
note( ) { printf " \n ${ underline } ${ bold } ${ blue } Note: ${ reset } ${ blue } %s ${ reset } \n " " $@ "
}
set -e
set +o noglob
2017-03-09 12:02:44 +01:00
usage = $' Please set hostname and other necessary attributes in harbor.cfg first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients.
2017-06-13 11:13:24 +02:00
Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.cfg bacause notary must run under https.
Please set --with-clair if needs enable Clair in Harbor'
2016-10-19 08:32:00 +02:00
item = 0
2017-03-09 12:02:44 +01:00
# notary is not enabled by default
with_notary = $false
2017-06-13 11:13:24 +02:00
# clair is not enabled by default
with_clair = $false
2017-09-27 06:56:57 +02:00
# HA mode is not enabled by default
harbor_ha = $false
2018-07-19 10:47:05 +02:00
# chartmuseum is not enabled by default
with_chartmuseum = $false
2016-10-19 08:32:00 +02:00
while [ $# -gt 0 ] ; do
case $1 in
--help)
note " $usage "
exit 0; ;
2017-03-09 12:02:44 +01:00
--with-notary)
2017-06-13 11:13:24 +02:00
with_notary = true; ;
--with-clair)
2017-09-27 06:56:57 +02:00
with_clair = true; ;
--ha)
harbor_ha = true; ;
2018-07-19 10:47:05 +02:00
--with-chartmuseum)
with_chartmuseum = true; ;
2016-10-19 08:32:00 +02:00
*)
note " $usage "
exit 1; ;
esac
shift || true
done
workdir = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
cd $workdir
# The hostname in harbor.cfg has not been modified
if grep 'hostname = reg.mydomain.com' & > /dev/null harbor.cfg
then
warn " $usage "
exit 1
fi
function check_docker {
if ! docker --version & > /dev/null
then
error "Need to install docker(1.10.0+) first and run this script again."
exit 1
fi
# docker has been installed and check its version
if [ [ $( docker --version) = ~ ( ( [ 0-9] +) .( [ 0-9] +) .( [ 0-9] +) ) ] ]
then
docker_version = ${ BASH_REMATCH [1] }
docker_version_part1 = ${ BASH_REMATCH [2] }
docker_version_part2 = ${ BASH_REMATCH [3] }
# the version of docker does not meet the requirement
if [ " $docker_version_part1 " -lt 1 ] || ( [ " $docker_version_part1 " -eq 1 ] && [ " $docker_version_part2 " -lt 10 ] )
then
error "Need to upgrade docker package to 1.10.0+."
exit 1
else
note " docker version: $docker_version "
fi
else
error "Failed to parse docker version."
exit 1
fi
}
function check_dockercompose {
if ! docker-compose --version & > /dev/null
then
error "Need to install docker-compose(1.7.1+) by yourself first and run this script again."
exit 1
fi
# docker-compose has been installed, check its version
if [ [ $( docker-compose --version) = ~ ( ( [ 0-9] +) .( [ 0-9] +) .( [ 0-9] +) ) ] ]
then
docker_compose_version = ${ BASH_REMATCH [1] }
docker_compose_version_part1 = ${ BASH_REMATCH [2] }
docker_compose_version_part2 = ${ BASH_REMATCH [3] }
# the version of docker-compose does not meet the requirement
if [ " $docker_compose_version_part1 " -lt 1 ] || ( [ " $docker_compose_version_part1 " -eq 1 ] && [ " $docker_compose_version_part2 " -lt 6 ] )
then
error "Need to upgrade docker-compose package to 1.7.1+."
exit 1
else
note " docker-compose version: $docker_compose_version "
fi
else
error "Failed to parse docker-compose version."
exit 1
fi
}
h2 " [Step $item ]: checking installation environment ... " ; let item += 1
check_docker
check_dockercompose
2017-04-05 08:48:29 +02:00
if [ -f harbor*.tar.gz ]
2016-10-19 08:32:00 +02:00
then
h2 " [Step $item ]: loading Harbor images ... " ; let item += 1
2017-04-05 08:48:29 +02:00
docker load -i ./harbor*.tar.gz
2016-10-19 08:32:00 +02:00
fi
echo ""
h2 " [Step $item ]: preparing environment ... " ; let item += 1
if [ -n " $host " ]
then
sed " s/^hostname = .*/hostname = $host /g " -i ./harbor.cfg
fi
2017-06-13 11:13:24 +02:00
prepare_para =
2017-09-27 06:56:57 +02:00
if [ $with_notary ] && [ ! $harbor_ha ]
2017-03-09 12:02:44 +01:00
then
2017-06-13 11:13:24 +02:00
prepare_para = " ${ prepare_para } --with-notary "
2017-03-09 12:02:44 +01:00
fi
2017-12-21 09:45:20 +01:00
if [ $with_clair ]
2017-06-13 11:13:24 +02:00
then
prepare_para = " ${ prepare_para } --with-clair "
fi
2017-09-27 06:56:57 +02:00
if [ $harbor_ha ]
then
prepare_para = " ${ prepare_para } --ha "
fi
2018-07-19 10:47:05 +02:00
if [ $with_chartmuseum ]
then
prepare_para = " ${ prepare_para } --with-chartmuseum "
fi
2017-06-13 11:13:24 +02:00
./prepare $prepare_para
2016-10-19 08:32:00 +02:00
echo ""
h2 " [Step $item ]: checking existing instance of Harbor ... " ; let item += 1
2017-06-13 11:13:24 +02:00
docker_compose_list = '-f docker-compose.yml'
2017-09-27 06:56:57 +02:00
if [ $with_notary ] && [ ! $harbor_ha ]
2017-06-13 11:13:24 +02:00
then
docker_compose_list = " ${ docker_compose_list } -f docker-compose.notary.yml "
fi
2017-12-21 09:45:20 +01:00
if [ $with_clair ]
2017-06-13 11:13:24 +02:00
then
docker_compose_list = " ${ docker_compose_list } -f docker-compose.clair.yml "
2016-10-19 08:32:00 +02:00
fi
2018-07-19 10:47:05 +02:00
if [ $with_chartmuseum ]
then
docker_compose_list = " ${ docker_compose_list } -f docker-compose.chartmuseum.yml "
fi
2016-10-19 08:32:00 +02:00
2017-06-13 11:13:24 +02:00
if [ -n " $( docker-compose $docker_compose_list ps -q) " ]
2017-03-09 12:02:44 +01:00
then
2017-06-13 11:13:24 +02:00
note "stopping existing Harbor instance ..."
docker-compose $docker_compose_list down -v
2017-03-09 12:02:44 +01:00
fi
2017-06-13 11:13:24 +02:00
echo ""
h2 " [Step $item ]: starting Harbor ... "
2017-09-27 06:56:57 +02:00
if [ $harbor_ha ]
then
mv docker-compose.yml docker-compose.yml.bak
cp ha/docker-compose.yml docker-compose.yml
2017-12-21 09:45:20 +01:00
mv docker-compose.clair.yml docker-compose.clair.yml.bak
cp ha/docker-compose.clair.yml docker-compose.clair.yml
2017-09-27 06:56:57 +02:00
fi
2017-06-13 11:13:24 +02:00
docker-compose $docker_compose_list up -d
2016-10-19 08:32:00 +02:00
protocol = http
hostname = reg.mydomain.com
if [ [ $( cat ./harbor.cfg) = ~ ui_url_protocol[ [ :blank:] ] *= [ [ :blank:] ] *( https?) ] ]
then
protocol = ${ BASH_REMATCH [1] }
fi
if [ [ $( grep 'hostname[[:blank:]]*=' ./harbor.cfg) = ~ hostname[ [ :blank:] ] *= [ [ :blank:] ] *( .*) ] ]
then
hostname = ${ BASH_REMATCH [1] }
fi
echo ""
success $" ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at ${ protocol } ://${ hostname } .
For more details, please visit https://github.com/vmware/harbor .
"