Update Fedora package build

This commit is contained in:
Joshua Boniface 2019-02-05 18:41:02 -05:00
parent c846da4f9e
commit 88038d9644
4 changed files with 115 additions and 64 deletions

View File

@ -1,15 +1,36 @@
FROM fedora:29 FROM fedora:29
ARG HOME=/build # Docker build arguments
RUN mkdir /build && \ ARG SOURCE_DIR=/jellyfin
dnf install -y @buildsys-build rpmdevtools dnf-plugins-core && \ ARG PLATFORM_DIR=/jellyfin/deployment/fedora-package-x64
dnf copr enable -y @dotnet-sig/dotnet && \ ARG ARTIFACT_DIR=/dist
rpmdev-setuptree ARG SDK_VERSION=2.2
# Docker run environment
ENV SOURCE_DIR=/jellyfin
ENV ARTIFACT_DIR=/dist
WORKDIR /build/rpmbuild # Prepare Fedora build environment
COPY ./deployment/fedora-package-x64/pkg-src/jellyfin.spec SPECS RUN dnf update -y \
COPY ./deployment/fedora-package-x64/pkg-src/ SOURCES && dnf install -y @buildsys-build rpmdevtools dnf-plugins-core libcurl-devel fontconfig-devel freetype-devel openssl-devel glibc-devel libicu-devel \
&& dnf copr enable -y @dotnet-sig/dotnet \
&& rpmdev-setuptree \
&& dnf install -y dotnet-sdk-${SDK_VERSION}
RUN spectool -g -R SPECS/jellyfin.spec && \ # Link to docker-build script
rpmbuild -bs SPECS/jellyfin.spec && \ RUN ln -sf ${PLATFORM_DIR}/docker-build.sh /docker-build.sh
dnf build-dep -y SRPMS/jellyfin-*.src.rpm && \
rpmbuild -bb SPECS/jellyfin.spec; # 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
ENTRYPOINT ["/docker-build.sh"]

View File

@ -2,17 +2,33 @@
source ../common.build.sh source ../common.build.sh
VERSION=`get_version ../..` keep_artifacts="${1}"
package_temporary_dir="`pwd`/pkg-dist-tmp" WORKDIR="$( pwd )"
pkg_src_dir="`pwd`/pkg-src" VERSION="$( grep -A1 '^Version:' ${WORKDIR}/pkg-src/jellyfin.spec | awk '{ print $NF }' )"
image_name="jellyfin-rpmbuild"
docker_sudo="" package_temporary_dir="${WORKDIR}/pkg-dist-tmp"
if ! $(id -Gn | grep -q 'docker') && [ ! ${EUID:-1000} -eq 0 ] && \ package_source_dir="${WORKDIR}/pkg-src"
[ ! $USER == "root" ] && ! $(echo "$OSTYPE" | grep -q "darwin"); then output_dir="${WORKDIR}/pkg-dist"
current_user="$( whoami )"
image_name="jellyfin-rpm-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 docker_sudo=sudo
fi
${docker_sudo} docker image rm ${image_name} --force
fi fi
$docker_sudo docker image rm $image_name --force
rm -rf "$package_temporary_dir"
rm -rf "$pkg_src_dir/jellyfin-${VERSION}.tar.gz"

View File

@ -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/

View File

