From 6144590fffb3d29f322dd06e85ebad6e2d7ab67c Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sun, 11 Feb 2024 14:21:47 -0500 Subject: Add portable builds --- build.py | 24 ++++++++++++++++++++--- portable/Dockerfile | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ portable/build.sh | 46 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 portable/Dockerfile create mode 100755 portable/build.sh diff --git a/build.py b/build.py index 78e67cb..74119a0 100755 --- a/build.py +++ b/build.py @@ -71,14 +71,29 @@ def build_package_deb(jvers, btype, barch, bvers): # Build the dockerfile and packages os.system(f"docker build --progress=plain --build-arg PTYPE={ostype} --build-arg PVERSION={osversion} --build-arg PARCH={PARCH} --build-arg GCC_VERSION={crossgccvers} --file {repo_root_dir}/{dockerfile} --tag {imagename} {repo_root_dir}") - os.system(f"docker run --volume {repo_root_dir}:/jellyfin --volume {repo_root_dir}/out:/dist --name {imagename} {imagename}") + os.system(f"docker run --rm --volume {repo_root_dir}:/jellyfin --volume {repo_root_dir}/out/{btype}:/dist --name {imagename} {imagename}") def build_package(jvers, btype, barch, bvers): pass -def build_docker(jvers, btype, barch, bvers): +def build_portable(jvers, btype, _barch, _bvers): + # Set the dockerfile + dockerfile = configurations[btype]["dockerfile"] + + # Use a unique docker image name for consistency + imagename = f"{configurations[btype]['imagename']}-{jvers}_{btype}" + + # Set the archive type (tar-gz or zip) + archivetypes = f"{configurations[btype]['archivetypes']}" + + # Build the dockerfile and packages + os.system(f"docker build --progress=plain --file {repo_root_dir}/{dockerfile} --tag {imagename} {repo_root_dir}") + os.system(f"docker run --rm --volume {repo_root_dir}:/jellyfin --volume {repo_root_dir}/out/{btype}:/dist --env JVERS={jvers} --env ARCHIVE_TYPES={archivetypes} --name {imagename} {imagename}") + + +def build_docker(jvers, btype, _barch, _bvers): print("> Building Docker images...") print() @@ -201,7 +216,10 @@ configurations = { "def": build_package, }, "portable": { - "def": build_package, + "def": build_portable, + "dockerfile": "portable/Dockerfile", + "imagename": "jellyfin-builder", + "archivetypes": "tar,zip", }, "docker": { "def": build_docker, diff --git a/portable/Dockerfile b/portable/Dockerfile new file mode 100644 index 0000000..3f86299 --- /dev/null +++ b/portable/Dockerfile @@ -0,0 +1,56 @@ +# Docker build arguments +ARG DOTNET_VERSION=8.0 +ARG NODEJS_VERSION=20 + +ARG PTYPE=debian +ARG PVERSION=12 + +FROM ${PTYPE}:${PVERSION} + +ARG SOURCE_DIR=/jellyfin +ARG ARTIFACT_DIR=/dist +ARG DOTNET_VERSION +ARG NODEJS_VERSION +ARG PTYPE +ARG PVERSION + +# Docker run environment +ENV SOURCE_DIR=/jellyfin +ENV ARTIFACT_DIR=/dist +ENV TYPE=${PTYPE} +ENV VERSION=${PVERSION} +ENV ARCHIVE_TYPES=tar + +# Prepare Debian build environment +RUN apt-get update -y \ + && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC \ + apt-get install --no-install-recommends -y \ + wget debhelper gnupg devscripts build-essential mmv lsb-release zip \ + libssl*.* liblttng-ust* \ + libfontconfig*-dev libcurl*openssl-dev libfreetype*-dev libssl-dev \ + && apt-get clean autoclean -y \ + && apt-get autoremove -y \ + && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* + +# Prepare dotnet SDK +RUN wget https://packages.microsoft.com/config/${PTYPE}/${PVERSION}/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ + && dpkg -i packages-microsoft-prod.deb \ + && apt-get -f install \ + && apt-get update \ + && apt-get install -y dotnet-sdk-${DOTNET_VERSION} + +# Prepare nodejs +RUN wget https://deb.nodesource.com/setup_${NODEJS_VERSION}.x -O nodejs-install.sh \ + && chmod +x ./nodejs-install.sh \ + && ./nodejs-install.sh \ + && apt-get install -y \ + nodejs + +# Link to build script +RUN ln -sf ${SOURCE_DIR}/portable/build.sh /build.sh + +VOLUME ${SOURCE_DIR}/ + +VOLUME ${ARTIFACT_DIR}/ + +ENTRYPOINT ["/build.sh"] diff --git a/portable/build.sh b/portable/build.sh new file mode 100755 index 0000000..f8a3295 --- /dev/null +++ b/portable/build.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +#= Debian .deb builder + +set -o errexit +set -o xtrace + +# Create the intermediate build dir +BUILD_DIR="/build" +mkdir -p ${BUILD_DIR} + +# Move to source directory +pushd "${SOURCE_DIR}" + +# Build server +pushd jellyfin-server +dotnet publish Jellyfin.Server --configuration Release --output ${BUILD_DIR}/ -p:DebugSymbols=false -p:DebugType=none -p:UseAppHost=false +popd + +# Build web +pushd jellyfin-web +npm ci --no-audit --unsafe-perm +npm run build:production +mv dist ${BUILD_DIR}/jellyfin-web +popd + +mkdir -p "${ARTIFACT_DIR}/" + +pushd ${BUILD_DIR} +for ARCHIVE_TYPE in $( tr ',' '\n' <<<"${ARCHIVE_TYPES}" ); do + case ${ARCHIVE_TYPE} in + tar) + tar -czf "${ARTIFACT_DIR}"/jellyfin_${JVERS}.tar.gz . + ;; + zip) + zip -qr "${ARTIFACT_DIR}"/jellyfin_${JVERS}.zip . + ;; + esac +done +popd + +# Clean up any lingering artifacts +make -f debian/rules clean +rm -rf ${BUILD_DIR} + +popd -- cgit