1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
#!/bin/bash -e
SCRIPTNAME="$(basename "${0}")"
BASEDIR="$(readlink -f "$(dirname "${0}")")"
if [ ! -d .git ]; then
echo "$SCRIPTNAME: Full path to the script: $BASEDIR/$SCRIPTNAME"
echo "$SCRIPTNAME: No .git present. Run this from the base dir of the git checkout."
exit 1
fi
# Running the script from a directory containing a colon anywhere in the path
# will expose us to the dreaded "[BUG] npm run [command] failed if the directory
# path contains colon" bug https://github.com/npm/cli/issues/633
# (see https://tracker.ceph.com/issues/39556 for details)
if [[ "$BASEDIR" == *:* ]] ; then
echo "$SCRIPTNAME: Full path to the script: $BASEDIR/$SCRIPTNAME"
echo "$SCRIPTNAME: The path to the script contains a colon. Their presence has been known to break the script."
exit 1
fi
version=$1
[ -z "$version" ] && version=$(git describe --long --match 'v*' | sed 's/^v//')
if expr index $version '-' > /dev/null; then
rpm_version=$(echo $version | cut -d - -f 1-1)
rpm_release=$(echo $version | cut -d - -f 2- | sed 's/-/./')
else
rpm_version=$version
rpm_release=0
fi
outfile="ceph-$version"
echo "version $version"
# update submodules
echo "updating submodules..."
force=$(if git submodule usage 2>&1 | grep --quiet 'update.*--force'; then echo --force ; fi)
if ! git submodule sync || ! git submodule update $force --init --recursive; then
echo "Error: could not initialize submodule projects"
echo " Network connectivity might be required."
exit 1
fi
download_from() {
fname=$1
shift
sha256=$1
shift
set +e
while true; do
url_base=$1
shift
if [ -z $url_base ]; then
echo "Error: failed to download $fname."
exit
fi
url=$url_base/$fname
wget --no-verbose -O $fname $url
if [ $? != 0 -o ! -e $fname ]; then
echo "Download of $url failed"
elif [ $(sha256sum $fname | awk '{print $1}') != $sha256 ]; then
echo "Error: failed to download $fname: SHA256 mismatch."
else
break
fi
done
set -e
}
download_boost() {
boost_version=$1
shift
boost_sha256=$1
shift
boost_version_underscore=$(echo $boost_version | sed 's/\./_/g')
boost_fname=boost_${boost_version_underscore}.tar.bz2
download_from $boost_fname $boost_sha256 $*
tar xjf $boost_fname -C src \
--exclude="$boost_version_underscore/libs/*/doc" \
--exclude="$boost_version_underscore/libs/*/example" \
--exclude="$boost_version_underscore/libs/*/examples" \
--exclude="$boost_version_underscore/libs/*/meta" \
--exclude="$boost_version_underscore/libs/*/test" \
--exclude="$boost_version_underscore/tools/boostbook" \
--exclude="$boost_version_underscore/tools/quickbook" \
--exclude="$boost_version_underscore/tools/auto_index" \
--exclude='doc' --exclude='more' --exclude='status'
mv src/boost_${boost_version_underscore} src/boost
tar cf ${outfile}.boost.tar ${outfile}/src/boost
rm -rf src/boost
}
download_liburing() {
liburing_version=$1
shift
liburing_sha256=$1
shift
liburing_fname=liburing-${liburing_version}.tar.gz
download_from $liburing_fname $liburing_sha256 $*
tar xzf $liburing_fname -C src \
--exclude=debian \
--exclude=examples \
--exclude=man \
--exclude=test
# normalize the names, liburing-0.7 if downloaded from git.kernel.dk,
# liburing-liburing-0.7 from github.com
mv src/liburing-* src/liburing
tar cf ${outfile}.liburing.tar ${outfile}/src/liburing
rm -rf src/liburing
}
download_pmdk() {
pmdk_version=$1
shift
pmdk_sha256=$1
shift
pmdk_fname=pmdk-${pmdk_version}.tar.gz
download_from $pmdk_fname $pmdk_sha256 $*
tar xzf $pmdk_fname -C src \
--exclude="pmdk-${pmdk_version}/doc" \
--exclude="pmdk-${pmdk_version}/src/test" \
--exclude="pmdk-${pmdk_version}/src/examples" \
--exclude="pmdk-${pmdk_version}/src/benchmarks"
mv src/pmdk-${pmdk_version} src/pmdk
tar cf ${outfile}.pmdk.tar ${outfile}/src/pmdk
rm -rf src/pmdk
}
build_dashboard_frontend() {
CURR_DIR=`pwd`
TEMP_DIR=`mktemp -d`
$CURR_DIR/src/tools/setup-virtualenv.sh $TEMP_DIR
$TEMP_DIR/bin/pip install nodeenv
$TEMP_DIR/bin/nodeenv --verbose -p --node=18.17.0
cd src/pybind/mgr/dashboard/frontend
. $TEMP_DIR/bin/activate
NG_CLI_ANALYTICS=false timeout 1h npm ci
echo "Building ceph-dashboard frontend with build:localize script";
# we need to use "--" because so that "--configuration production"
# survives accross all scripts redirections inside package.json
DASHBOARD_FRONTEND_LANGS="ALL" npm run build:localize -- --configuration production
deactivate
cd $CURR_DIR
rm -rf $TEMP_DIR
tar cf dashboard_frontend.tar $outfile/src/pybind/mgr/dashboard/frontend/dist
}
generate_rook_ceph_client() {
$outfile/src/pybind/mgr/rook/generate_rook_ceph_client.sh
tar cf rook_ceph_client.tar $outfile/src/pybind/mgr/rook/rook_client/*.py
}
# clean out old cruft...
echo "cleanup..."
rm -f $outfile*
# build new tarball
echo "building tarball..."
bin/git-archive-all.sh --prefix ceph-$version/ \
--verbose \
--ignore corpus \
$outfile.tar
# populate files with version strings
echo "including src/.git_version, ceph.spec"
(git rev-parse HEAD ; echo $version) 2> /dev/null > src/.git_version
if [ -r /etc/os-release ]; then
source /etc/os-release
case $ID in
opensuse*|suse|sles)
if [ "x$rpm_release" != "x0" ] ; then
rpm_release=$(echo $rpm_release | sed 's/.g/+g/')
rpm_version="${rpm_version}.${rpm_release}"
rpm_release="0"
fi
;;
esac
fi
for spec in ceph.spec.in; do
cat $spec |
sed "s/@PROJECT_VERSION@/$rpm_version/g" |
sed "s/@RPM_RELEASE@/$rpm_release/g" |
sed "s/@TARBALL_BASENAME@/ceph-$version/g" > `echo $spec | sed 's/.in$//'`
done
ln -s . $outfile
tar cvf $outfile.version.tar $outfile/src/.git_version $outfile/ceph.spec
# NOTE: If you change this version number make sure the package is available
# at the three URLs referenced below (may involve uploading to download.ceph.com)
boost_version=1.79.0
download_boost $boost_version 475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39 \
https://boostorg.jfrog.io/artifactory/main/release/$boost_version/source \
https://download.ceph.com/qa
download_liburing 0.7 8e2842cfe947f3a443af301bdd6d034455536c38a455c7a700d0c1ad165a7543 \
https://github.com/axboe/liburing/archive \
https://git.kernel.dk/cgit/liburing/snapshot
pmdk_version=1.10
download_pmdk $pmdk_version 08dafcf94db5ac13fac9139c92225d9aa5f3724ea74beee4e6ca19a01a2eb20c \
https://github.com/pmem/pmdk/releases/download/$pmdk_version
build_dashboard_frontend
generate_rook_ceph_client
for tarball in $outfile.version \
$outfile.boost \
$outfile.liburing \
$outfile.pmdk \
dashboard_frontend \
rook_ceph_client \
$outfile; do
tar --concatenate -f $outfile.all.tar $tarball.tar
rm $tarball.tar
done
mv $outfile.all.tar $outfile.tar
rm $outfile
echo "compressing..."
bzip2 -9 $outfile.tar
echo "done."
|