Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Miles/test releases #1

Open
wants to merge 5 commits into
base: mck/release-verification-script
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 145 additions & 0 deletions cassandra-release/cassandra-check-release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#!/bin/bash

# Parameters
# $1 release
# $2 maven artefacts url (as specified in the vote email)
#
# Example use: `./cassandra-check-release.sh 4.0-beta3 https://repository.apache.org/content/repositories/orgapachecassandra-1224/org/apache/cassandra/cassandra-all/4.0-beta3/`
#
# This script is very basic and experimental. I beg of you to help improve it.
#

###################
# prerequisites

command -v wget >/dev/null 2>&1 || { echo >&2 "wget needs to be installed"; exit 1; }
command -v gpg >/dev/null 2>&1 || { echo >&2 "gpg needs to be installed"; exit 1; }
command -v sha1sum >/dev/null 2>&1 || { echo >&2 "sha1sum needs to be installed"; exit 1; }
command -v md5sum >/dev/null 2>&1 || { echo >&2 "md5sum needs to be installed"; exit 1; }
command -v sha256sum >/dev/null 2>&1 || { echo >&2 "sha256sum needs to be installed"; exit 1; }
command -v sha512sum >/dev/null 2>&1 || { echo >&2 "sha512sum needs to be installed"; exit 1; }
command -v tar >/dev/null 2>&1 || { echo >&2 "tar needs to be installed"; exit 1; }
command -v ant >/dev/null 2>&1 || { echo >&2 "ant needs to be installed"; exit 1; }
command -v timeout >/dev/null 2>&1 || { echo >&2 "timeout needs to be installed"; exit 1; }
command -v docker >/dev/null 2>&1 || { echo >&2 "docker needs to be installed"; exit 1; }
(docker info >/dev/null 2>&1) || { echo >&2 "docker needs to running"; exit 1; }
(java -version 2>&1 | grep -q "1.8") || { echo >&2 "Java 8 must be used"; exit 1; }
(java -version 2>&1 | grep -iq jdk ) || { echo >&2 "Java JDK must be used"; exit 1; }

###################

mkdir -p /tmp/$1
cd /tmp/$1
echo "Downloading KEYS"
wget https://downloads.apache.org/cassandra/KEYS
echo "Downloading $2"
wget -Nqnd -e robots=off --recursive --no-parent $2
echo "Downloading https://dist.apache.org/repos/dist/dev/cassandra/$1/"
wget -Nqe robots=off --recursive --no-parent https://dist.apache.org/repos/dist/dev/cassandra/$1/

echo
echo "====== CHECK RESULTS ======"
echo

gpg --import KEYS

for f in *.asc ; do gpg --verify $f ; done
for f in *.pom *.jar *.asc ; do echo -n "sha1: " ; echo "$(cat $f.sha1) $f" | sha1sum -c ; echo -n "md5: " ; echo "$(cat $f.md5) $f" | md5sum -c ; done

cd dist.apache.org/repos/dist/dev/cassandra/$1
for f in *.asc ; do gpg --verify $f ; done
for f in *.gz ; do echo -n "sha256: " ; echo "$(cat $f.sha256) $f" | sha256sum -c ; echo -n "sha512:" ; echo "$(cat $f.sha512) $f" | sha512sum -c ; done

echo
rm -fR apache-cassandra-$1-src
tar -xjf apache-cassandra-$1-src.tar.gz
pushd apache-cassandra-$1-src
echo "Source build $(ant artifacts | grep '^BUILD ')"
popd

echo
rm -fR apache-cassandra-$1
tar -xjf apache-cassandra-$1-bin.tar.gz
rm -f procfifo
mkfifo procfifo
timeout 30 apache-cassandra-$1/bin/cassandra -f 2>&1 >procfifo &
PID=$!
success=false
while read LINE && ! $success ; do
if [[ $LINE =~ "Starting listening for CQL clients on" ]] ; then
echo "Binary artefact OK"
kill "$PID"
success=true
fi
done < procfifo
rm -f procfifo
wait "$PID"
if ! $success ; then
echo "Binary artefact FAILED"
fi

echo
rm -f procfifo
mkfifo procfifo
docker run -i -v `pwd`/debian:/debian openjdk:8-jdk-slim-buster timeout 180 /bin/bash -c "( apt -qq update; apt -qq install -y python python3; dpkg --ignore-depends=java7-runtime --ignore-depends=java8-runtime -i debian/*.deb ) 2>/dev/null; CASSANDRA_CONF=file:///etc/cassandra/ HEAP_NEWSIZE=500m MAX_HEAP_SIZE=1g cassandra -R -f" 2>&1 >procfifo &
PID=$!
success=false
while read LINE && ! $success ; do
if [[ $LINE =~ "Starting listening for CQL clients on" ]] ; then
echo "Debian package OK"
kill "$PID"
success=true
fi
done < procfifo
rm -f procfifo
wait "$PID"
if ! $success ; then
echo "Debian package FAILED"
fi

echo
rm -f procfifo
mkfifo procfifo
docker run -i -v `pwd`/redhat:/redhat centos timeout 180 /bin/bash -c "( yum install -y java-1.8.0-openjdk ; rpm -i redhat/*.rpm ) 2>/dev/null; cassandra -R -f " 2>&1 >procfifo &
PID=$!

