Add machine build, cleanup old stuff

This commit is contained in:
Pascal Vizeli 2017-09-28 12:08:05 +02:00
parent 86abce4897
commit 3d92fc2375
10 changed files with 47 additions and 501 deletions

View file

@ -1,34 +0,0 @@
FROM ubuntu:16.04
# setup locals
RUN apt-get update && apt-get install -y \
locales \
&& rm -rf /var/lib/apt/lists/*
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
# Install docker
# https://docs.docker.com/engine/installation/linux/ubuntu/#install-using-the-repository
RUN apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common \
&& rm -rf /var/lib/apt/lists/*
VOLUME /var/lib/docker
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
RUN apt-get update && apt-get install -y \
docker-ce \
&& rm -rf /var/lib/apt/lists/*
# setup arm binary support
RUN apt-get update && apt-get install -y \
qemu-user-static \
binfmt-support \
&& rm -rf /var/lib/apt/lists/*
COPY run-docker.sh /
RUN chmod a+x /run-docker.sh
WORKDIR /docker

View file

@ -1,54 +0,0 @@
#!/bin/bash
set -e
DOCKER_IMAGE=${DOCKER_IMAGE:="homeassistant/docker-build-env"}
DOCKER_TAG="$(date +%Y%m%d)"
DOCKER_PUSH="false"
# Get the absolute script location
pushd "$(dirname "$0")" > /dev/null 2>&1
SCRIPTPATH=$(pwd)
popd > /dev/null 2>&1
help () {
cat << EOF
Script for hassio docker build environment
create_build_env [options]
Options:
-h, --help
Display this help and exit.
-p, --push
Upload the build to docker hub.
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
key=$1
case $key in
-h|--help)
help
exit 0
;;
-p|--push)
DOCKER_PUSH="true"
;;
*)
echo "[WARNING] $0 : Argument '$1' unknown. Ignoring."
;;
esac
shift
done
# Build
docker build --pull --tag "$DOCKER_IMAGE:$DOCKER_TAG" -f "$SCRIPTPATH/Dockerfile" "$SCRIPTPATH"
# Tag
docker tag "$DOCKER_IMAGE:$DOCKER_TAG" "$DOCKER_IMAGE:latest"
if [ "$DOCKER_PUSH" == "true" ]; then
docker push "$DOCKER_IMAGE:$DOCKER_TAG"
docker push "$DOCKER_IMAGE:latest"
fi

View file

@ -1,87 +0,0 @@
#!/bin/bash
set -e
DOCKER_TIMEOUT=20 # Wait 20 seconds for docker to start
cleanup() {
echo "[INFO] Running cleanup..."
# Stop docker gracefully
echo "[INFO] Stopping in container docker..."
DOCKERPIDFILE=/var/run/docker.pid
if [ -f $DOCKERPIDFILE ] && [ -s $DOCKERPIDFILE ] && pgrep -F $DOCKERPIDFILE > /dev/null; then
kill "$(cat $DOCKERPIDFILE)"
# Now wait for it to die
STARTTIME=$(date +%s)
ENDTIME=$(date +%s)
while [ -f $DOCKERPIDFILE ] && [ -s $DOCKERPIDFILE ] && pgrep -F $DOCKERPIDFILE > /dev/null; do
if [ $((ENDTIME - STARTTIME)) -le $DOCKER_TIMEOUT ]; then
sleep 1
ENDTIME=$(date +%s)
else
echo "[ERROR] Timeout while waiting for in container docker to die"
exit 1
fi
done
else
echo "[WARN] Can't stop docker container"
echo "[WARN] Your host might have been left with unreleased resources (ex. loop devices)"
fi
if [ "$1" == "fail" ]; then
exit 1
fi
}
trap 'cleanup fail' SIGINT SIGTERM
# Start docker
echo "[INFO] Setup crosscompiling feature"
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
update-binfmts --enable qemu-arm
update-binfmts --enable qemu-aarch64
# Start docker
echo "[INFO] Starting docker."
dockerd 2> /dev/null &
echo "[INFO] Waiting for docker to initialize..."
STARTTIME=$(date +%s)
ENDTIME=$(date +%s)
until docker info >/dev/null 2>&1; do
if [ $((ENDTIME - STARTTIME)) -le $DOCKER_TIMEOUT ]; then
sleep 1
ENDTIME=$(date +%s)
else
echo "[ERROR] Timeout while waiting for docker to come up"
exit 1
fi
done
echo "[INFO] Docker was initialized"
# Start barys with all the arguments requested
echo "[INFO] Running build..."
if "$DOCKER_CACHE" == "true" && docker pull "$DOCKER_IMAGE:latest" > /dev/null 2>&1
then
docker build --pull --tag "$DOCKER_IMAGE:$DOCKER_TAG" --cache-from "$DOCKER_IMAGE:latest" .
else
docker build --pull --tag "$DOCKER_IMAGE:$DOCKER_TAG" .
fi
# tag as latest
if [ "$DOCKER_WITH_LATEST" == "true" ]; then
docker tag "$DOCKER_IMAGE:$DOCKER_TAG" "$DOCKER_IMAGE:latest"
fi
echo "[INFO] Push image"
if [ "$DOCKER_PUSH" == "true" ]; then
# push
docker push "$DOCKER_IMAGE:$DOCKER_TAG"
# latest
if [ "$DOCKER_WITH_LATEST" == "true" ]; then
docker push "$DOCKER_IMAGE:latest"
fi
fi
cleanup "okay"
exit 0

View file

@ -1,8 +0,0 @@
#!/bin/bash
set -e
for arch in "armhf" "aarch64" "i386" "amd64"
do
./create_hassio_cluster.sh -a $arch "$@" &
done
wait

View file

@ -1,135 +0,0 @@
#!/bin/bash
set -e
BUILD_CONTAINER_NAME=hassio-cluster-build-$$
DOCKER_PUSH="true"
DOCKER_CACHE="true"
DOCKER_WITH_LATEST="true"
DOCKER_HUB=homeassistant
cleanup() {
echo "[INFO] Cleanup."
# Stop docker container
echo "[INFO] Cleaning up hassio-cluster-build container."
docker stop $BUILD_CONTAINER_NAME 2> /dev/null || true
docker rm --volumes $BUILD_CONTAINER_NAME 2> /dev/null || true
if [ "$1" == "fail" ]; then
exit 1
fi
}
trap 'cleanup fail' SIGINT SIGTERM
help () {
cat << EOF
Script for hassio docker build
create_hassio_cluster [options]
Options:
-h, --help
Display this help and exit.
-v, --version xy
Set version of cluster image from.
-d, --dockerhub hubname
Set user of dockerhub build.
-a, --arch armhf|aarch64|i386|amd64
Arch for Hass.IO build.
-t, --test
Don't upload the build to docker hub.
-n, --no-cache
Disable build from cache
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
key=$1
case $key in
-h|--help)
help
exit 0
;;
-d|--dockerhub)
DOCKER_HUB=$2
shift
;;
-v|--version)
DOCKER_TAG=$2
shift
;;
-a|--arch)
ARCH=$2
shift
;;
-t|--test)
DOCKER_PUSH="false"
;;
-n|--no-cache)
DOCKER_CACHE="false"
;;
*)
echo "[WARNING] $0 : Argument '$1' unknown. Ignoring."
;;
esac
shift
done
# Sanity checks
if [ "$ARCH" != 'armhf' ] && [ "$ARCH" != 'aarch64' ] && [ "$ARCH" != 'i386' ] && [ "$ARCH" != 'amd64' ]; then
echo "Error: $ARCH is not a supported platform for hassio-cluster!"
help
exit 1
fi
if [ -z "$DOCKER_TAG" ]; then
echo "Error: need set a version!"
help
exit 1
fi
# Get the absolute script location
pushd "$(dirname "$0")" > /dev/null 2>&1
SCRIPTPATH=$(pwd)
popd > /dev/null 2>&1
BASE_IMAGE="homeassistant\/$ARCH-base:latest"
DOCKER_IMAGE=$DOCKER_HUB/$ARCH-hassio-cluster
BUILD_DIR=${BUILD_DIR:=$SCRIPTPATH}
WORKSPACE=${BUILD_DIR:=$SCRIPTPATH}/hassio-cluster-$ARCH
# setup docker
echo "[INFO] Setup docker for cluster"
mkdir -p "$BUILD_DIR"
cp -r ../../cluster "$WORKSPACE"
sed -i "s/%%BASE_IMAGE%%/${BASE_IMAGE}/g" "$WORKSPACE/Dockerfile"
echo "LABEL io.hass.version=\"$DOCKER_TAG\" io.hass.arch=\"$ARCH\" io.hass.type=\"cluster\"" >> "$WORKSPACE/Dockerfile"
echo "[INFO] prepare $DOCKER_IMAGE:$DOCKER_TAG done"
# Run build
echo "[INFO] start docker build"
docker stop $BUILD_CONTAINER_NAME 2> /dev/null || true
docker rm --volumes $BUILD_CONTAINER_NAME 2> /dev/null || true
docker run --rm \
-v "$WORKSPACE":/docker \
-v ~/.docker:/root/.docker \
-e DOCKER_PUSH=$DOCKER_PUSH \
-e DOCKER_CACHE=$DOCKER_CACHE \
-e DOCKER_WITH_LATEST=$DOCKER_WITH_LATEST \
-e DOCKER_IMAGE="$DOCKER_IMAGE" \
-e DOCKER_TAG="$DOCKER_TAG" \
--name $BUILD_CONTAINER_NAME \
--privileged \
homeassistant/docker-build-env \
/run-docker.sh
echo "[INFO] cleanup WORKSPACE"
cd "$BUILD_DIR"
rm -rf "$WORKSPACE"
cleanup "okay"
exit 0

View file

@ -1,8 +0,0 @@
#!/bin/bash
set -e
for machine in "raspberrypi3" "raspberrypi2" "raspberrypi" "qemux86" "qemux86-64" "intel-nuc"
do
./create_homeassistant.sh -m $machine "$@" &
done
wait

View file

@ -1,129 +0,0 @@
#!/bin/bash
set -e
BUILD_CONTAINER_NAME=homeassistant-build-$$
DOCKER_PUSH="true"
DOCKER_CACHE="false"
DOCKER_WITH_LATEST="true"
DOCKER_HUB=homeassistant
cleanup() {
echo "[INFO] Cleanup."
# Stop docker container
echo "[INFO] Cleaning up homeassistant-build container."
docker stop $BUILD_CONTAINER_NAME 2> /dev/null || true
docker rm --volumes $BUILD_CONTAINER_NAME 2> /dev/null || true
if [ "$1" == "fail" ]; then
exit 1
fi
}
trap 'cleanup fail' SIGINT SIGTERM
help () {
cat << EOF
Script for homeassistant docker build
create_homeassistant [options]
Options:
-h, --help
Display this help and exit.
-h, --hub hubname
Set user of dockerhub build.
-m, --machine name
Machine type for HomeAssistant build.
-v, --version X.Y
Version/Tag/branch of HomeAssistant build.
-t, --test
Don't upload the build to docker hub.
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
key=$1
case $key in
-h|--help)
help
exit 0
;;
-h|--hub)
DOCKER_HUB=$2
shift
;;
-m|--machine)
MACHINE=$2
shift
;;
-v|--version)
DOCKER_TAG=$2
shift
;;
-t|--test)
DOCKER_PUSH="false"
;;
*)
echo "[WARNING] $0 : Argument '$1' unknown. Ignoring."
;;
esac
shift
done
# Sanity checks
if [ -z "$MACHINE" ]; then
echo "[ERROR] please set a machine!"
help
exit 1
fi
if [ -z "$DOCKER_TAG" ]; then
echo "[ERROR] please set a version/branch!"
help
exit 1
fi
# Get the absolute script location
pushd "$(dirname "$0")" > /dev/null 2>&1
SCRIPTPATH=$(pwd)
popd > /dev/null 2>&1
DOCKER_IMAGE=$DOCKER_HUB/$MACHINE-homeassistant
BUILD_DIR=${BUILD_DIR:=$SCRIPTPATH}
WORKSPACE=$BUILD_DIR/hass-$MACHINE
# setup docker
echo "[INFO] Setup docker for homeassistant"
mkdir -p "$BUILD_DIR"
mkdir -p "$WORKSPACE"
echo "[INFO] load homeassistant"
cp "../../homeassistant/machine/$MACHINE" "$WORKSPACE/Dockerfile"
sed -i "s/%%VERSION%%/${DOCKER_TAG}/g" "$WORKSPACE/Dockerfile"
echo "[INFO] prepare done for $DOCKER_IMAGE:$DOCKER_TAG"
# Run build
echo "[INFO] start docker build"
docker stop $BUILD_CONTAINER_NAME 2> /dev/null || true
docker rm --volumes $BUILD_CONTAINER_NAME 2> /dev/null || true
docker run --rm \
-v "$WORKSPACE":/docker \
-v ~/.docker:/root/.docker \
-e DOCKER_PUSH=$DOCKER_PUSH \
-e DOCKER_CACHE=$DOCKER_CACHE \
-e DOCKER_WITH_LATEST=$DOCKER_WITH_LATEST \
-e DOCKER_IMAGE="$DOCKER_IMAGE" \
-e DOCKER_TAG="$DOCKER_TAG" \
--name $BUILD_CONTAINER_NAME \
--privileged \
homeassistant/docker-build-env \
/run-docker.sh
echo "[INFO] cleanup WORKSPACE"
cd "$BUILD_DIR"
rm -rf "$WORKSPACE"
cleanup "okay"
exit 0

View file

@ -145,10 +145,9 @@ function run_build() {
local repository=$2
local image=$3
local version=$4
local build_type=$5
local build_from=$6
local build_arch=$7
local docker_cli=("${!8}")
local build_from=$5
local build_arch=$6
local docker_cli=("${!7}")
local push_images=()
@ -170,15 +169,18 @@ function run_build() {
fi
fi
# do we know the arch of build?
if [ ! -z "$build_arch" ]; then
docker_cli+=("--label" "io.hass.arch=$build_arch")
docker_cli+=("--build-arg" "BUILD_ARCH=$build_arch")
fi
# Build image
echo "[INFO] Run build for $repository/$image:$version"
docker build -t "$repository/$image:$version" \
--label "io.hass.version=$version" \
--label "io.hass.type=$build_type" \
--label "io.hass.arch=$build_arch" \
--build-arg "BUILD_FROM=$build_from" \
--build-arg "BUILD_VERSION=$version" \
--build-arg "BUILD_ARCH=$build_arch" \
"${docker_cli[@]}" \
"$build_dir"
@ -246,6 +248,7 @@ function build_addon() {
# Set additional labels
docker_cli+=("--label" "io.hass.name=$name")
docker_cli+=("--label" "io.hass.description=$description")
docker_cli+=("--label" "io.hass.type=addon")
if [ ! -z "$url" ]; then
docker_cli+=("--label" "io.hass.url=$url")
@ -253,7 +256,7 @@ function build_addon() {
# Start build
run_build "$TARGET" "$repository" "$image" "$version" \
"addon" "$build_from" "$build_arch" docker_cli[@]
"$build_from" "$build_arch" docker_cli[@]
}
@ -267,10 +270,11 @@ function build_supervisor() {
# Read version
version="$(python3 "$TARGET/setup.py" -V)"
docker_cli+=("--label" "io.hass.type=supervisor")
# Start build
run_build "$TARGET" "$DOCKER_HUB" "$image" "$version" \
"supervisor" "$build_from" "$build_arch" docker_cli[@]
"$build_from" "$build_arch" docker_cli[@]
}
@ -281,12 +285,34 @@ function build_homeassistant() {
local build_from="homeassistant/${build_arch}-homeassistant-base:latest"
local docker_cli=()
# Set labels
docker_cli+=("--label" "io.hass.type=homeassistant")
# Start build
run_build "$TARGET" "$DOCKER_HUB" "$image" "$VERSION" \
"homeassistant" "$build_from" "$build_arch" docker_cli[@]
"$build_from" "$build_arch" docker_cli[@]
}
function build_homeassistant_machine() {
local build_machine=$1
local image="${build_machine}-homeassistant"
local build_from=""
local docker_cli=()
local dockerfile="$TARGET/$build_machine"
# Set labels
docker_cli+=("--label" "io.hass.machine=$build_machine")
docker_cli+=("--file" "$dockerfile")
# Start build
run_build "$TARGET" "$DOCKER_HUB" "$image" "$VERSION" \
"$build_from" "" docker_cli[@]
}
function extract_machine_build() {
local list=$1
@ -419,7 +445,7 @@ while [[ $# -gt 0 ]]; do
done
# Check if a architecture is available
if [ "${#BUILD_LIST[@]}" -eq 0 ] && [ "$BUILT_TYPE" != "homeassistant-machine" ]; then
if [ "${#BUILD_LIST[@]}" -eq 0 ] && [ "$BUILD_TYPE" != "homeassistant-machine" ]; then
echo "[ERROR] You need select a architecture for build!"
exit 1
fi
@ -430,16 +456,6 @@ if [ "$BUILD_TYPE" != "addon" ] && [ -z "$DOCKER_HUB" ]; then
exit 1
fi
if [ "$BUILD_TYPE" == "homeassistant" ] && [ -z "$VERSION" ]; then
echo "[ERROR] Please set a version for home-assistant!"
exit 1
fi
if [ "$BUILD_TYPE" == "homeassistant-machine" ] && [ -z "$VERSION" ]; then
echo "[ERROR] Please set a version for home-assistant!"
exit 1
fi
#### Main ####
@ -456,7 +472,7 @@ if [ ! -z "$GIT_REPOSITORY" ]; then
TARGET="/data/git/$TARGET"
fi
# Select addon build
# Select arch build
echo "[INFO] Run $BUILD_TYPE build for: ${BUILD_LIST[*]}"
for arch in "${BUILD_LIST[@]}"; do
if [ "$BUILD_TYPE" == "addon" ]; then
@ -469,6 +485,15 @@ for arch in "${BUILD_LIST[@]}"; do
BUILD_TASKS+=($!)
done
# Select machine build
if [ "$BUILD_TYPE" == "homeassistant-machine" ]; then
echo "[INFO] Machine builds: ${BUILD_MACHINE[*]}"
for machine in "${BUILD_MACHINE[@]}"; do
(build_homeassistant_machine "$machine") &
BUILD_TASKS+=($!)
done
fi
# Wait until all build jobs are done
wait "${BUILD_TASKS[@]}"

View file

@ -1,13 +0,0 @@
FROM %%BASE_IMAGE%%
# add env
ENV LANG C.UTF-8
# setup base
RUN apk add --no-cache socat
# install scripts
COPY run.sh /
RUN chmod a+x /run.sh
CMD [ "/run.sh" ]

View file

@ -1,11 +0,0 @@
#!/bin/bash
set -e
# check env
if [ -z "$HASSIO" ]; then
echo "[ERROR] Need set \$HASSIO env!"
exit 1
fi
echo "[INFO] Start cluster proxy"
exec socat TCP-LISTEN:9123,fork TCP:$HASSIO:9123 < /dev/null