blob: 1d7a425df8bd84a8f60dc921854b7ebb52431e6c [file] [log] [blame]
r.c.ladan@gmail.comec238db2014-06-02 20:39:42 +00001#!/usr/bin/env bash
szager@chromium.orgef2ba742013-07-16 22:43:59 +00002# Copyright (c) 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +00006set -e
7
szager@chromium.org74958942013-09-03 22:44:03 +00008http_port=8080
9ssh_port=29418
10
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000011while test $# -ne 0; do
12 case "$1" in
13 -v)
14 version="$2"
15 shift
16 ;;
17 -d)
18 rundir="$2"
19 shift
20 ;;
szager@chromium.org74958942013-09-03 22:44:03 +000021 --http-port)
22 http_port="$2"
23 shift
24 ;;
25 --ssh-port)
26 ssh_port="$2"
27 shift
28 ;;
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000029 *)
30 rundir="$1"
31 ;;
32 esac
33 shift
34done
35
36if [ -z "$rundir" ]; then
szager@chromium.orgef2ba742013-07-16 22:43:59 +000037 rundir=$(mktemp -d)
38fi
39
szager@chromium.org3e2fff22013-07-17 22:41:21 +000040this_dir=$(dirname $0)
41gerrit_exe="$this_dir/gerrit.war"
42
szager@chromium.orgef2ba742013-07-16 22:43:59 +000043account_id=101
44full_name='Test Account'
45maximum_page_size='25'
46password='test-password'
szager@chromium.org3e2fff22013-07-17 22:41:21 +000047preferred_email="test-username@test.org"
szager@chromium.orgef2ba742013-07-16 22:43:59 +000048registered_on=$(date '+%Y-%m-%d %H:%M:%S.000%:::z')
49username='test-username'
50
51# The python code below for picking the "latest" gerrit release is cribbed and
52# ported from the javascript at:
53#
54# http://gerrit-releases.storage.googleapis.com/index.html
tandrii@chromium.org1d2ac682016-03-21 17:02:13 +000055url='https://www.googleapis.com/storage/v1/b/gerrit-releases/o?projection=noAcl'
petermayo@chromium.org130a5c42014-02-05 01:24:59 +000056curl --retry 30 --ssl-reqd -s $url | python <(cat <<EOF
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000057# Receives Gerrit version via command line and reads json-encoded
58# text from stdin in the format:
szager@chromium.orgef2ba742013-07-16 22:43:59 +000059#
60# {
61# "items": [
62# {
63# "name": "gerrit-<version>.war",
64# "md5Hash": "<base64 encoded md5sum>",
65# },
66# {
67# "name": "gerrit-<version>.war",
68# "md5Hash": "<base64 encoded md5sum>",
69# },
70# ...
71# }
72#
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000073# ...and prints the name and md5sum of the corresponding *.war file.
szager@chromium.orgef2ba742013-07-16 22:43:59 +000074
Raul Tambre80ee78e2019-05-06 22:41:05 +000075from __future__ import print_function
76
szager@chromium.orgef2ba742013-07-16 22:43:59 +000077import json
78import re
79import sys
80
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000081requested_version = sys.argv[1] if len(sys.argv) > 1 else None
szager@chromium.org64e6f512014-03-13 21:09:12 +000082# Disable using -rc versions. This is a temporary hack to avoid
83# picking up version 2.9-rc0, which requires java 7. These lines
84# should be un-commented after this bug is fixed:
85# https://code.google.com/p/chromium/issues/detail?id=346369
86#gerrit_re = re.compile('gerrit(?:-full)?-([0-9.]+)(-rc[0-9]+)?[.]war')
87gerrit_re = re.compile('gerrit(?:-full)?-([0-9.]+)[.]war')
szager@chromium.orgef2ba742013-07-16 22:43:59 +000088j = json.load(sys.stdin)
89items = [(x, gerrit_re.match(x['name'])) for x in j['items']]
szager@chromium.org64e6f512014-03-13 21:09:12 +000090#items = [(x, m.group(1), m.group(2)) for x, m in items if m]
91items = [(x, m.group(1), '') for x, m in items if m]
szager@chromium.orgef2ba742013-07-16 22:43:59 +000092def _cmp(a, b):
davidjames@chromium.org0d000112014-02-19 06:42:55 +000093 an = a[1].split('.')
94 bn = b[1].split('.')
95 while len(an) < len(bn):
96 an.append('0')
97 while len(bn) < len(an):
98 bn.append('0')
szager@chromium.org64e6f512014-03-13 21:09:12 +000099 an.append(a[2][3:] if a[2] else '1000')
100 bn.append(b[2][3:] if b[2] else '1000')
davidjames@chromium.org0d000112014-02-19 06:42:55 +0000101 for i in range(len(an)):
102 if an[i] != bn[i]:
103 return -1 if int(an[i]) > int(bn[i]) else 1
104 return 0
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000105
106if requested_version:
107 for info, version in items:
108 if version == requested_version:
Raul Tambre80ee78e2019-05-06 22:41:05 +0000109 print('"%s" "%s"' % (info['name'], info['md5Hash']))
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000110 sys.exit(0)
Raul Tambre80ee78e2019-05-06 22:41:05 +0000111 print('No such Gerrit version: %s' % requested_version, file=sys.stderr)
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000112 sys.exit(1)
113
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000114items.sort(cmp=_cmp)
115for x in items:
Raul Tambre80ee78e2019-05-06 22:41:05 +0000116 print('"%s" "%s"' % (x[0]['name'], x[0]['md5Hash']))
cranger@google.com80612ba2013-12-04 07:41:54 +0000117 sys.exit(0)
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000118EOF
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000119) "$version" | xargs | while read name md5; do
120 # Download the requested gerrit version if necessary, and verify the md5sum.
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000121 target="$this_dir/$name"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000122 net_sum=$(echo -n $md5 | base64 -d | od -tx1 | head -1 | cut -d ' ' -f 2- |
123 sed 's/ //g')
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000124 if [ -f "$target" ]; then
125 file_sum=$(md5sum "$target" | awk '{print $1}' | xargs)
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000126 if [ "$file_sum" = "$net_sum" ]; then
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000127 ln -sf "$name" "$gerrit_exe"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000128 break
129 else
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000130 rm -rf "$target"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000131 fi
132 fi
petermayo@chromium.org130a5c42014-02-05 01:24:59 +0000133 curl --retry 30 --ssl-reqd -s -o "$target" \
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000134 "https://gerrit-releases.storage.googleapis.com/$name"
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000135 file_sum=$(md5sum "$target" | awk '{print $1}' | xargs)
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000136 if [ "$file_sum" != "$net_sum" ]; then
137 echo "ERROR: md5sum mismatch when downloading $name" 1>&2
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000138 rm -rf "$target"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000139 exit 1
140 else
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000141 ln -sf "$name" "$gerrit_exe"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000142 fi
143done
144
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000145if [ ! -e "$gerrit_exe" ]; then
146 echo "ERROR: No $gerrit_exe file or link present, and unable " 1>&2
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000147 echo " to download the latest version." 1>&2
148 exit 1
149fi
150
151# By default, gerrit only accepts https connections, which is a good thing. But
szager@chromium.org7d51b4f2013-09-12 19:15:35 +0000152# for testing, it's convenient to enable plain http. Also, turn off all email
153# notifications.
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000154mkdir -p "${rundir}/etc"
155cat <<EOF > "${rundir}/etc/gerrit.config"
156[auth]
szager@chromium.orgb4696232013-10-16 19:45:35 +0000157 type = DEVELOPMENT_BECOME_ANY_ACCOUNT
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000158 gitBasicAuth = true
szager@chromium.org74958942013-09-03 22:44:03 +0000159[gerrit]
160 canonicalWebUrl = http://$(hostname):${http_port}/
161[httpd]
162 listenUrl = http://*:${http_port}/
163[sshd]
164 listenAddress = *:${ssh_port}
szager@chromium.org7d51b4f2013-09-12 19:15:35 +0000165[sendemail]
166 enable = false
szager@chromium.org545260d2013-10-17 22:56:13 +0000167[container]
168 javaOptions = -Duser.home=${rundir}/tmp
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000169EOF
170
171# Initialize the gerrit instance.
cranger@google.com80612ba2013-12-04 07:41:54 +0000172java -jar "$gerrit_exe" init --no-auto-start --batch --install-plugin=download-commands -d "${rundir}"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000173
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000174# Create SSH key pair for the first user.
175mkdir -p "${rundir}/tmp"
176ssh-keygen -t rsa -q -f "${rundir}/tmp/id_rsa" -N ""
177ssh_public_key="$(cat ${rundir}/tmp/id_rsa.pub)"
178
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000179# Set up the first user, with admin priveleges.
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000180cat <<EOF | java -jar "$gerrit_exe" gsql -d "${rundir}" > /dev/null
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000181INSERT 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});
182INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'gerrit:${username}');
183INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'username:${username}');
184INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EMAIL_ADDRESS, PASSWORD) VALUES (${account_id}, '${preferred_email}', '${password}');
185INSERT INTO ACCOUNT_GROUP_MEMBERS (ACCOUNT_ID, GROUP_ID) VALUES (${account_id}, 1);
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000186INSERT INTO ACCOUNT_SSH_KEYS (ACCOUNT_ID, SSH_PUBLIC_KEY, VALID, SEQ) VALUES (${account_id}, '${ssh_public_key}', 'Y', 0);
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000187EOF
188
189# Create a netrc file to authenticate as the first user.
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000190cat <<EOF > "${rundir}/tmp/.netrc"
191machine localhost login ${username} password ${password}
192EOF
193
szager@chromium.org3592f932013-07-19 23:27:44 +0000194# Create a .git-credentials file, to enable password-less push.
195cat <<EOF > "${rundir}/tmp/.git-credentials"
szager@chromium.org74958942013-09-03 22:44:03 +0000196http://${username}:${password}@localhost:${http_port}
szager@chromium.org3592f932013-07-19 23:27:44 +0000197EOF
198
szager@chromium.org74958942013-09-03 22:44:03 +0000199cat <<EOF
200
201To start gerrit server:
202 ${rundir}/bin/gerrit.sh start
203
204To use the REST API:
205 curl --netrc-file ${rundir}/tmp/.netrc http://localhost:${http_port}/<endpoint>
206
207To use SSH API:
208 ssh ${username}@localhost -p ${ssh_port} -i ${rundir}/tmp/id_rsa gerrit
209
210To enable 'git push' without a password prompt:
211 git config credential.helper 'store --file=${rundir}/tmp/.git-credentials'
212
213To stop the server:
214 ${rundir}/bin/gerrit.sh stop
215
216EOF