From 8ed008cf552fbf7f2233d654e06d4f25686a71b4 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sat, 24 Sep 2022 17:49:10 -0700 Subject: [PATCH] Initial commit --- .gitignore | 1 + 32bit.dockerfile | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 64bit.dockerfile | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 29 +++++++++++++++ README.md | 25 +++++++++++++ 5 files changed, 237 insertions(+) create mode 100644 .gitignore create mode 100644 32bit.dockerfile create mode 100644 64bit.dockerfile create mode 100644 Makefile create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6fa190 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +ssh/* diff --git a/32bit.dockerfile b/32bit.dockerfile new file mode 100644 index 0000000..7d71287 --- /dev/null +++ b/32bit.dockerfile @@ -0,0 +1,91 @@ +## +# Fully build and distribute Linux and Windows binaries for Project: Doodle. +# +# Artifact outputs will be in the dist/mw/ folder. +# +# Windows binary cross-compiled with mingw from the Fedora +# docker container. +## + +FROM i386/debian:latest +ENV GOPATH /go +ENV GOPROXY direct +ENV PATH /opt/go/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/go/bin + +# Debian: Update all software and get dependencies. +RUN apt update && apt -y upgrade && apt -y dist-upgrade +RUN apt -y install git zip tar libsdl2-dev libsdl2-ttf-dev \ + libsdl2-mixer-dev gcc-mingw-w64-i686 gcc make wget \ + flatpak-builder ruby-dev gcc rpm libffi-dev + +# Create a user to build the packages. +RUN useradd builder -u 1000 -m -G users && \ + mkdir /go /git && chown -R builder:users /go /git + +# Download and install modern Go. +WORKDIR /root +RUN wget https://go.dev/dl/go1.19.1.linux-386.tar.gz -O go.tgz && \ + tar -xzvf go.tgz && \ + cp -r go /opt/go + +# Git clone all the repos. +RUN git clone https://git.kirsle.net/SketchyMaze/rtp /git/rtp +RUN git clone https://git.kirsle.net/SketchyMaze/vendor /git/vendor +RUN git clone https://git.kirsle.net/SketchyMaze/assets /git/assets +RUN git clone https://git.kirsle.net/SketchyMaze/doodle /go/src/git.kirsle.net/SketchyMaze/doodle +RUN git clone https://git.kirsle.net/SketchyMaze/doodads /go/src/git.kirsle.net/SketchyMaze/doodle/deps/doodads + +# MinGW setup for Windows executable cross-compile. +WORKDIR /git/vendor/mingw-libs +RUN for i in *.tar.gz; do tar -xzvf $i; done +RUN cp -rv SDL2-2.0.9/i686-w64-mingw32 /usr && \ + cp -rv SDL2_mixer-2.0.4/i686-w64-mingw32 /usr && \ + cp -rv SDL2_ttf-2.0.15/i686-w64-mingw32 /usr +RUN mkdir -p /usr/lib/golang/pkg/windows_386 && \ + chown -R builder:users /usr/lib/golang/pkg/windows_386 + +# Pre-download my Go render engine libraries +RUN git clone https://git.kirsle.net/go/ui /git/go/ui +RUN git clone https://git.kirsle.net/go/render /git/go/render +RUN git clone https://git.kirsle.net/go/audio /git/go/audio + +# Enter Doodle's directory, patch the go.mod and fetch the guidebook. +WORKDIR /go/src/git.kirsle.net/SketchyMaze/doodle +RUN echo "replace git.kirsle.net/go/ui => /git/go/ui" >> go.mod && \ + echo "replace git.kirsle.net/go/render => /git/go/render" >> go.mod && \ + echo "replace git.kirsle.net/go/audio => /git/go/audio" >> go.mod && \ + cat go.mod && \ + wget -O - https://download.sketchymaze.com/guidebook.tar.gz | tar -xzvf - + +# Install Go dependencies and such. +RUN make setup + +# Install the doodad tool into our $PATH. +RUN make install + +# Copy default vendored assets in. +RUN cp -r /git/vendor/fonts ./assets/fonts && \ + cp -r /git/assets/levelpacks/levelpacks ./assets/levelpacks && \ + mkdir rtp && cp -r /git/rtp/* rtp/ + +RUN ls -hal && pwd +RUN mkdir -p bin && cp /git/vendor/DLL-32bit/*.dll bin/ + +# Package rpm and deb for Linux. +# TODO: fpm doesn't like to install in Docker right now +RUN apt -y install ruby-dev ruby-rubygems rpm libffi-dev +RUN gem install fpm; exit 0 + +# Run the big mingw-release, which: +# - builds the doodads +# - embeds the bindata files +# - builds the program for Linux +# - builds for Windows via MinGW +# - runs `make dist/` creating an uber build for both OS's +# - runs release.sh to carve out the Linux and Windows versions and +# zip them all up nicely. +RUN make mingw32-release + +CMD ["cp", "-r", "-v", \ + "/go/src/git.kirsle.net/SketchyMaze/doodle/dist/release/", \ + "/mnt/export/"] diff --git a/64bit.dockerfile b/64bit.dockerfile new file mode 100644 index 0000000..805525a --- /dev/null +++ b/64bit.dockerfile @@ -0,0 +1,91 @@ +## +# Fully build and distribute Linux and Windows binaries for Project: Doodle. +# +# Artifact outputs will be in the dist/mw/ folder. +# +# Windows binary cross-compiled with mingw from the Fedora +# docker container. +## + +FROM debian:latest +ENV GOPATH /go +ENV GOPROXY direct +ENV PATH /opt/go/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/go/bin + +# Debian: Update all software and get dependencies. +RUN apt update && apt -y upgrade && apt -y dist-upgrade +RUN apt -y install git zip tar libsdl2-dev libsdl2-ttf-dev \ + libsdl2-mixer-dev gcc-mingw-w64-x86-64 gcc make wget \ + flatpak-builder ruby-dev gcc rpm libffi-dev + +# Create a user to build the packages. +RUN useradd builder -u 1000 -m -G users && \ + mkdir /go /git && chown -R builder:users /go /git + +# Download and install modern Go. +WORKDIR /root +RUN wget https://go.dev/dl/go1.19.1.linux-amd64.tar.gz -O go.tgz && \ + tar -xzvf go.tgz && \ + cp -r go /opt/go + +# Git clone all the repos. +RUN git clone https://git.kirsle.net/SketchyMaze/rtp /git/rtp +RUN git clone https://git.kirsle.net/SketchyMaze/vendor /git/vendor +RUN git clone https://git.kirsle.net/SketchyMaze/assets /git/assets +RUN git clone https://git.kirsle.net/SketchyMaze/doodle /go/src/git.kirsle.net/SketchyMaze/doodle +RUN git clone https://git.kirsle.net/SketchyMaze/doodads /go/src/git.kirsle.net/SketchyMaze/doodle/deps/doodads + +# MinGW setup for Windows executable cross-compile. +WORKDIR /git/vendor/mingw-libs +RUN for i in *.tar.gz; do tar -xzvf $i; done +RUN cp -rv SDL2-2.0.9/x86_64-w64-mingw32 /usr && \ + cp -rv SDL2_mixer-2.0.4/x86_64-w64-mingw32 /usr && \ + cp -rv SDL2_ttf-2.0.15/x86_64-w64-mingw32 /usr +RUN mkdir -p /usr/lib/golang/pkg/windows_amd64 && \ + chown -R builder:users /usr/lib/golang/pkg/windows_amd64 + +# Pre-download my Go render engine libraries +RUN git clone https://git.kirsle.net/go/ui /git/go/ui +RUN git clone https://git.kirsle.net/go/render /git/go/render +RUN git clone https://git.kirsle.net/go/audio /git/go/audio + +# Enter Doodle's directory, patch the go.mod and fetch the guidebook. +WORKDIR /go/src/git.kirsle.net/SketchyMaze/doodle +RUN echo "replace git.kirsle.net/go/ui => /git/go/ui" >> go.mod && \ + echo "replace git.kirsle.net/go/render => /git/go/render" >> go.mod && \ + echo "replace git.kirsle.net/go/audio => /git/go/audio" >> go.mod && \ + cat go.mod && \ + wget -O - https://download.sketchymaze.com/guidebook.tar.gz | tar -xzvf - + +# Install Go dependencies and such. +RUN make setup + +# Install the doodad tool into our $PATH. +RUN make install + +# Copy default vendored assets in. +RUN cp -r /git/vendor/fonts ./assets/fonts && \ + cp -r /git/assets/levelpacks/levelpacks ./assets/levelpacks && \ + mkdir rtp && cp -r /git/rtp/* rtp/ + +RUN ls -hal && pwd +RUN mkdir -p bin && cp /git/vendor/DLL/*.dll bin/ + +# Package rpm and deb for Linux. +# TODO: fpm doesn't like to install in Docker right now +RUN apt -y install ruby-dev ruby-rubygems rpm libffi-dev +RUN gem install fpm; exit 0 + +# Run the big mingw-release, which: +# - builds the doodads +# - embeds the bindata files +# - builds the program for Linux +# - builds for Windows via MinGW +# - runs `make dist/` creating an uber build for both OS's +# - runs release.sh to carve out the Linux and Windows versions and +# zip them all up nicely. +RUN make mingw-release + +CMD ["cp", "-r", "-v", \ + "/go/src/git.kirsle.net/SketchyMaze/doodle/dist/release/", \ + "/mnt/export/"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..23554de --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +SHELL := /bin/bash + +# NOTE: +# Fedora likes `podman` instead of `docker` but most other +# distros (Debian, Manjaro) `docker` is easier to use. +# ln -s /usr/bin/podman ~/bin/docker + +.PHONY: clean +clean: + rm -rf ./dist + podman system prune -a + podman system reset + +.PHONY: 64bit +64bit: + mkdir -p ./dist/64bit + echo pwd is $(shell pwd) + podman build -t doodle_64bit -f ./64bit.dockerfile . + podman run --rm --mount type=bind,src=$(shell pwd)/dist/64bit,dst=/mnt/export doodle_64bit + +.PHONY: 32bit +32bit: + mkdir -p ./dist/32bit + echo pwd is $(shell pwd) + podman build -t doodle_32bit -f ./32bit.dockerfile . + podman run --rm --mount type=bind,src=$(shell pwd)/dist/32bit,dst=/mnt/export doodle_32bit + +.PHONY: all +all: 64bit 32bit \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..db4d7b9 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Dockerfiles for Project: Doodle + +To ensure consistent builds of Project: Doodle, these Dockerfiles will +set up a clean Linux environment and run all the steps to gather assets from +all the git repos and build and release the app in a consistent way. + +It uses the `podman` command, which is compatible with `docker` but doesn't +require elevated privileges. From a fresh Fedora environment, `dnf install podman` +and the makefile ought to "just work" (provided all the git repositories are +up and the heads are not broken). Also reading the Dockerfile can give you +an idea of the end-to-end process of the build. + +Run `make setup` to add flathub (--if-not-exists) and download the dependency +layers. + +``` +make 64bit +``` + +Podman tip: `podman system reset` to nuke all of it, cached images and build +steps, for a fresh start when testing the dockerfiles. + +**Fedora tip:** run `setenforce permissive` to disable SELinux for the +bind mount, or podman/docker can't copy artifacts from the Docker +container up to the host.