Commit ef2ba74b authored by szager@chromium.org's avatar szager@chromium.org

Utility for bootstrapping a local gerrit instance.

BUG=
R=cmp@chromium.org

Review URL: https://codereview.chromium.org/19406002

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@211865 0039d316-1c4b-4281-b951-d872f2087c98
parent 4380c80d
#!/bin/bash
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
if [ -n "$1" ]; then
rundir="$1"
else
rundir=$(mktemp -d)
fi
account_id=101
full_name='Test Account'
maximum_page_size='25'
password='test-password'
preferred_email="${username}@test.org"
registered_on=$(date '+%Y-%m-%d %H:%M:%S.000%:::z')
username='test-username'
# The python code below for picking the "latest" gerrit release is cribbed and
# ported from the javascript at:
#
# http://gerrit-releases.storage.googleapis.com/index.html
url='https://www.googleapis.com/storage/v1beta2/b/gerrit-releases/o?projection=noAcl'
curl --ssl-reqd -s $url | python <(cat <<EOF
# Reads json-encoded text from stdin in the format:
#
# {
# "items": [
# {
# "name": "gerrit-<version>.war",
# "md5Hash": "<base64 encoded md5sum>",
# },
# {
# "name": "gerrit-<version>.war",
# "md5Hash": "<base64 encoded md5sum>",
# },
# ...
# }
#
# ...and prints the name and md5sum of the latest non-release-candidate version.
import json
import re
import sys
gerrit_re = re.compile('gerrit(?:-full)?-([0-9.]+(?:-rc[0-9]+)?)[.]war')
j = json.load(sys.stdin)
items = [(x, gerrit_re.match(x['name'])) for x in j['items']]
items = [(x, m.group(1)) for x, m in items if m]
def _cmp(a, b):
an = a[1].replace('-rc', '.rc').split('.')
bn = b[1].replace('-rc', '.rc').split('.')
while len(an) < len(bn):
an.append('0')
while len(bn) < len(an):
bn.append('0')
for i in range(len(an)):
ai = int(an[i][2:]) if 'rc' in an[i] else 1000 + int(an[i])
bi = int(bn[i][2:]) if 'rc' in bn[i] else 1000 + int(bn[i])
if ai != bi:
return -1 if ai > bi else 1
return 0
items.sort(cmp=_cmp)
for x in items:
if 'rc' not in x[0]['name']:
print '"%s" "%s"' % (x[0]['name'], x[0]['md5Hash'])
sys.exit(0)
EOF
) | xargs | while read name md5; do
# Download the latest gerrit version if necessary, and verify the md5sum.
net_sum=$(echo -n $md5 | base64 -d | od -tx1 | head -1 | cut -d ' ' -f 2- |
sed 's/ //g')
if [ -f "./$name" ]; then
file_sum=$(md5sum "./$name" | awk '{print $1}' | xargs)
if [ "$file_sum" = "$net_sum" ]; then
ln -sf "./$name" gerrit.war
break
else
rm -rf "./$name"
fi
fi
curl --ssl-reqd -s -o "./$name" \
"https://gerrit-releases.storage.googleapis.com/$name"
file_sum=$(md5sum "./$name" | awk '{print $1}' | xargs)
if [ "$file_sum" != "$net_sum" ]; then
echo "ERROR: md5sum mismatch when downloading $name" 1>&2
rm -rf "./$name"
exit 1
else
ln -sf "./$name" gerrit.war
fi
done
if [ ! -e "./gerrit.war" ]; then
echo "ERROR: No gerrit.war file or link present, and unable " 1>&2
echo " to download the latest version." 1>&2
exit 1
fi
# By default, gerrit only accepts https connections, which is a good thing. But
# for testing, it's convenient to enable plain http.
mkdir -p "${rundir}/etc"
cat <<EOF > "${rundir}/etc/gerrit.config"
[auth]
type = http
gitBasicAuth = true
EOF
# Initialize the gerrit instance.
java -jar "./gerrit.war" init --no-auto-start --batch -d "${rundir}"
# Set up the first user, with admin priveleges.
cat <<EOF | java -jar "./gerrit.war" gsql -d "${rundir}" > /dev/null
INSERT INTO ACCOUNTS (FULL_NAME, MAXIMUM_PAGE_SIZE, PREFERRED_EMAIL, REGISTERED_ON, ACCOUNT_ID) VALUES ('${full_name}', ${maximum_page_size}, '${preferred_email}', '${registered_on}', ${account_id});
INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'gerrit:${username}');
INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'username:${username}');
INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EMAIL_ADDRESS, PASSWORD) VALUES (${account_id}, '${preferred_email}', '${password}');
INSERT INTO ACCOUNT_GROUP_MEMBERS (ACCOUNT_ID, GROUP_ID) VALUES (${account_id}, 1);
EOF
# Create a netrc file to authenticate as the first user.
mkdir -p "${rundir}/tmp"
cat <<EOF > "${rundir}/tmp/.netrc"
machine localhost login ${username} password ${password}
EOF
echo
echo "To start gerrit server:"
echo " ${rundir}/bin/gerrit.sh start"
echo
echo "To use the REST API:"
echo " curl --netrc-file ${rundir}/tmp/.netrc http://localhost:8080/<endpoint>"
echo
echo "To stop the server:"
echo " ${rundir}/bin/gerrit.sh stop"
echo
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment