This commit is contained in:
Jackson Delahunt 2020-09-25 16:30:46 +10:00
commit eddefde4a6
13 changed files with 96 additions and 44 deletions

View file

@ -3,16 +3,32 @@ on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Publish to Registry
uses: elgohr/Publish-Docker-Github-Action@master
env:
DESKTOP_ENVIRONMENT_USER: ${{ secrets.DESKTOP_ENVIRONMENT_USER }}
DESKTOP_ENVIRONMENT_REGISTRY: ${{ github.actor }}
with:
dockerfile: docker/Dockerfile
name: ${{ github.actor }}/desktop-environment:latest
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
buildargs: DESKTOP_ENVIRONMENT_USER,DESKTOP_ENVIRONMENT_REGISTRY
- name: Check out repository
uses: actions/checkout@v2
- name: Sanitise Repository Name
run: echo ::set-env name=GITHUB_REPOSITORY::$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')
- name: Sanitise Repository Owner
run: echo ::set-env name=REPOSITORY_OWNER::$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')
- name: Build and Push to GitHub Container Registry
uses: whoan/docker-build-with-cache-action@master
with:
build_extra_args: --build-arg=DESKTOP_ENVIRONMENT_USER=${{ env.REPOSITORY_OWNER }}
dockerfile: docker/Dockerfile
image_name: desktop-environment
push_git_tag: true
registry: docker.pkg.github.com/${{ env.GITHUB_REPOSITORY }}
username: ${{ env.REPOSITORY_OWNER }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Run desktop environment tests
run: ./docker/scripts/test.sh
env:
DESKTOP_ENVIRONMENT_REGISTRY: docker.pkg.github.com/${{ env.GITHUB_REPOSITORY }}
DESKTOP_ENVIRONMENT_CONTAINER_TAG: ${{ github.ref }}
continue-on-error: true

View file

@ -23,7 +23,7 @@ Set your [user configuration](docker/scripts/environment.sh#L3) and go.
## Keybindings
```sh
# Launch alacritty
# Launch terminal
Mod + Return
# Launch chrome
@ -55,4 +55,5 @@ Mod + slash
## Project Goals
- [x] A computer wholly defined in code.
- [x] Only one command required to start from scratch.
- [x] Only one command required to start from scratch.

View file

@ -1,11 +1,9 @@
FROM ubuntu:19.04
ARG DESKTOP_ENVIRONMENT_HOST_USER_PASSWORD
ARG DESKTOP_ENVIRONMENT_REGISTRY
ARG DESKTOP_ENVIRONMENT_USER
ENV DESKTOP_ENVIRONMENT_HOST_USER_PASSWORD ${DESKTOP_ENVIRONMENT_HOST_USER_PASSWORD:-'$6$7De0aW9hUvGDKZmc$qrylcFmwKAL9iGNG9dvQ/GXCM4gLY.hES/P2d/3ZzRxkVMjD77WeTVSxV1P9XtmE9iAUmDwDTCHiVK.p5Ct1y1:18193:0:99999:7:::'}
ENV DESKTOP_ENVIRONMENT_REGISTRY $DESKTOP_ENVIRONMENT_REGISTRY
ENV DISPLAY :1
ENV EDITOR nano
ENV LANG en_US.UTF-8
@ -40,7 +38,7 @@ RUN locale-gen $LANG && \
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone
# Install cloud computer utilities
# Install desktop environment utilities
RUN apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -qq --fix-missing \
alsa-utils \
@ -339,13 +337,15 @@ RUN git clone --depth 1 https://github.com/tmux-plugins/tpm $HOME/.tmux/plugins/
# Install tmuxinator
RUN gem install tmuxinator -v 1.1.5
# Install vs code, vs live share dependencies, and shfmt extension dependency
# Install vs code, vs live share dependencies, shfmt extension dependency, and vs-wal
RUN wget -O code.deb -nv https://go.microsoft.com/fwlink/?LinkID=760868 && \
apt-get install -qq ./code.deb && \
rm code.deb && \
apt-get install -qq libicu[0-9][0-9] libkrb5-3 zlib1g libsecret-1-0 desktop-file-utils x11-utils && \
wget -O /usr/local/bin/shfmt -nv https://github.com/mvdan/sh/releases/download/v2.6.3/shfmt_v2.6.3_linux_amd64 && \
chmod +x /usr/local/bin/shfmt
chmod +x /usr/local/bin/shfmt && \
git clone https://github.com/Bluedrack28/vscode-wal.git ~/.vscode/extensions/vscode-wal && \
cd ~/.vscode/extensions/vscode-wal && ./script.sh
# Install warnai
RUN apt-get update -qq && \
@ -405,18 +405,10 @@ RUN sed -i 's/allowed_users=console/allowed_users=anybody/' /etc/X11/Xwrapper.co
echo needs_root_rights=yes >> /etc/X11/Xwrapper.config && \
chmod u+s /usr/bin/xinit
# Create the docker group with the host os group id, backing up any existing group with docker group id
ENV DOCKER_GROUP 999
RUN getent group $DOCKER_GROUP | \
grep -v docker | \
cut -d: -f1 | \
xargs groupmod --gid 9999 2>/dev/null || true
RUN groupmod --gid $DOCKER_GROUP docker
# Create a non-root user for safe operation
RUN useradd \
--create-home \
--groups $DOCKER_GROUP,audio,chrome,input,netdev,shadow,sudo,tty,video \
--groups audio,chrome,docker,input,netdev,shadow,sudo,tty,video \
--shell /bin/zsh \
$USER
@ -435,10 +427,11 @@ ARG DOTFILES_CACHEBUST
RUN DOTFILES_CACHEBUST=$DOTFILES_CACHEBUST echo "Building from dotfiles..."
# Clone user dotfiles
RUN vcsh clone https://$DESKTOP_ENVIRONMENT_REGISTRY@github.com/$DESKTOP_ENVIRONMENT_REGISTRY/dotfiles.git && \
RUN vcsh clone https://github.com/$DESKTOP_ENVIRONMENT_USER/dotfiles.git && \
$HOME/.dotfiles-bootstrap.sh
# Record container build information
ARG DESKTOP_CONTAINER_GIT_SHA
ENV CONTAINER_GIT_SHA $DESKTOP_CONTAINER_GIT_SHA
ENV CONTAINER_IMAGE_NAME sabrehagen/desktop-environment
ARG DESKTOP_ENVIRONMENT_CONTAINER_IMAGE_NAME
ENV DESKTOP_ENVIRONMENT_CONTAINER_IMAGE_NAME $DESKTOP_ENVIRONMENT_CONTAINER_IMAGE_NAME

View file

@ -8,12 +8,12 @@ DESKTOP_ENVIRONMENT_HOST_USER_PASSWORD=$(sudo cat /etc/shadow | grep $DESKTOP_EN
docker build \
--build-arg DESKTOP_CONTAINER_GIT_SHA=$(git --git-dir $REPO_ROOT/.git rev-parse HEAD | cut -b 1-7) \
--build-arg DESKTOP_ENVIRONMENT_CONTAINER_IMAGE_NAME="$DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE" \
--build-arg DESKTOP_ENVIRONMENT_HOST_USER_PASSWORD="$DESKTOP_ENVIRONMENT_HOST_USER_PASSWORD" \
--build-arg DESKTOP_ENVIRONMENT_REGISTRY="$DESKTOP_ENVIRONMENT_REGISTRY" \
--build-arg DESKTOP_ENVIRONMENT_USER="$DESKTOP_ENVIRONMENT_USER" \
--build-arg DOTFILES_CACHEBUST=$(cat $REPO_ROOT/.dotfiles-cachebust 2>/dev/null) \
--file $REPO_ROOT/docker/Dockerfile \
--network host \
--tag $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_NAME:$DESKTOP_ENVIRONMENT_CONTAINER_TAG \
--tag $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_NAME:latest \
--tag $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE:$DESKTOP_ENVIRONMENT_CONTAINER_TAG \
--tag $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE:latest \
$REPO_ROOT/docker

View file

@ -1,10 +1,12 @@
REPO_ROOT=$(dirname $(readlink -f $0))/../..
DESKTOP_ENVIRONMENT_CONTAINER_NAME=desktop-environment
DESKTOP_ENVIRONMENT_REGISTRY=sabrehagen
DESKTOP_ENVIRONMENT_USER=$USER
DESKTOP_ENVIRONMENT_CONTAINER_IMAGE=desktop-environment
DESKTOP_ENVIRONMENT_CONTAINER_NAME=${DESKTOP_ENVIRONMENT_CONTAINER_NAME-$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE}
DESKTOP_ENVIRONMENT_REGISTRY=${DESKTOP_ENVIRONMENT_REGISTRY-$DESKTOP_ENVIRONMENT_USER}
# Desktop environment repository information
echo export DESKTOP_ENVIRONMENT_CONTAINER_IMAGE=$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE
echo export DESKTOP_ENVIRONMENT_CONTAINER_NAME=$DESKTOP_ENVIRONMENT_CONTAINER_NAME
echo export DESKTOP_ENVIRONMENT_CONTAINER_TAG=${DESKTOP_ENVIRONMENT_CONTAINER_TAG-$(git --git-dir $REPO_ROOT/.git rev-parse --abbrev-ref HEAD)}
echo export DESKTOP_ENVIRONMENT_REGISTRY=$DESKTOP_ENVIRONMENT_REGISTRY

View file

@ -5,4 +5,5 @@ eval "$($REPO_ROOT/docker/scripts/environment.sh)"
docker exec \
--interactive \
$DESKTOP_ENVIRONMENT_CONTAINER_NAME zsh -c "$*"
--user root \
$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE zsh -c "$*"

View file

@ -6,5 +6,4 @@ eval "$($REPO_ROOT/docker/scripts/environment.sh)"
docker exec \
--interactive \
--tty \
--user $DESKTOP_ENVIRONMENT_USER \
$DESKTOP_ENVIRONMENT_CONTAINER_NAME zsh -c "$*"
$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE zsh -c "$*"

View file

@ -5,7 +5,7 @@ eval "$($REPO_ROOT/docker/scripts/environment.sh)"
# Remove all non desktop environment containers
docker ps -a | \
grep -v " $DESKTOP_ENVIRONMENT_CONTAINER_NAME" | \
grep -v " $DESKTOP_ENVIRONMENT_CONTAINER_IMAGE" | \
grep -v "CONTAINER " | \
cut -b 1-20 | \
xargs docker rm -f

View file

@ -3,4 +3,4 @@ REPO_ROOT=$(dirname $(readlink -f $0))/../..
# Export desktop environment shell configuration
eval "$($REPO_ROOT/docker/scripts/environment.sh)"
docker push $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_NAME:$DESKTOP_ENVIRONMENT_CONTAINER_TAG
docker push $DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE:$DESKTOP_ENVIRONMENT_CONTAINER_TAG

View file

@ -33,7 +33,6 @@ docker run \
--network host \
--rm \
--security-opt apparmor:unconfined \
--user $DESKTOP_ENVIRONMENT_USER \
--volume /dev/displaylink:/dev/displaylink \
--volume /dev/shm:/dev/shm \
--volume /run/udev:/run/udev \
@ -67,11 +66,14 @@ docker run \
--volume DESKTOP_ENVIRONMENT_USER_TORRENTS:$DESKTOP_ENVIRONMENT_USER_TORRENTS \
--volume DESKTOP_ENVIRONMENT_USER_VIDEOS:$DESKTOP_ENVIRONMENT_USER_VIDEOS \
--workdir $DESKTOP_ENVIRONMENT_USER_HOME \
$DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_NAME:$DESKTOP_ENVIRONMENT_CONTAINER_TAG \
$DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE:$DESKTOP_ENVIRONMENT_CONTAINER_TAG \
sleep infinity
# Wait until the desktop environment container is running before proceeding
until docker inspect $DESKTOP_ENVIRONMENT_CONTAINER_NAME | grep Status | grep -m 1 running >/dev/null; do sleep 1; done
# Make the container docker group id the same as the host docker group id so mounted docker socket permissions match
$REPO_ROOT/docker/scripts/exec-root.sh groupmod -g $(grep docker /etc/group | cut -f3 -d:) docker
# Start the desktop environment inside the container
$REPO_ROOT/docker/scripts/exec.sh /home/$DESKTOP_ENVIRONMENT_USER/.config/scripts/startup.sh

View file

@ -3,4 +3,4 @@ REPO_ROOT=$(dirname $(readlink -f $0))/../..
# Export desktop environment shell configuration
eval "$($REPO_ROOT/docker/scripts/environment.sh)"
docker rm -f $DESKTOP_ENVIRONMENT_CONTAINER_NAME
docker rm -f $DESKTOP_ENVIRONMENT_CONTAINER_IMAGE

38
docker/scripts/test.sh Executable file
View file

@ -0,0 +1,38 @@
REPO_ROOT=$(dirname $(readlink -f $0))/../..
# Export desktop environment shell configuration
eval "$($REPO_ROOT/docker/scripts/environment.sh)"
# Ensure the desktop environment test network exists
docker network create $DESKTOP_ENVIRONMENT_DOCKER_NETWORK
# Set the desktop environment test container name
DESKTOP_ENVIRONMENT_CONTAINER_NAME=${DESKTOP_ENVIRONMENT_CONTAINER_IMAGE}-test-$(date +%s)
# Start the desktop environment test container
docker run \
--detach \
--env DESKTOP_ENVIRONMENT_USER \
--name $DESKTOP_ENVIRONMENT_CONTAINER_NAME \
--rm \
--workdir $DESKTOP_ENVIRONMENT_USER_HOME \
$DESKTOP_ENVIRONMENT_REGISTRY/$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE:$DESKTOP_ENVIRONMENT_CONTAINER_TAG \
sleep infinity
exit 1
# Wait until the desktop environment test container is running before proceeding
until docker inspect $DESKTOP_ENVIRONMENT_CONTAINER_NAME | grep Status | grep -m 1 running >/dev/null; do sleep 1; done
# Start the vnc server inside the desktop environment test container
$REPO_ROOT/docker/scripts/exec.sh /home/$DESKTOP_ENVIRONMENT_USER/.config/scripts/startup.sh
# Check desktop environment vnc server started successfully
$REPO_ROOT/docker/scripts/exec.sh "curl --silent localhost | grep -iq vnc"
TEST_RESULT=$?
# Remove desktop environment test container
docker rm -f $DESKTOP_ENVIRONMENT_CONTAINER_NAME
# Exit with test result exit code
exit $TEST_RESULT

View file

@ -7,7 +7,7 @@ eval "$($REPO_ROOT/docker/scripts/environment.sh)"
docker exec \
--interactive \
--tty \
$DESKTOP_ENVIRONMENT_CONTAINER_NAME \
$DESKTOP_ENVIRONMENT_CONTAINER_IMAGE \
tmux new-session \
-s desktop-environment-shell-$(date +%s) \
-t desktop-environment-shell