From 524a74eb3fbce57930588c4cde52e513307a060f Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Mon, 10 Jun 2024 00:31:55 +0200 Subject: [PATCH] Initial commit --- .github/workflows/build.yaml | 34 +++++++++++++++++++++++ Dockerfile | 45 +++++++++++++++++++++++++++++++ entrypoint-linux.sh | 52 ++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 .github/workflows/build.yaml create mode 100644 Dockerfile create mode 100644 entrypoint-linux.sh diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..8b0f184 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,34 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main # Change this to your main branch name or remove this line if you want to trigger on all branches + +env: + IMAGE_NAME: ${{ github.actor }}/pyinstaller-wxpython-linux + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + push: true + tags: ${{ env.IMAGE_NAME }}:latest + cache-from: type=gha + cache-to: type=gha,mode=max \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..76f1e2f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# Use a Python base image based on Debian +FROM python:3.12-slim-bookworm +SHELL ["/bin/bash", "-i", "-c"] + +ARG PYINSTALLER_VERSION=6.8.0 + +ENV PYPI_URL=https://pypi.python.org/ +ENV PYPI_INDEX_URL=https://pypi.python.org/simple + +# Set environment variables to non-interactive mode +ENV DEBIAN_FRONTEND=noninteractive + +# Update the package list and install dependencies +RUN apt-get update && \ + apt-get install -y \ + build-essential \ + libgtk-3-dev \ + libgl1-mesa-glx \ + libglu1-mesa \ + libjpeg-dev \ + libtiff-dev \ + libpng-dev \ + libwebkit2gtk-4.0-dev \ + libnotify-dev \ + freeglut3-dev \ + libsdl1.2-dev \ + libgstreamer-plugins-base1.0-dev \ + libgstreamer1.0-dev \ + binutils gcc zlib1g-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY entrypoint-linux.sh /entrypoint.sh + +# Install wxPython using pip +RUN pip3 install wxPython \ + && pip3 install pyinstaller==$PYINSTALLER_VERSION \ + && pip3 cache purge \ + && chmod +x /entrypoint.sh + + +VOLUME /src/ +WORKDIR /src/ + +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/entrypoint-linux.sh b/entrypoint-linux.sh new file mode 100644 index 0000000..39bdaa7 --- /dev/null +++ b/entrypoint-linux.sh @@ -0,0 +1,52 @@ +#!/bin/bash -i + +# Add path +# echo 'export PATH=$PATH:$HOME/.pyenv/versions/$(ls $HOME/.pyenv/versions/)/bin/' >> ~/.bashrc + +# Fail on errors. +set -e + +# Make sure .bashrc is sourced +. /root/.bashrc + +# Allow the workdir to be set using an env var. +# Useful for CI pipiles which use docker for their build steps +# and don't allow that much flexibility to mount volumes +WORKDIR=${SRCDIR:-/src} +# Allow the user to specify the spec file +# Sometimes there are 2 executables to be built from one +# folder, this allows the user to specify which one +# should we build. +# In case it's not defind, find the first match for `*.spec` +SPECFILE=${SPECFILE:-$(find . -maxdepth 1 -type f -name '*.spec' -print -quit)} +# In case the user specified a custom URL for PYPI, then use +# that one, instead of the default one. + +if [[ "$PYPI_URL" != "https://pypi.python.org/" ]] || \ + [[ "$PYPI_INDEX_URL" != "https://pypi.python.org/simple" ]]; then + # the funky looking regexp just extracts the hostname, excluding port + # to be used as a trusted-host. + mkdir -p /root/.pip + echo "[global]" > /root/.pip/pip.conf + echo "index = $PYPI_URL" >> /root/.pip/pip.conf + echo "index-url = $PYPI_INDEX_URL" >> /root/.pip/pip.conf + echo "trusted-host = $(echo $PYPI_URL | perl -pe 's|^.*?://(.*?)(:.*?)?/.*$|$1|')" >> /root/.pip/pip.conf + + echo "Using custom pip.conf: " + cat /root/.pip/pip.conf +fi + +cd $WORKDIR + +if [ -f requirements.txt ]; then + pip3 install -r requirements.txt +fi # [ -f requirements.txt ] + +echo "$@" + +if [[ "$@" == "" ]]; then + pyinstaller --clean -y --dist ./dist --workpath /tmp $SPECFILE + chown -R --reference=. ./dist +else + sh -c "$@" +fi # [[ "$@" == "" ]]