From 904c687ea38046b1dfe0ba31da5acdba2d27a3ff Mon Sep 17 00:00:00 2001 From: Jackson Delahunt Date: Tue, 26 Feb 2019 13:48:10 +1100 Subject: [PATCH] packer --- .gitignore | 1 + credentials/authenticate.sh | 4 ++++ docker/scripts/environment.sh | 2 +- host/bootstrap.sh | 13 ++++++++++--- host/xpra.sh | 26 ++++++++++++-------------- packer/build.sh | 21 +++++++++++++++++++++ packer/desktop-environment.json | 25 +++++++++++++++++++++++++ packer/packer.json | 27 --------------------------- terraform/desktop-environment.tf | 19 ++++++++----------- terraform/scripts/start.sh | 16 ---------------- terraform/start.sh | 22 ++++++++++++++++++++++ terraform/variables.tf | 12 ++++++++++++ 12 files changed, 116 insertions(+), 72 deletions(-) create mode 100644 credentials/authenticate.sh create mode 100755 packer/build.sh create mode 100644 packer/desktop-environment.json delete mode 100644 packer/packer.json delete mode 100755 terraform/scripts/start.sh create mode 100755 terraform/start.sh diff --git a/.gitignore b/.gitignore index 333c1e9..14de775 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +credentials.json logs/ diff --git a/credentials/authenticate.sh b/credentials/authenticate.sh new file mode 100644 index 0000000..750bf60 --- /dev/null +++ b/credentials/authenticate.sh @@ -0,0 +1,4 @@ +# Extract credentials from environment +if [ ! -z "$DESKTOP_ENVIRONMENT_CREDENTIALS" ]; then + echo $DESKTOP_ENVIRONMENT_CREDENTIALS > credentials.json +fi diff --git a/docker/scripts/environment.sh b/docker/scripts/environment.sh index 1039d57..1e654c9 100755 --- a/docker/scripts/environment.sh +++ b/docker/scripts/environment.sh @@ -27,7 +27,7 @@ echo DESKTOP_ENVIRONMENT_CACHE_YARN=$DESKTOP_ENVIRONMENT_HOME/.cache/yarn echo DESKTOP_ENVIRONMENT_CACHE_ZOOM=$DESKTOP_ENVIRONMENT_HOME/.cache/zoom echo DESKTOP_ENVIRONMENT_CACHE_ZSH=$DESKTOP_ENVIRONMENT_HOME/.cache/zsh -# Desktop environment application configuration volumes +# Desktop environment application state volumes echo DESKTOP_ENVIRONMENT_STATE_CHROME=$DESKTOP_ENVIRONMENT_HOME/.config/google-chrome echo DESKTOP_ENVIRONMENT_STATE_CODE=$DESKTOP_ENVIRONMENT_HOME/.config/Code echo DESKTOP_ENVIRONMENT_STATE_GITHUB=$DESKTOP_ENVIRONMENT_HOME/.config/github diff --git a/host/bootstrap.sh b/host/bootstrap.sh index bc161ac..2736ead 100755 --- a/host/bootstrap.sh +++ b/host/bootstrap.sh @@ -16,7 +16,7 @@ if [ ! "$REPO_ROOT" -ef "$DESKTOP_ENVIRONMENT_REPOSITORY" ]; then git clone https://github.com/$DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER $DESKTOP_ENVIRONMENT_REPOSITORY # Restart bootstrap from the global location - $DESKTOP_ENVIRONMENT_REPOSITORY/host/bootstrap.sh + $DESKTOP_ENVIRONMENT_REPOSITORY/host/bootstrap.sh "$@" exit 0 fi @@ -135,5 +135,12 @@ $REPO_ROOT/docker/scripts/build.sh # Ensure the container user has ownership of the volumes before starting $REPO_ROOT/docker/scripts/bootstrap-volumes.sh -# Recycle the desktop environment -$DESKTOP_ENVIRONMENT_REPOSITORY/docker/scripts/recycle.sh +# Start the desktop environment if requested +if [ "$1" = "--start" ]; then + $REPO_ROOT/docker/scripts/start.sh +fi + +# Start the X server in a cloud environment +if [ "$1" = "--cloud" ]; then + $REPO_ROOT/host/xpra.sh +fi diff --git a/host/xpra.sh b/host/xpra.sh index 29bb019..fd4e038 100755 --- a/host/xpra.sh +++ b/host/xpra.sh @@ -3,18 +3,29 @@ REPO_ROOT=$(dirname $(realpath $0))/.. # Export desktop environment shell configuration export $($REPO_ROOT/docker/scripts/environment.sh) +# Kill all existing xpra services docker ps -a | grep xpra | cut -c 1-15 | xargs docker rm -f +DISPLAY=:14 + # Start the xpra server docker run \ --detach \ --env MODE=tcp \ --env XPRA_HTML=yes \ - --env DISPLAY=:14 \ + --env DISPLAY=$DISPLAY \ --name $DESKTOP_ENVIRONMENT_CONTAINER-xpra-x11-bridge \ --publish 10000:10000 \ jare/x11-bridge:latest +# Start a desktop environment attached to the xpra server +docker run \ + --detach \ + --env DISPLAY=$DISPLAY \ + --name $DESKTOP_ENVIRONMENT_CONTAINER-xpra-client \ + --volumes-from $DESKTOP_ENVIRONMENT_CONTAINER-xpra-x11-bridge \ + $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER:$DESKTOP_ENVIRONMENT_BRANCH + ACME_DOMAINS= ACME_EMAIL= ACME_ENABLE= @@ -25,17 +36,4 @@ TRAEFIK_ENTRYPOINT_HTTPS= TRAEFIK_HOST= # Make the X server publicly accessible -# docker run \ -# --detach \ -# --name $DESKTOP_ENVIRONMENT_CONTAINER-xpra-nginx-proxy \ -# nginx:alpine - -# Start a container attached to the xpra server -docker run \ - --detach \ - --env DISPLAY=:14 \ - --name $DESKTOP_ENVIRONMENT_CONTAINER-xpra-client \ - --volumes-from $DESKTOP_ENVIRONMENT_CONTAINER-xpra-x11-bridge \ - sabrehagen/desktop-environment:latest - docker exec -it --user jackson $DESKTOP_ENVIRONMENT_CONTAINER-xpra-client code diff --git a/packer/build.sh b/packer/build.sh new file mode 100755 index 0000000..ad97e7b --- /dev/null +++ b/packer/build.sh @@ -0,0 +1,21 @@ +REPO_ROOT=$(dirname $(realpath $0))/.. + +# Export desktop environment shell configuration +export $($REPO_ROOT/docker/scripts/environment.sh) + +# Authenticate with cloud service provider +$REPO_ROOT/credentials/authenticate.sh + +docker run \ + --env GOOGLE_APPLICATION_CREDENTIALS=$DESKTOP_ENVIRONMENT_HOST_REPOSITORY/credentials/credentials.json \ + --interactive \ + --rm \ + --tty \ + --volume $DESKTOP_ENVIRONMENT_HOST_REPOSITORY:$DESKTOP_ENVIRONMENT_HOST_REPOSITORY \ + --workdir $DESKTOP_ENVIRONMENT_HOST_REPOSITORY \ + hashicorp/packer:light build \ + -force \ + -var DESKTOP_ENVIRONMENT_USER=$DESKTOP_ENVIRONMENT_USER \ + -var DESKTOP_ENVIRONMENT_REGISTRY=$DESKTOP_ENVIRONMENT_REGISTRY \ + -var DESKTOP_ENVIRONMENT_REPOSITORY=$DESKTOP_ENVIRONMENT_REPOSITORY \ + desktop-environment.json diff --git a/packer/desktop-environment.json b/packer/desktop-environment.json new file mode 100644 index 0000000..969122c --- /dev/null +++ b/packer/desktop-environment.json @@ -0,0 +1,25 @@ +{ + "builders": [ + { + "type": "googlecompute", + "source_image_family": "ubuntu-minimal-1810", + "project_id": "stemnapp", + "zone": "australia-southeast1-a", + "instance_name": "packer-${var.DESKTOP_ENVIRONMENT_REGISTRY}-${var.DESKTOP_ENVIRONMENT_REPOSITORY}-{{timestamp}}", + "image_name": "${var.DESKTOP_ENVIRONMENT_REGISTRY}-${var.DESKTOP_ENVIRONMENT_REPOSITORY}", + "ssh_username": "root" + } + ], + "provisioners": [ + { + "type": "shell", + "inline": [ + "# Clone the desktop environment repository", + "git clone https://github.com/${var.DESKTOP_ENVIRONMENT_REGISTRY}-${var.DESKTOP_ENVIRONMENT_REPOSITORY}", + + "# Bootstrap the host", + "${var.DESKTOP_ENVIRONMENT_REPOSITORY}/host/bootstrap.sh" + ] + } + ] +} diff --git a/packer/packer.json b/packer/packer.json deleted file mode 100644 index 6191ba6..0000000 --- a/packer/packer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "builders": [ - { - "type": "googlecompute", - "account_file": "/stemn/credentials/development-environment.json", - "source_image_family": "ubuntu-minimal-1810", - "project_id": "stemnapp", - "zone": "australia-southeast1-a", - "instance_name": "packer-development-environment-{{timestamp}}", - "image_name": "development-environment", - "ssh_username": "root" - } - ], - "provisioners": [ - { - "type": "file", - "source": "../docker/scripts/bootstrap.sh", - "destination": "/bootstrap.sh" - }, - { - "type": "shell", - "inline": [ - "/bootstrap.sh" - ] - } - ] -} diff --git a/terraform/desktop-environment.tf b/terraform/desktop-environment.tf index 4b9b1ad..11ea6d1 100644 --- a/terraform/desktop-environment.tf +++ b/terraform/desktop-environment.tf @@ -1,5 +1,4 @@ provider "google" { - credentials = "${file("${var.gcp_credentials_path}")}" project = "${var.gcp_project}" } @@ -8,7 +7,7 @@ resource "random_id" "instance_id" { } locals { - environment_name = "desktop-environment-${random_id.instance_id.hex}" + environment_name = "${var.DESKTOP_ENVIRONMENT_REGISTRY}-${var.DESKTOP_ENVIRONMENT_REPOSITORY}-${random_id.instance_id.hex}" } resource "google_compute_instance" "desktop-environment" { @@ -16,7 +15,7 @@ resource "google_compute_instance" "desktop-environment" { machine_type = "${var.machine_type}" name = "${local.environment_name}" project = "${var.gcp_project}" - tags = ["desktop-environment"] + tags = ["${local.environment_name}"] zone = "${var.machine_region}-a" boot_disk { @@ -42,14 +41,11 @@ resource "google_compute_instance" "desktop-environment" { provisioner "remote-exec" { inline = [ - "# Start the X server", + "# Clone the desktop environment", + "git clone https://github.com/${var.DESKTOP_ENVIRONMENT_REGISTRY}/${var.DESKTOP_ENVIRONMENT_REPOSITORY}", - "# Clone and start the desktop environment", - "git clone https://github.com/sabrehagen/desktop-environment", - "desktop-environment/host/bootstrap.sh", - - "# Expose X server publicly with nginx", - "desktop-environment/docker/scripts/exec.sh ~/.config/scripts/traefik.sh", + "# Start the desktop-environment", + "${var.DESKTOP_ENVIRONMENT_REPOSITORY}/host/bootstrap-cloud.sh", ] } @@ -70,12 +66,13 @@ resource "google_compute_firewall" "desktop-environment" { allow { ports = [ + "80", "443", ] protocol = "tcp" } - target_tags = ["desktop-environment"] + target_tags = ["${local.environment_name}"] } resource "google_compute_subnetwork" "desktop-environment" { diff --git a/terraform/scripts/start.sh b/terraform/scripts/start.sh deleted file mode 100755 index 0a882c5..0000000 --- a/terraform/scripts/start.sh +++ /dev/null @@ -1,16 +0,0 @@ -REPO_ROOT=$(dirname $(realpath $0))/../.. - -# Export desktop environment shell configuration -export $($REPO_ROOT/docker/scripts/environment.sh) - -docker run \ - --interactive \ - --rm \ - --tty \ - --volume $PWD:$PWD \ - --workdir $PWD \ - hashicorp/terraform:light apply \ - -auto-approve \ - -var owner_host=$(hostname) \ - -var owner_name=$(whoami) \ - -lock=false diff --git a/terraform/start.sh b/terraform/start.sh new file mode 100755 index 0000000..86fdce6 --- /dev/null +++ b/terraform/start.sh @@ -0,0 +1,22 @@ +REPO_ROOT=$(dirname $(realpath $0))/../.. + +# Export desktop environment shell configuration +export $($REPO_ROOT/docker/scripts/environment.sh) + +# Authenticate with cloud service provider +$REPO_ROOT/credentials/authenticate.sh + +docker run \ + --env GOOGLE_APPLICATION_CREDENTIALS=$DESKTOP_ENVIRONMENT_HOST_REPOSITORY/credentials/credentials.json \ + --interactive \ + --rm \ + --tty \ + --volume $DESKTOP_ENVIRONMENT_HOST_REPOSITORY:$DESKTOP_ENVIRONMENT_HOST_REPOSITORY \ + --workdir $DESKTOP_ENVIRONMENT_HOST_REPOSITORY \ + hashicorp/terraform:light apply \ + -auto-approve \ + -var DESKTOP_ENVIRONMENT_USER=$DESKTOP_ENVIRONMENT_USER \ + -var DESKTOP_ENVIRONMENT_REGISTRY=$DESKTOP_ENVIRONMENT_REGISTRY \ + -var DESKTOP_ENVIRONMENT_REPOSITORY=$DESKTOP_ENVIRONMENT_REPOSITORY \ + -var owner_host=$(hostname) \ + -var owner_name=$(whoami) diff --git a/terraform/variables.tf b/terraform/variables.tf index d3ee813..be758fc 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -1,3 +1,15 @@ +variable "DESKTOP_ENVIRONMENT_USER" { + description = "The DESKTOP_ENVIRONMENT_USER environment variable." +} + +variable "DESKTOP_ENVIRONMENT_REGISTRY" { + description = "The DESKTOP_ENVIRONMENT_REGISTRY environment variable." +} + +variable "DESKTOP_ENVIRONMENT_REPOSITORY" { + description = "The DESKTOP_ENVIRONMENT_REPOSITORY environment variable." +} + variable "gcp_project" { description = "The project to create the machine in." default = "stemnapp"