You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			215 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Bash
		
	
			
		
		
	
	
			215 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Bash
		
	
#!/usr/bin/env 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.
 | 
						|
 | 
						|
set -e
 | 
						|
 | 
						|
http_port=8080
 | 
						|
ssh_port=29418
 | 
						|
 | 
						|
while test $# -ne 0; do
 | 
						|
  case "$1" in
 | 
						|
    -v)
 | 
						|
      version="$2"
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    -d)
 | 
						|
      rundir="$2"
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    --http-port)
 | 
						|
      http_port="$2"
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    --ssh-port)
 | 
						|
      ssh_port="$2"
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    *)
 | 
						|
      rundir="$1"
 | 
						|
      ;;
 | 
						|
  esac
 | 
						|
  shift
 | 
						|
done
 | 
						|
 | 
						|
if [ -z "$rundir" ]; then
 | 
						|
  rundir=$(mktemp -d)
 | 
						|
fi
 | 
						|
 | 
						|
this_dir=$(dirname $0)
 | 
						|
gerrit_exe="$this_dir/gerrit.war"
 | 
						|
 | 
						|
account_id=101
 | 
						|
full_name='Test Account'
 | 
						|
maximum_page_size='25'
 | 
						|
password='test-password'
 | 
						|
preferred_email="test-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/v1/b/gerrit-releases/o?projection=noAcl'
 | 
						|
curl --retry 30 --ssl-reqd -s $url | python <(cat <<EOF
 | 
						|
# Receives Gerrit version via command line and 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 corresponding *.war file.
 | 
						|
 | 
						|
import json
 | 
						|
import re
 | 
						|
import sys
 | 
						|
 | 
						|
requested_version = sys.argv[1] if len(sys.argv) > 1 else None
 | 
						|
# Disable using -rc versions.  This is a temporary hack to avoid
 | 
						|
# picking up version 2.9-rc0, which requires java 7.  These lines
 | 
						|
# should be un-commented after this bug is fixed:
 | 
						|
#   https://code.google.com/p/chromium/issues/detail?id=346369
 | 
						|
#gerrit_re = re.compile('gerrit(?:-full)?-([0-9.]+)(-rc[0-9]+)?[.]war')
 | 
						|
gerrit_re = re.compile('gerrit(?:-full)?-([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), m.group(2)) for x, m in items if m]
 | 
						|
items = [(x, m.group(1), '') for x, m in items if m]
 | 
						|
def _cmp(a, b):
 | 
						|
  an = a[1].split('.')
 | 
						|
  bn = b[1].split('.')
 | 
						|
  while len(an) < len(bn):
 | 
						|
    an.append('0')
 | 
						|
  while len(bn) < len(an):
 | 
						|
    bn.append('0')
 | 
						|
  an.append(a[2][3:] if a[2] else '1000')
 | 
						|
  bn.append(b[2][3:] if b[2] else '1000')
 | 
						|
  for i in range(len(an)):
 | 
						|
    if an[i] != bn[i]:
 | 
						|
      return -1 if int(an[i]) > int(bn[i]) else 1
 | 
						|
  return 0
 | 
						|
 | 
						|
if requested_version:
 | 
						|
  for info, version in items:
 | 
						|
    if version == requested_version:
 | 
						|
      print '"%s" "%s"' % (info['name'], info['md5Hash'])
 | 
						|
      sys.exit(0)
 | 
						|
  print >> sys.stderr, 'No such Gerrit version: %s' % requested_version
 | 
						|
  sys.exit(1)
 | 
						|
 | 
						|
items.sort(cmp=_cmp)
 | 
						|
for x in items:
 | 
						|
  print '"%s" "%s"' % (x[0]['name'], x[0]['md5Hash'])
 | 
						|
  sys.exit(0)
 | 
						|
EOF
 | 
						|
) "$version" | xargs | while read name md5; do
 | 
						|
  # Download the requested gerrit version if necessary, and verify the md5sum.
 | 
						|
  target="$this_dir/$name"
 | 
						|
  net_sum=$(echo -n $md5 | base64 -d | od -tx1 | head -1 | cut -d ' ' -f 2- |
 | 
						|
            sed 's/ //g')
 | 
						|
  if [ -f "$target" ]; then
 | 
						|
    file_sum=$(md5sum "$target" | awk '{print $1}' | xargs)
 | 
						|
    if [ "$file_sum" = "$net_sum" ]; then
 | 
						|
      ln -sf "$name" "$gerrit_exe"
 | 
						|
      break
 | 
						|
    else
 | 
						|
      rm -rf "$target"
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
  curl --retry 30 --ssl-reqd -s -o "$target" \
 | 
						|
      "https://gerrit-releases.storage.googleapis.com/$name"
 | 
						|
  file_sum=$(md5sum "$target" | awk '{print $1}' | xargs)
 | 
						|
  if [ "$file_sum" != "$net_sum" ]; then
 | 
						|
    echo "ERROR: md5sum mismatch when downloading $name" 1>&2
 | 
						|
    rm -rf "$target"
 | 
						|
    exit 1
 | 
						|
  else
 | 
						|
    ln -sf "$name" "$gerrit_exe"
 | 
						|
  fi
 | 
						|
done
 | 
						|
 | 
						|
if [ ! -e "$gerrit_exe" ]; then
 | 
						|
  echo "ERROR: No $gerrit_exe 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.  Also, turn off all email
 | 
						|
# notifications.
 | 
						|
mkdir -p "${rundir}/etc"
 | 
						|
cat <<EOF > "${rundir}/etc/gerrit.config"
 | 
						|
[auth]
 | 
						|
	type = DEVELOPMENT_BECOME_ANY_ACCOUNT
 | 
						|
	gitBasicAuth = true
 | 
						|
[gerrit]
 | 
						|
	canonicalWebUrl = http://$(hostname):${http_port}/
 | 
						|
[httpd]
 | 
						|
	listenUrl = http://*:${http_port}/
 | 
						|
[sshd]
 | 
						|
	listenAddress = *:${ssh_port}
 | 
						|
[sendemail]
 | 
						|
	enable = false
 | 
						|
[container]
 | 
						|
	javaOptions = -Duser.home=${rundir}/tmp
 | 
						|
EOF
 | 
						|
 | 
						|
# Initialize the gerrit instance.
 | 
						|
java -jar "$gerrit_exe" init --no-auto-start --batch --install-plugin=download-commands -d "${rundir}"
 | 
						|
 | 
						|
# Create SSH key pair for the first user.
 | 
						|
mkdir -p "${rundir}/tmp"
 | 
						|
ssh-keygen -t rsa -q -f "${rundir}/tmp/id_rsa" -N ""
 | 
						|
ssh_public_key="$(cat ${rundir}/tmp/id_rsa.pub)"
 | 
						|
 | 
						|
# Set up the first user, with admin priveleges.
 | 
						|
cat <<EOF | java -jar "$gerrit_exe" 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);
 | 
						|