success=false
while read LINE && ! $success ; do
if [[ $LINE =~ "Starting listening for CQL clients on" ]] ; then
echo "Redhat package OK"
kill "$PID"
success=true
fi
done < procfifo
rm -f procfifo
wait "$PID"
if ! $success ; then
echo "Redhat package FAILED"
fi

# Commented this out as it was just for my testing (when we don't have artefacts in staging). Directory structures I get are different to those the script seems to expect (e.g. I have .../redhat/311x/, script seems to expect .../311x/redhat).
# wget -Nqe robots=off --recursive --no-parent https://downloads.apache.org/cassandra/redhat/311x/
# wget https://downloads.apache.org/cassandra/KEYS
# cd downloads.apache.org/cassandra/
# mv redhat/311x/* redhat/
mv KEYS redhat
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cp KEYS redhat/


echo
rm -f procfifo
mkfifo procfifo
docker run -i -v `pwd`/redhat:/redhat centos timeout 180 /bin/bash -c "( rpm --import /redhat/KEYS; rpm -K /redhat/*.rpm);" 2>&1 >procfifo &
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than run the centos container twice, can we add --import /redhat/KEYS to line 103 above? (adding the [[ $LINE =~ ".*digests SIGNATURES NOT OK" ]] conditional block in before the [[ $LINE =~ "Starting listening for CQL clients on" ]] block)

PID=$!
failed=false
while read LINE; do
if [[ $LINE =~ ".*digests SIGNATURES NOT OK" ]] ; then
echo "RPM verification error."
kill "$PID";
failed=true;
break;
fi
done < procfifo
rm -f procfifo
wait "$PID"
if [[ $failed == false ]]; then
echo "RPMs verified correctly."
fi
95 changes: 95 additions & 0 deletions cassandra-release/test-releases.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#!/bin/bash

# Purpose: Analyse all known releases and test that the installation instruction work as intended. Intended to be run on a regular basis to ensure that extant releases work.
# Example use: `./test-releases.sh
# It would be ideal to find a way to auto-discover all known releases and test them. As is, this is stored in an array, below.


RELEASES=(40x 311x 30x 22x)

########################################################
# Check Debian #########################################
########################################################

function test_deb() {
CASSANDRA_VER=$1
echo
echo "testing Cassandra version $CASSANDRA_VER"
COMMAND="(apt -qq update;
apt -qq install -y python python3 sudo curl gnupg;
mkdir -p /usr/share/man/man1
echo deb https://downloads.apache.org/cassandra/debian $CASSANDRA_VER main | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list;
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -;
# sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-key A278B781FE4B2BDA;
sudo apt-get update;
sudo apt-get install -y cassandra) 2>/dev/null;
HEAP_NEWSIZE=500m MAX_HEAP_SIZE=1g cassandra -R -f
"
rm -f procfifo && mkfifo procfifo
docker run -i openjdk:8-jdk-slim-buster timeout 360 /bin/bash -c $COMMAND 2>&1 >procfifo &
Copy link
Member

@michaelsembwever michaelsembwever Sep 11, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, this change was also made in the original PR
( 4ea68da#diff-a636443cd5bfb43c9eddbf4ea4ce8546d63190b9326266245ab0068984fe59c1R84 )

PID=$!
success=false
while read LINE && ! $success ; do
if [[ $LINE =~ "Starting listening for CQL clients on" ]] ; then
echo "$CASSANDRA_VER Debian package OK"
kill "$PID"
success=true
fi
done < procfifo
rm -f procfifo
wait "$PID"
if ! $success ; then
echo "Debian package FAILED"
fi
}

for i in $RELEASES; do
test_deb $i;
done;


#######################################################
# Check RPMs ##########################################
#######################################################

function test_rpm() {
CASSANDRA_VER=$1
echo
echo "testing Cassandra version $CASSANDRA_VER"
# Heredoc is really ugly here and forces us to do terrible things with the indentation but I don't know how to make it nicer. Suggestions welcome.
COMMAND="( yum install -y java-1.8.0-openjdk ;
cat <<EOF > /etc/yum.repos.d/cassandra.repo
[cassandra]
name=Apache Cassandra
baseurl=https://downloads.apache.org/cassandra/redhat/${CASSANDRA_VER}/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://downloads.apache.org/cassandra/KEYS
EOF
cat /etc/yum.repos.d/cassandra.repo
yum install -y cassandra;
) 2>/dev/null;
cassandra -R -f
"
rm -f procfifo && mkfifo procfifo
docker run -i centos timeout 360 /bin/bash -c $COMMAND 2>&1 >procfifo &
PID=$!
success=false
while read LINE && ! $success ; do
if [[ $LINE =~ "Starting listening for CQL clients on" ]] ; then
echo "$CASSANDRA_VER Debian package OK"
kill "$PID"
success=true
fi
done < procfifo

rm -f procfifo
wait "$PID"
if ! $success ; then
echo "$CASSANDRA_VER Redhat package FAILED"
fi
}

for i in $RELEASES; do
test_rpm $i;
done