[go: up one dir, main page]

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved Docker pkgbuild #824

Merged
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions build
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ usage() {
echo -e "Usage:"
echo -e " $ build --list-platforms"
echo -e " $ build --list-actions <platform>"
echo -e " $ build [-b/--web-branch <web_branch>] <platform> <action>"
echo -e " $ build [-k/--keep-artifacts] [-b/--web-branch <web_branch>] <platform> <action>"
echo -e ""
echo -e "The 'keep-artifacts' option preserves build artifacts, e.g. Docker images for system package builds."
echo -e "The web_branch defaults to the same branch name as the current main branch."
echo -e "To build all platforms, use 'all'."
echo -e "To perform all build actions, use 'all'."
Expand Down Expand Up @@ -67,6 +68,14 @@ if [[ $1 == '--list-actions' ]]; then
exit 0
fi

# Parse keep-artifacts option
if [[ $1 == '-k' || $1 == '--keep-artifacts' ]]; then
keep_artifacts="y"
shift 1
else
keep_artifacts="n"
fi

# Parse branch option
if [[ $1 == '-b' || $1 == '--web-branch' ]]; then
web_branch="$2"
Expand Down Expand Up @@ -193,6 +202,13 @@ for target_platform in ${platform[@]}; do
echo -e "> Processing platform ${target_platform}"
date_start=$( date +%s )
pushd ${target_platform}
cleanup() {
echo -e ">> Processing action clean"
if [[ -f clean.sh && -x clean.sh ]]; then
./clean.sh ${keep_artifacts}
fi
}
trap cleanup EXIT INT
for target_action in ${action[@]}; do
echo -e ">> Processing action ${target_action}"
if [[ -f ${target_action}.sh && -x ${target_action}.sh ]]; then
Expand All @@ -204,12 +220,8 @@ for target_platform in ${platform[@]}; do
target_dir="../../../jellyfin-build/${target_platform}"
mkdir -p ${target_dir}
mv pkg-dist/* ${target_dir}/

echo -e ">> Processing action clean"
if [[ -f clean.sh && -x clean.sh ]]; then
./clean.sh
fi
fi
cleanup
date_end=$( date +%s )
echo -e "> Completed platform ${target_platform} in $( expr ${date_end} - ${date_start} ) seconds."
popd
Expand Down
2 changes: 2 additions & 0 deletions deployment/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ These builds are not necessarily run from the `build` script, but are present fo

* The `clean` action should always `exit 0` even if no work is done or it fails.

* The `clean` action can be passed a variable as argument 1, named `keep_artifacts`, containing either the value `y` or `n`. It is indended to handle situations when the user runs `build --keep-artifacts` and should be handled intelligently. Usually, this is used to preserve Docker images while still removing temporary directories.

### Output Files

* Upon completion of the defined actions, at least one output file must be created in the `<platform>/pkg-dist` directory.
Expand Down
49 changes: 35 additions & 14 deletions deployment/centos-package-x64/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,36 @@
FROM centos:7
ARG HOME=/build
RUN mkdir /build && \
yum install -y @buildsys-build rpmdevtools yum-plugins-core && \
rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm && \
rpmdev-setuptree

WORKDIR /build/rpmbuild
COPY ./deployment/centos-package-x64/pkg-src/jellyfin.spec SPECS
COPY ./deployment/centos-package-x64/pkg-src/ SOURCES

RUN spectool -g -R SPECS/jellyfin.spec && \
rpmbuild -bs SPECS/jellyfin.spec && \
yum-builddep -y SRPMS/jellyfin-*.src.rpm && \
rpmbuild -bb SPECS/jellyfin.spec;
# Docker build arguments
ARG SOURCE_DIR=/jellyfin
ARG PLATFORM_DIR=/jellyfin/deployment/centos-package-x64
ARG ARTIFACT_DIR=/dist
ARG SDK_VERSION=2.2
joshuaboniface marked this conversation as resolved.
Show resolved Hide resolved
# Docker run environment
ENV SOURCE_DIR=/jellyfin
ENV ARTIFACT_DIR=/dist

# Prepare CentOS build environment
RUN yum update -y \
&& yum install -y @buildsys-build rpmdevtools yum-plugins-core libcurl-devel fontconfig-devel freetype-devel openssl-devel glibc-devel libicu-devel \
&& rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm \
&& rpmdev-setuptree \
&& yum install -y dotnet-sdk-${SDK_VERSION}

# Link to docker-build script
RUN ln -sf ${PLATFORM_DIR}/docker-build.sh /docker-build.sh
joshuaboniface marked this conversation as resolved.
Show resolved Hide resolved

# Link to RPM spec; mkdir needed or it fails, can't force dest
RUN mkdir -p ${SOURCE_DIR}/SPECS \
&& ln -s ${PLATFORM_DIR}/pkg-src/jellyfin.spec ${SOURCE_DIR}/SPECS/jellyfin.spec

# Link to RPM sources; mkdir needed or it fails, can't force dest
RUN mkdir -p ${SOURCE_DIR}/SOURCES \
&& ln -s ${PLATFORM_DIR}/pkg-src ${SOURCE_DIR}/SOURCES

# Prepare artifact volume
VOLUME ${ARTIFACT_DIR}/

# Copy repository
COPY . ${SOURCE_DIR}/

# Set docker-build entrypoint
joshuaboniface marked this conversation as resolved.
Show resolved Hide resolved
ENTRYPOINT ["/docker-build.sh"]
joshuaboniface marked this conversation as resolved.
Show resolved Hide resolved
1 change: 0 additions & 1 deletion deployment/centos-package-x64/clean.sh

This file was deleted.

34 changes: 34 additions & 0 deletions deployment/centos-package-x64/clean.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env bash

source ../common.build.sh

keep_artifacts="${1}"

WORKDIR="$( pwd )"
VERSION="$( grep -A1 '^Version:' ${WORKDIR}/pkg-src/jellyfin.spec | awk '{ print $NF }' )"

package_temporary_dir="${WORKDIR}/pkg-dist-tmp"
package_source_dir="${WORKDIR}/pkg-src"
output_dir="${WORKDIR}/pkg-dist"
current_user="$( whoami )"
image_name="jellyfin-centos-build"

rm -f "${package_source_dir}/jellyfin-${VERSION}.tar.gz" &>/dev/null \
|| sudo rm -f "${package_source_dir}/jellyfin-${VERSION}.tar.gz" &>/dev/null

rm -rf "${package_temporary_dir}" &>/dev/null \
|| sudo rm -rf "${package_temporary_dir}" &>/dev/null

rm -rf "${output_dir}" &>/dev/null \
|| sudo rm -rf "${output_dir}" &>/dev/null

if [[ ${keep_artifacts} == 'n' ]]; then
docker_sudo=""
if [[ ! -z $(id -Gn | grep -q 'docker') ]] \
&& [[ ! ${EUID:-1000} -eq 0 ]] \
&& [[ ! ${USER} == "root" ]] \
&& [[ ! -z $( echo "${OSTYPE}" | grep -q "darwin" ) ]]; then
docker_sudo=sudo
fi
${docker_sudo} docker image rm ${image_name} --force
fi
1 change: 1 addition & 0 deletions deployment/centos-package-x64/dependencies.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
docker
20 changes: 20 additions & 0 deletions deployment/centos-package-x64/docker-build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/bin/bash

# Builds the RPM inside the Docker container

set -o errexit
set -o xtrace

# Move to source directory
pushd ${SOURCE_DIR}

ls -al SOURCES/pkg-src/

# Build RPM
spectool -g -R SPECS/jellyfin.spec
rpmbuild -bs SPECS/jellyfin.spec --define "_sourcedir ${SOURCE_DIR}/SOURCES/pkg-src/"
rpmbuild -bb SPECS/jellyfin.spec --define "_sourcedir ${SOURCE_DIR}/SOURCES/pkg-src/"

# Move the artifacts out
mkdir -p ${ARTIFACT_DIR}/rpm
mv /root/rpmbuild/RPMS/x86_64/jellyfin-*.rpm /root/rpmbuild/SRPMS/jellyfin-*.src.rpm ${ARTIFACT_DIR}/rpm/
1 change: 0 additions & 1 deletion deployment/centos-package-x64/package.sh

This file was deleted.

80 changes: 80 additions & 0 deletions deployment/centos-package-x64/package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env bash

source ../common.build.sh

WORKDIR="$( pwd )"
VERSION="$( grep '^Version:' ${WORKDIR}/pkg-src/jellyfin.spec | awk '{ print $NF }' )"

package_temporary_dir="${WORKDIR}/pkg-dist-tmp"
output_dir="${WORKDIR}/pkg-dist"
pkg_src_dir="${WORKDIR}/pkg-src"
current_user="$( whoami )"
image_name="jellyfin-centos-build"

# Determine if sudo should be used for Docker
if [[ ! -z $(id -Gn | grep -q 'docker') ]] \
&& [[ ! ${EUID:-1000} -eq 0 ]] \
&& [[ ! ${USER} == "root" ]] \
&& [[ ! -z $( echo "${OSTYPE}" | grep -q "darwin" ) ]]; then
docker_sudo="sudo"
else
docker_sudo=""
fi

# Create RPM source archive
GNU_TAR=1
mkdir -p "${package_temporary_dir}"
echo "Bundling all sources for RPM build."
tar \
--transform "s,^\.,jellyfin-${VERSION}," \
--exclude='.git*' \
--exclude='**/.git' \
--exclude='**/.hg' \
--exclude='**/.vs' \
--exclude='**/.vscode' \
--exclude='deployment' \
--exclude='**/bin' \
--exclude='**/obj' \
--exclude='**/.nuget' \
--exclude='*.deb' \
--exclude='*.rpm' \
-czf "${pkg_src_dir}/jellyfin-${VERSION}.tar.gz" \
-C "../.." ./ || GNU_TAR=0

if [ $GNU_TAR -eq 0 ]; then
echo "The installed tar binary did not support --transform. Using workaround."
mkdir -p "${package_temporary_dir}/jellyfin"
# Not GNU tar
tar \
--exclude='.git*' \
--exclude='**/.git' \
--exclude='**/.hg' \
--exclude='**/.vs' \
--exclude='**/.vscode' \
--exclude='deployment' \
--exclude='**/bin' \
--exclude='**/obj' \
--exclude='**/.nuget' \
--exclude='*.deb' \
--exclude='*.rpm' \
-zcf \
"${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz" \
-C "../.." ./
echo "Extracting filtered package."
tar -xzf "${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz" -C "${package_temporary_dir}/jellyfin-${VERSION}"
echo "Removing filtered package."
rm -f "${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz"
echo "Repackaging package into final tarball."
tar -czf "${pkg_src_dir}/jellyfin-${VERSION}.tar.gz" -C "${package_temporary_dir}" "jellyfin-${VERSION}"
fi

# Set up the build environment Docker image
${docker_sudo} docker build ../.. -t "${image_name}" -f ./Dockerfile
# Build the RPMs and copy out to ${package_temporary_dir}
${docker_sudo} docker run --rm -v "${package_temporary_dir}:/dist" "${image_name}"
# Correct ownership on the RPMs (as current user, then as root if that fails)
chown -R "${current_user}" "${package_temporary_dir}" \
|| sudo chown -R "${current_user}" "${package_temporary_dir}"
# Move the RPMs to the output directory
mkdir -p "${output_dir}"
mv "${package_temporary_dir}"/rpm/* "${output_dir}"
39 changes: 28 additions & 11 deletions deployment/debian-package-x64/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,23 +1,40 @@
FROM debian:9
joshuaboniface marked this conversation as resolved.
Show resolved Hide resolved
ARG SOURCEDIR=/repo
# Docker build arguments
ARG SOURCE_DIR=/jellyfin
ARG PLATFORM_DIR=/jellyfin/deployment/debian-package-x64
ARG ARTIFACT_DIR=/dist
ARG SDK_VERSION=2.2
# Docker run environment
ENV SOURCE_DIR=/jellyfin
ENV ARTIFACT_DIR=/dist
ENV DEB_BUILD_OPTIONS=noddebs

# https://dotnet.microsoft.com/download/linux-package-manager/debian9/sdk-current
# Prepare Debian build environment
RUN apt-get update \
&& apt-get install -y apt-transport-https debhelper gnupg wget devscripts \
&& wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg \
&& apt-get install -y apt-transport-https debhelper gnupg wget devscripts mmv libc6-dev libcurl4-openssl-dev libfontconfig1-dev libfreetype6-dev

# Install dotnet repository
# https://dotnet.microsoft.com/download/linux-package-manager/debian9/sdk-current
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg \
&& mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/ \
&& wget -q https://packages.microsoft.com/config/debian/9/prod.list \
&& mv prod.list /etc/apt/sources.list.d/microsoft-prod.list \
&& chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg \
&& chown root:root /etc/apt/sources.list.d/microsoft-prod.list \
&& apt-get update
&& apt-get update \
&& apt-get install -y dotnet-sdk-${SDK_VERSION}

# Link to docker-build script
RUN ln -sf ${PLATFORM_DIR}/docker-build.sh /docker-build.sh

# Link to Debian source dir; mkdir needed or it fails, can't force dest
RUN mkdir -p ${SOURCE_DIR} && ln -sf ${PLATFORM_DIR}/pkg-src ${SOURCE_DIR}/debian

WORKDIR ${SOURCEDIR}
COPY . .
COPY ./deployment/debian-package-x64/pkg-src ./debian
# Prepare artifact volume
VOLUME ${ARTIFACT_DIR}/

RUN yes | mk-build-deps -i debian/control \
&& dpkg-buildpackage -us -uc
# Copy repository
COPY . ${SOURCE_DIR}/

WORKDIR /
# Set docker-build entrypoint
ENTRYPOINT ["/docker-build.sh"]
26 changes: 24 additions & 2 deletions deployment/debian-package-x64/clean.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

source ../common.build.sh

VERSION=`get_version ../..`
keep_artifacts="${1}"

clean_jellyfin ../.. Release `pwd`/dist/jellyfin_${VERSION}
WORKDIR="$( pwd )"

package_temporary_dir="${WORKDIR}/pkg-dist-tmp"
output_dir="${WORKDIR}/pkg-dist"
current_user="$( whoami )"
image_name="jellyfin-debian-build"

rm -rf "${package_temporary_dir}" &>/dev/null \
|| sudo rm -rf "${package_temporary_dir}" &>/dev/null

rm -rf "${output_dir}" &>/dev/null \
|| sudo rm -rf "${output_dir}" &>/dev/null

if [[ ${keep_artifacts} == 'n' ]]; then
docker_sudo=""
if [[ ! -z $(id -Gn | grep -q 'docker') ]] \
&& [[ ! ${EUID:-1000} -eq 0 ]] \
&& [[ ! ${USER} == "root" ]] \
&& [[ ! -z $( echo "${OSTYPE}" | grep -q "darwin" ) ]]; then
docker_sudo=sudo
fi
${docker_sudo} docker image rm ${image_name} --force
fi
16 changes: 16 additions & 0 deletions deployment/debian-package-x64/docker-build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/bash

# Builds the DEB inside the Docker container

set -o errexit
set -o xtrace

# Move to source directory
pushd ${SOURCE_DIR}

# Build DEB
dpkg-buildpackage -us -uc

# Move the artifacts out
mkdir -p ${ARTIFACT_DIR}/deb
mv /jellyfin_* ${ARTIFACT_DIR}/deb/
Loading