INSERT INTO ACCOUNT_SSH_KEYS (ACCOUNT_ID, SSH_PUBLIC_KEY, VALID, SEQ) VALUES (${account_id}, '${ssh_public_key}', 'Y', 0);
 | 
						|
EOF
 | 
						|
 | 
						|
# Create a netrc file to authenticate as the first user.
 | 
						|
cat <<EOF > "${rundir}/tmp/.netrc"
 | 
						|
machine localhost login ${username} password ${password}
 | 
						|
EOF
 | 
						|
 | 
						|
# Create a .git-credentials file, to enable password-less push.
 | 
						|
cat <<EOF > "${rundir}/tmp/.git-credentials"
 | 
						|
http://${username}:${password}@localhost:${http_port}
 | 
						|
EOF
 | 
						|
 | 
						|
cat <<EOF
 | 
						|
 | 
						|
To start gerrit server:
 | 
						|
  ${rundir}/bin/gerrit.sh start
 | 
						|
 | 
						|
To use the REST API:
 | 
						|
  curl --netrc-file ${rundir}/tmp/.netrc http://localhost:${http_port}/<endpoint>
 | 
						|
 | 
						|
To use SSH API:
 | 
						|
  ssh ${username}@localhost -p ${ssh_port} -i ${rundir}/tmp/id_rsa gerrit
 | 
						|
 | 
						|
To enable 'git push' without a password prompt:
 | 
						|
  git config credential.helper 'store --file=${rundir}/tmp/.git-credentials'
 | 
						|
 | 
						|
To stop the server:
 | 
						|
  ${rundir}/bin/gerrit.sh stop
 | 
						|
 | 
						|
EOF
 |