From fd87353f2e5f23476e3228821caa044f9b83db0d Mon Sep 17 00:00:00 2001 From: Issac Date: Tue, 4 Feb 2020 18:15:13 +0200 Subject: [PATCH] Add devcontainer (#1040) * Add devcontainer (generic add-on devcontainer also available at https://github.com/issacg/hassio-addon-devcontainer) * remove example code (https://github.com/home-assistant/hassio-addons/pull/1040#discussion_r374373037) * Run start_hassio.sh from inside .devcontainer (https://github.com/home-assistant/hassio-addons/pull/1040#discussion_r374373323) --- .devcontainer/Dockerfile | 34 +++++++++++ .devcontainer/devcontainer.json | 17 ++++++ .devcontainer/start_hassio.sh | 103 ++++++++++++++++++++++++++++++++ .vscode/tasks.json | 41 +++++++++++++ 4 files changed, 195 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/start_hassio.sh create mode 100644 .vscode/tasks.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..d9c8870 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,34 @@ +FROM ubuntu:18.04 + +WORKDIR /workspaces + +# Default ENV +ENV LANG C.UTF-8 +ENV DEBIAN_FRONTEND noninteractive + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Install docker +# https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + dbus \ + software-properties-common \ + gpg-agent \ + git \ + sudo \ + && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - \ + && add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ + && apt-get update && apt-get install -y --no-install-recommends \ + docker-ce \ + docker-ce-cli \ + containerd.io +# This is a development container. Don't bother to clean up apt cache, this way we have it handy later + +# Generate a machine-id for this container +RUN rm /etc/machine-id && dbus-uuidgen --ensure=/etc/machine-id + +ENV DEBIAN_FRONTEND=dialog \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..082f066 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,17 @@ +// Based on https://github.com/issacg/hassio-addon-devcontainer +{ + "name": "Hass.io Community Add-Ons", + "context": "..", + "dockerFile": "Dockerfile", + "appPort": 8123, + "runArgs": [ + "-e", + "GIT_EDITOR=code --wait", + "--privileged" + ], + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/test_hassio/addons/local,type=bind,consistency=delegated", + "workspaceFolder": "/workspaces/test_hassio/addons/local" +} diff --git a/.devcontainer/start_hassio.sh b/.devcontainer/start_hassio.sh new file mode 100644 index 0000000..76b609a --- /dev/null +++ b/.devcontainer/start_hassio.sh @@ -0,0 +1,103 @@ +#!/bin/bash +set -eE + +DOCKER_TIMEOUT=30 +DOCKER_PID=0 + + +function start_docker() { + local starttime + local endtime + + echo "Starting docker." + dockerd 2> /dev/null & + DOCKER_PID=$! + + echo "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 "Timeout while waiting for docker to come up" + exit 1 + fi + done + echo "Docker was initialized" +} + + +function stop_docker() { + local starttime + local endtime + + echo "Stopping in container docker..." + if [ "$DOCKER_PID" -gt 0 ] && kill -0 "$DOCKER_PID" 2> /dev/null; then + starttime="$(date +%s)" + endtime="$(date +%s)" + + # Now wait for it to die + kill "$DOCKER_PID" + while kill -0 "$DOCKER_PID" 2> /dev/null; do + if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then + sleep 1 + endtime=$(date +%s) + else + echo "Timeout while waiting for container docker to die" + exit 1 + fi + done + else + echo "Your host might have been left with unreleased resources" + fi +} + + +function install() { + docker pull homeassistant/amd64-hassio-supervisor:dev + docker pull homeassistant/amd64-hassio-cli:dev +} + +function cleanup_hass_data() { + rm -rf /workspaces/test_hassio/{apparmor,backup,config.json,dns,dns.json,homeassistant,homeassistant.json,ingress.json,share,ssl,tmp,updater.json} + rm -rf /workspaces/test_hassio/addons/{core,data,git} +} + +function cleanup_docker() { + echo "Cleaning up stopped containers..." + docker rm $(docker ps -a -q) +} + +function run_supervisor() { + docker run --rm --privileged \ + --name hassio_supervisor \ + --security-opt seccomp=unconfined \ + --security-opt apparmor:unconfined \ + -v /run/docker.sock:/run/docker.sock \ + -v /run/dbus:/run/dbus \ + -v "/workspaces/test_hassio":/data \ + -v /etc/machine-id:/etc/machine-id:ro \ + -e SUPERVISOR_SHARE="/workspaces/test_hassio" \ + -e SUPERVISOR_NAME=hassio_supervisor \ + -e SUPERVISOR_DEV=1 \ + -e HOMEASSISTANT_REPOSITORY="homeassistant/qemux86-64-homeassistant" \ + homeassistant/amd64-hassio-supervisor:dev +} + +case "$1" in + "--cleanup") + echo "Cleaning up old environment" + cleanup_docker || true + cleanup_hass_data || true + exit 0;; + *) + echo "Creating development Hass.io environment" + start_docker + trap "stop_docker" ERR + cleanup_docker || true + install + run_supervisor + stop_docker;; +esac \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..9a2b2b2 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Start Hass.io", + "type": "shell", + "command": "/workspaces/test_hassio/addons/local/.devcontainer/start_hassio.sh", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + },{ + "label": "Cleanup stale Hass.io environment", + "type": "shell", + "command": "/workspaces/test_hassio/addons/local/.devcontainer/start_hassio.sh --cleanup", + "group": "test", + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + },{ + "label": "Run Hass.io CLI", + "type": "shell", + "command": "docker run --rm -ti -v /etc/machine-id:/etc/machine-id --network=hassio --add-host hassio:172.30.32.2 homeassistant/amd64-hassio-cli:dev", + "group": "test", + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file