2
0
Эх сурвалжийг харах

Update Fedora package build

Joshua Boniface 6 жил өмнө
parent
commit
88038d9644

+ 35 - 14
deployment/fedora-package-x64/Dockerfile

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

+ 29 - 13
deployment/fedora-package-x64/clean.sh

@@ -2,17 +2,33 @@
 
 source ../common.build.sh
 
-VERSION=`get_version ../..`
-
-package_temporary_dir="`pwd`/pkg-dist-tmp"
-pkg_src_dir="`pwd`/pkg-src"
-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
+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-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
 
-$docker_sudo docker image rm $image_name --force
-rm -rf "$package_temporary_dir"
-rm -rf "$pkg_src_dir/jellyfin-${VERSION}.tar.gz"
+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

+ 20 - 0
deployment/fedora-package-x64/docker-build.sh

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

+ 34 - 40
deployment/fedora-package-x64/package.sh

@@ -2,37 +2,28 @@
 
 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
-# Places the output .rpm file in the parent directory
-
-set -o errexit
-set -o xtrace
-set -o nounset
-
-package_temporary_dir="`pwd`/pkg-dist-tmp"
-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
+# 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
 
-cleanup() {
-    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
+# Create RPM source archive
 GNU_TAR=1
-mkdir -p "$package_temporary_dir"
+mkdir -p "${package_temporary_dir}"
 echo "Bundling all sources for RPM build."
 tar \
 --transform "s,^\.,jellyfin-${VERSION}," \
@@ -47,12 +38,12 @@ tar \
 --exclude='**/.nuget' \
 --exclude='*.deb' \
 --exclude='*.rpm' \
--zcf "$pkg_src_dir/jellyfin-${VERSION}.tar.gz" \
+-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-${VERSION}"
+    mkdir -p "${package_temporary_dir}/jellyfin"
     # Not GNU tar
     tar \
     --exclude='.git*' \
@@ -67,20 +58,23 @@ if [ $GNU_TAR -eq 0 ]; then
     --exclude='*.deb' \
     --exclude='*.rpm' \
     -zcf \
-    "$package_temporary_dir/jellyfin-${VERSION}/jellyfin.tar.gz" \
-    -C "../.." \
-    ./
+    "${package_temporary_dir}/jellyfin/jellyfin-${VERSION}.tar.gz" \
+    -C "../.." ./
     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."
-    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."
-    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
 
-$docker_sudo docker build ../.. -t "$image_name" -f ./Dockerfile
-mkdir -p "$output_dir"
-$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 \;'
-chown -R "$current_user" "$package_temporary_dir" \
-|| sudo chown -R "$current_user" "$package_temporary_dir"
-mv "$package_temporary_dir"/*.rpm "$output_dir"
+# 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}"