From 2500dd1dc47c311179fa98eadbf6d580dbc5efc8 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Sun, 31 Jan 2021 18:47:12 +0200 Subject: [PATCH] Merge 'dist/offline_installer/redhat: fix umask error' from Takuya ASADA Since makeself script changes current umask, scylla_setup causes "scylla does not work with current umask setting (0077)" error. To fix that we need use latest version of makeself, and specfiy --keep-umask option. Fixes #6243 Closes #6244 * github.com:scylladb/scylla: dist/offline_redhat: fix umask error dist/offline_installer/redhat: support cross build (cherry picked from commit bb202db1ff7c0a3889ec9a7e9c971cbeee7f18e7) --- .../redhat/build_offline_installer.sh | 97 ++++++++++++------- .../redhat/lib/Dockerfile.in | 5 + .../redhat/lib/construct_offline_repo.sh | 9 ++ dist/offline_installer/redhat/lib/epel8.repo | 7 ++ .../offline_installer/redhat/{ => lib}/header | 0 .../redhat/lib/install_deps.sh | 12 +++ 6 files changed, 93 insertions(+), 37 deletions(-) create mode 100644 dist/offline_installer/redhat/lib/Dockerfile.in create mode 100755 dist/offline_installer/redhat/lib/construct_offline_repo.sh create mode 100644 dist/offline_installer/redhat/lib/epel8.repo rename dist/offline_installer/redhat/{ => lib}/header (100%) create mode 100755 dist/offline_installer/redhat/lib/install_deps.sh diff --git a/dist/offline_installer/redhat/build_offline_installer.sh b/dist/offline_installer/redhat/build_offline_installer.sh index 0b521424f7..3dceacf9e9 100755 --- a/dist/offline_installer/redhat/build_offline_installer.sh +++ b/dist/offline_installer/redhat/build_offline_installer.sh @@ -26,26 +26,31 @@ fi print_usage() { echo "build_offline_installer.sh --repo [URL]" echo " --repo repository for fetching scylla rpm, specify .repo file URL" - echo " --releasever use specific minor version of the distribution repo (ex: 7.4)" + echo " --image [IMAGE] Use the specified docker IMAGE" + echo " --no-docker Build offline installer without using docker" exit 1 } -is_rhel7_variant() { - [ "$ID" = "rhel" -o "$ID" = "ol" -o "$ID" = "centos" ] && [[ "$VERSION_ID" =~ ^7 ]] -} +here="$(realpath $(dirname "$0"))" +releasever=`rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)"| uniq | cut -d ' ' -f 3` REPO= -RELEASEVER= +IMAGE=docker.io/centos:7 +NO_DOCKER=false while [ $# -gt 0 ]; do case "$1" in "--repo") REPO=$2 shift 2 ;; - "--releasever") - RELEASEVER=$2 + "--image") + IMAGE=$2 shift 2 ;; + "--no-docker") + NO_DOCKER=true + shift 1 + ;; *) print_usage ;; @@ -59,25 +64,17 @@ if [ -z $REPO ]; then exit 1 fi -if ! is_rhel7_variant; then - echo "Unsupported distribution" - exit 1 -fi - -if [ "$ID" = "centos" ]; then - if [ ! -f /etc/yum.repos.d/epel.repo ]; then - sudo yum install -y epel-release +if ! $NO_DOCKER; then + if [[ -f ~/.config/scylladb/dbuild ]]; then + . ~/.config/scylladb/dbuild fi - RELEASE=7 -else - if [ ! -f /etc/yum.repos.d/epel.repo ]; then - sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm + if which docker >/dev/null 2>&1 ; then + tool=${DBUILD_TOOL-docker} + elif which podman >/dev/null 2>&1 ; then + tool=${DBUILD_TOOL-podman} + else + echo "Please make sure you install either podman or docker on this machine to run dbuild" && exit 1 fi - RELEASE=7Server -fi - -if [ ! -f /usr/bin/yumdownloader ]; then - sudo yum -y install yum-utils fi if [ ! -f /usr/bin/wget ]; then @@ -85,29 +82,55 @@ if [ ! -f /usr/bin/wget ]; then fi if [ ! -f /usr/bin/makeself ]; then - sudo yum -y install makeself + if $NO_DOCKER; then + # makeself on EPEL7 is too old, borrow it from EPEL8 + # since there is no dependency on the package, it just work + if [ $release_major = '7' ]; then + sudo rpm --import https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8 + sudo cp "$here"/lib/epel8.repo /etc/yum.repos.d/ + YUM_OPTS="--enablerepo=epel8" + elif [ $release_major = '8' ]; then + yum -y install epel-release || yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + fi + fi + sudo yum -y install "$YUM_OPTS" makeself fi if [ ! -f /usr/bin/createrepo ]; then sudo yum -y install createrepo fi -sudo yum -y install yum-plugin-downloadonly +makeself_ver=$(makeself --version|cut -d ' ' -f 3|sed -e 's/\.//g') +if [ $makeself_ver -lt 240 ]; then + echo "$(makeself --version) is too old, please install 2.4.0 or later" + exit 1 +fi -cd /etc/yum.repos.d/ -sudo wget -N $REPO -cd - - -sudo rm -rf build/installroot build/offline_installer build/scylla_offline_installer.sh +sudo rm -rf build/installroot build/offline_docker build/offline_installer build/scylla_offline_installer.sh mkdir -p build/installroot mkdir -p build/installroot/etc/yum/vars -sudo sh -c "echo $RELEASE >> build/installroot/etc/yum/vars/releasever" + +mkdir -p build/offline_docker +wget "$REPO" -O build/offline_docker/scylla.repo +cp "$here"/lib/install_deps.sh build/offline_docker +cp "$here"/lib/Dockerfile.in build/offline_docker/Dockerfile +sed -i -e "s#@@IMAGE@@#$IMAGE#" build/offline_docker/Dockerfile + +cd build/offline_docker +if $NO_DOCKER; then + sudo cp scylla.repo /etc/yum.repos.d/scylla.repo + sudo ./install_deps.sh +else + image_id=$($tool build -q .) +fi +cd - mkdir -p build/offline_installer -cp dist/offline_installer/redhat/header build/offline_installer -if [ -n "$RELEASEVER" ]; then - YUMOPTS="--releasever=$RELEASEVER" +cp "$here"/lib/header build/offline_installer +if $NO_DOCKER; then + "$here"/lib/construct_offline_repo.sh +else + ./tools/toolchain/dbuild --image "$image_id" -- "$here"/lib/construct_offline_repo.sh fi -sudo yum -y install $YUMOPTS --downloadonly --installroot=`pwd`/build/installroot --downloaddir=build/offline_installer scylla sudo ntp ntpdate net-tools kernel-tools (cd build/offline_installer; createrepo -v .) -(cd build; makeself offline_installer scylla_offline_installer.sh "Scylla offline package" ./header) +(cd build; makeself --keep-umask offline_installer scylla_offline_installer.sh "Scylla offline package" ./header) diff --git a/dist/offline_installer/redhat/lib/Dockerfile.in b/dist/offline_installer/redhat/lib/Dockerfile.in new file mode 100644 index 0000000000..d1dac74e58 --- /dev/null +++ b/dist/offline_installer/redhat/lib/Dockerfile.in @@ -0,0 +1,5 @@ +FROM @@IMAGE@@ +ADD install_deps.sh install_deps.sh +RUN ./install_deps.sh +ADD scylla.repo /etc/yum.repos.d/scylla.repo +CMD /bin/bash diff --git a/dist/offline_installer/redhat/lib/construct_offline_repo.sh b/dist/offline_installer/redhat/lib/construct_offline_repo.sh new file mode 100755 index 0000000000..245f28fe9f --- /dev/null +++ b/dist/offline_installer/redhat/lib/construct_offline_repo.sh @@ -0,0 +1,9 @@ +#!/bin/bash -e + +releasever=`rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)"| uniq | cut -d ' ' -f 3` + +# Can ignore error since we only needed when files exists +cp /etc/yum/vars/* build/installroot/etc/yum/vars/ ||: + +# run yum in non-root mode using fakeroot +fakeroot yum -y install --downloadonly --releasever="$releasever" --installroot=`pwd`/build/installroot --downloaddir=build/offline_installer scylla sudo chrony net-tools kernel-tools mdadm xfsprogs diff --git a/dist/offline_installer/redhat/lib/epel8.repo b/dist/offline_installer/redhat/lib/epel8.repo new file mode 100644 index 0000000000..b7e94d16d4 --- /dev/null +++ b/dist/offline_installer/redhat/lib/epel8.repo @@ -0,0 +1,7 @@ +[epel8] +name=Extra Packages for Enterprise Linux 8 - $basearch +#baseurl=https://download.fedoraproject.org/pub/epel/8/Everything/$basearch +metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir +enabled=0 +gpgcheck=1 +countme=1 diff --git a/dist/offline_installer/redhat/header b/dist/offline_installer/redhat/lib/header similarity index 100% rename from dist/offline_installer/redhat/header rename to dist/offline_installer/redhat/lib/header diff --git a/dist/offline_installer/redhat/lib/install_deps.sh b/dist/offline_installer/redhat/lib/install_deps.sh new file mode 100755 index 0000000000..e0c6c88eda --- /dev/null +++ b/dist/offline_installer/redhat/lib/install_deps.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +. /etc/os-release + +release_major=$(echo $VERSION_ID|sed -e 's/^\([0-9]*\)[^0-9]*.*/\1/') + +if [ ! -f /etc/yum.repos.d/epel.repo ]; then + yum -y install epel-release || yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-"$release_major".noarch.rpm +fi +if [ ! -f /usr/bin/fakeroot ]; then + yum -y install fakeroot +fi