@ -2,37 +2,28 @@
source ../common.build.sh source ../common.build.sh
VERSION=`get_version ../..` WORKDIR="$( pwd )"
VERSION="$( grep '^Version:' ${WORKDIR}/pkg-src/jellyfin.spec | awk '{ print $NF }' )"
# TODO get the version in the package automatically. And using the changelog to decide the debian package suffix version. package_temporary_dir="${WORKDIR}/pkg-dist-tmp"
output_dir="${WORKDIR}/pkg-dist"
pkg_src_dir="${WORKDIR}/pkg-src"
current_user="$( whoami )"
image_name="jellyfin-rpm-build"
# Build a Jellyfin .rpm file with Docker on Linux # Determine if sudo should be used for Docker
# Places the output .rpm file in the parent directory if [[ ! -z $(id -Gn | grep -q 'docker') ]] \
&& [[ ! ${EUID:-1000} -eq 0 ]] \
set -o errexit && [[ ! ${USER} == "root" ]] \
set -o xtrace && [[ ! -z $( echo "${OSTYPE}" | grep -q "darwin" ) ]]; then
set -o nounset docker_sudo="sudo"
else
package_temporary_dir="`pwd`/pkg-dist-tmp" docker_sudo=""
output_dir="`pwd`/pkg-dist"
pkg_src_dir="`pwd`/pkg-src"
current_user="`whoami`"
image_name="jellyfin-rpmbuild"
docker_sudo=""
if ! $(id -Gn | grep -q 'docker') && [ ! ${EUID:-1000} -eq 0 ] && \
[ ! $USER == "root" ] && ! $(echo "$OSTYPE" | grep -q "darwin"); then
docker_sudo=sudo
fi fi
cleanup() { # Create RPM source archive
set +o errexit
$docker_sudo docker image rm $image_name --force
rm -rf "$package_temporary_dir"
rm -rf "$pkg_src_dir/jellyfin-${VERSION}.tar.gz"
}
trap cleanup EXIT INT
GNU_TAR=1 GNU_TAR=1
mkdir -p "$package_temporary_dir" mkdir -p "${package_temporary_dir}"
echo "Bundling all sources for RPM build." echo "Bundling all sources for RPM build."
tar \ tar \
--transform "s,^\.,jellyfin-${VERSION}," \ --transform "s,^\.,jellyfin-${VERSION}," \
@ -47,12 +38,12 @@ tar \
--exclude='**/.nuget' \ --exclude='**/.nuget' \
--exclude='*.deb' \ --exclude='*.deb' \
--exclude='*.rpm' \ --exclude='*.rpm' \
-zcf "$pkg_src_dir/jellyfin-${VERSION}.tar.gz" \ -czf "${pkg_src_dir}/jellyfin-${VERSION}.tar.gz" \
-C "../.." ./ || GNU_TAR=0 -C "../.." ./ || GNU_TAR=0
if [ $GNU_TAR -eq 0 ]; then if [ $GNU_TAR -eq 0 ]; then
echo "The installed tar binary did not support --transform. Using workaround." echo "The installed tar binary did not support --transform. Using workaround."
mkdir -p "$package_temporary_dir/jellyfin-${VERSION}" mkdir -p "${package_temporary_dir}/jellyfin"
# Not GNU tar # Not GNU tar
tar \ tar \
--exclude='.git*' \ --exclude='.git*' \
@ -67,20 +58,23 @@ if [ $GNU_TAR -eq 0 ]; then
--exclude='*.deb' \ --exclude='*.deb' \
--exclude='*.rpm' \ --exclude='*.rpm' \
-zcf \ -zcf \
"$package_temporary_dir/jellyfin-${VERSION}/jellyfin.tar.gz" \ "${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz" \
-C "../.." \ -C "../.." ./
./
echo "Extracting filtered package." echo "Extracting filtered package."
tar -xzf "$package_temporary_dir/jellyfin-${VERSION}/jellyfin.tar.gz" -C "$package_temporary_dir/jellyfin-${VERSION}" tar -xzf "${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz" -C "${package_temporary_dir}/jellyfin-${VERSION}"
echo "Removing filtered package." echo "Removing filtered package."
rm "$package_temporary_dir/jellyfin-${VERSION}/jellyfin.tar.gz" rm -f "${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz"
echo "Repackaging package into final tarball." echo "Repackaging package into final tarball."
tar -zcf "$pkg_src_dir/jellyfin-${VERSION}.tar.gz" -C "$package_temporary_dir" "jellyfin-${VERSION}" tar -czf "${pkg_src_dir}/jellyfin-${VERSION}.tar.gz" -C "${package_temporary_dir}" "jellyfin-${VERSION}"
fi fi
$docker_sudo docker build ../.. -t "$image_name" -f ./Dockerfile # Set up the build environment Docker image
mkdir -p "$output_dir" ${docker_sudo} docker build ../.. -t "${image_name}" -f ./Dockerfile
$docker_sudo docker run --rm -v "$package_temporary_dir:/temp" "$image_name" sh -c 'find /build/rpmbuild -maxdepth 3 -type f -name "jellyfin*.rpm" -exec mv {} /temp \;' # Build the RPMs and copy out to ${package_temporary_dir}
chown -R "$current_user" "$package_temporary_dir" \ ${docker_sudo} docker run --rm -v "${package_temporary_dir}:/dist" "${image_name}"
|| sudo chown -R "$current_user" "$package_temporary_dir" # Correct ownership on the RPMs (as current user, then as root if that fails)
mv "$package_temporary_dir"/*.rpm "$output_dir" 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}"