155 lines
4.8 KiB
Plaintext
155 lines
4.8 KiB
Plaintext
|
#!/bin/bash
|
|||
|
|
|||
|
# set -x
|
|||
|
set -e
|
|||
|
|
|||
|
TS_GIT_MIRROR=${ENV_TS_GIT_MIRROR:-}
|
|||
|
TS_GIT_COMMIT=${ENV_TS_GIT_COMMIT:-}
|
|||
|
TS_DOCKER_REPOSITORY=${ENV_TS_DOCKER_REPOSITORY:-}
|
|||
|
TS_LOG=${ENV_TS_LOG:-}
|
|||
|
|
|||
|
TS_GIT_REPOSITORY="https://github.com/Thinstation/thinstation.git"
|
|||
|
TS_GIT_BRANCH="6.2-Stable"
|
|||
|
TS_GIT_PATH="/thinstation"
|
|||
|
TS_DOCKER_IMAGE_NAME="thinstation"
|
|||
|
TS_LOG_BUILD_FILE="/setup-chroot.log"
|
|||
|
|
|||
|
TS_INFO=$(cat <<-EOF
|
|||
|
VERSION={TS_VERSION}
|
|||
|
COMMIT={GIT_HASH}
|
|||
|
HASH={GIT_HASH_SHORT}
|
|||
|
DOCKER={DOCKER_IMAGE}
|
|||
|
EOF
|
|||
|
)
|
|||
|
|
|||
|
ts_git_clone() {
|
|||
|
local git_branch=${1}
|
|||
|
local git_repository=${2}
|
|||
|
|
|||
|
if ! git clone --single-branch --branch ${git_branch} --depth 1 ${git_repository} ${TS_GIT_PATH} 2>/dev/null ; then
|
|||
|
echo "Произошла ошибка при клонировании репозитория"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
ts_git_find_hash() {
|
|||
|
local git_hash=${1}
|
|||
|
local current_hash=$(git -C ${TS_GIT_PATH} rev-parse HEAD)
|
|||
|
|
|||
|
if [ ${git_hash} != ${current_hash} ]; then
|
|||
|
echo "Репозиторий будет загружен полностью"
|
|||
|
git -C ${TS_GIT_PATH} fetch --unshallow
|
|||
|
if git -C ${TS_GIT_PATH} log ${git_hash} --oneline -n 1 2>/dev/null ; then
|
|||
|
echo "Переключение на указанный коммит: ${git_hash}"
|
|||
|
git -C ${TS_GIT_PATH} checkout ${git_hash}
|
|||
|
else
|
|||
|
echo "Указанный хеш отсутствует в репозитории: ${git_hash}"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
ts_setup_chroot() {
|
|||
|
local ts_version=${1}
|
|||
|
local ts_git_hash=${2}
|
|||
|
local ts_git_hash_short=${3}
|
|||
|
local ts_docker_image=${4}
|
|||
|
|
|||
|
cd ${TS_GIT_PATH}
|
|||
|
rm -rf .git
|
|||
|
./setup-chroot -i > ${TS_LOG_BUILD_FILE} 2>&1
|
|||
|
cp -r build/conf/tiny/* build/
|
|||
|
|
|||
|
echo "${TS_INFO}" | \
|
|||
|
sed -e "s/{TS_VERSION}/${ts_version}/" \
|
|||
|
-e "s/{GIT_HASH}/${ts_git_hash}/" \
|
|||
|
-e "s/{GIT_HASH_SHORT}/${ts_git_hash_short}/" \
|
|||
|
-e "s/{DOCKER_IMAGE}/${ts_docker_image}/" > ts_version
|
|||
|
}
|
|||
|
|
|||
|
ts_docker_check() {
|
|||
|
local repository=${1}
|
|||
|
local image_version=${2}
|
|||
|
local image_name="${TS_DOCKER_IMAGE_NAME}:${image_version}"
|
|||
|
local image="${repository}/${image_name}"
|
|||
|
|
|||
|
{ docker images --filter "reference=${image}" | tail -n 1 | awk '{ print $1":"$2 }' | grep -q "${image}"; } || \
|
|||
|
{ curl -I -s "${repository}/v2/${TS_DOCKER_IMAGE_NAME}/manifest/${image_version}" | head -n 1 | cut -d$' ' -f3 | grep -q "OK"; }
|
|||
|
}
|
|||
|
|
|||
|
ts_docker_build() {
|
|||
|
local docker_image=${1}
|
|||
|
|
|||
|
export DOCKER_IMAGE="${TS_DOCKER_REPOSITORY}/${docker_image}"
|
|||
|
|
|||
|
cd /
|
|||
|
docker compose --project-name thinstation build --no-cache --push
|
|||
|
rm -rf /thinstation
|
|||
|
}
|
|||
|
|
|||
|
main() {
|
|||
|
while [ $# -gt 0 ]; do
|
|||
|
key="${1}"
|
|||
|
value="${2}"
|
|||
|
case "${key}" in
|
|||
|
mirror)
|
|||
|
TS_GIT_MIRROR=${value}
|
|||
|
shift
|
|||
|
;;
|
|||
|
branch)
|
|||
|
TS_GIT_BRANCH=${value}
|
|||
|
shift
|
|||
|
;;
|
|||
|
commit)
|
|||
|
TS_GIT_COMMIT=${value}
|
|||
|
shift
|
|||
|
;;
|
|||
|
docker)
|
|||
|
TS_DOCKER_REPOSITORY=${value}
|
|||
|
shift
|
|||
|
;;
|
|||
|
log)
|
|||
|
TS_LOG=${value}
|
|||
|
shift
|
|||
|
;;
|
|||
|
esac
|
|||
|
shift
|
|||
|
done
|
|||
|
|
|||
|
# [ -z ${TS_GIT_BRANCH} ] && echo "Не указана ветка репозитория" && exit 1
|
|||
|
[ -z ${TS_GIT_COMMIT} ] && echo "Не указан коммит" && exit 1
|
|||
|
[ -z ${TS_DOCKER_REPOSITORY} ] && echo "Не указан docker-репозиторий" && exit 1
|
|||
|
|
|||
|
if [ ! -z ${TS_GIT_MIRROR} ]; then
|
|||
|
echo "Был установлен удаленный git-репозиторий в качестве источника: ${TS_GIT_MIRROR}"
|
|||
|
TS_GIT_REPOSITORY=${TS_GIT_MIRROR}
|
|||
|
fi
|
|||
|
|
|||
|
local TS_VERSION=${TS_GIT_BRANCH%%-*}
|
|||
|
local TS_HASH_SHORT=${TS_GIT_COMMIT::7}
|
|||
|
|
|||
|
local TS_DOCKER_IMAGE_VERSION="${TS_VERSION}-${TS_HASH_SHORT}"
|
|||
|
local TS_DOCKER_IMAGE="${TS_DOCKER_IMAGE_NAME}:${TS_DOCKER_IMAGE_VERSION}"
|
|||
|
|
|||
|
if ts_docker_check ${TS_DOCKER_REPOSITORY} ${TS_DOCKER_IMAGE_VERSION} ; then
|
|||
|
echo "Образ указанной версии Thinstation уже существует: ${TS_DOCKER_IMAGE}"
|
|||
|
exit 0
|
|||
|
fi
|
|||
|
|
|||
|
# Клонирование репозитория
|
|||
|
ts_git_clone ${TS_GIT_BRANCH} ${TS_GIT_REPOSITORY}
|
|||
|
# Переключение на необходимый коммит
|
|||
|
ts_git_find_hash ${TS_GIT_COMMIT}
|
|||
|
# Распаковка и настройка Thinstation
|
|||
|
ts_setup_chroot ${TS_VERSION} ${TS_GIT_COMMIT} ${TS_HASH_SHORT} ${TS_DOCKER_IMAGE}
|
|||
|
# Сборка docker-образа
|
|||
|
ts_docker_build ${TS_DOCKER_IMAGE}
|
|||
|
|
|||
|
if [ ! -z ${TS_LOG} ] && [ -e ${TS_LOG} ]; then
|
|||
|
echo "Журнал сборки будет скопирован в ${TS_LOG}"
|
|||
|
cp -v ${TS_LOG_BUILD_FILE} ${TS_LOG}
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
main ${@}
|