summaryrefslogtreecommitdiffstats
path: root/make-dist
blob: 75528c1b8608abfdb13e20ba7c44fee2b71d274a (plain)
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
#!/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 $name."
            exit
        fi
        url=$url_base/$fname
        wget -c --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 $name: 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=12.18.2
  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 "--prod" survives accross all
  # scripts redirections inside package.json
  npm run build:localize -- --prod
  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

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.73.0
download_boost $boost_version 4eb3b8d442b426dc35346235c8733b5ae35ba431690e38c6a8263dce9fcbb402 \
               https://boostorg.jfrog.io/artifactory/main/release/$boost_version/source \
               https://downloads.sourceforge.net/project/boost/boost/$boost_version \
               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."