Browse Source

[BUILD] Add BWC tests to release script

This commit adds the ability to run bwc tests during the release
process to ensure the current release is backwards compatible with
the latest installed previous version. Installed means available
in the configured bwc test path.

Closes #6953
Simon Willnauer 11 years ago
parent
commit
b923f9556f
1 changed files with 30 additions and 11 deletions
  1. 30 11
      dev-tools/build_release.py

+ 30 - 11
dev-tools/build_release.py

@@ -234,7 +234,7 @@ def run_mvn(*cmd):
   for c in cmd:
     run('%s; %s %s' % (java_exe(), MVN, c))
 
-def build_release(run_tests=False, dry_run=True, cpus=1):
+def build_release(run_tests=False, dry_run=True, cpus=1, bwc_version=None):
   target = 'deploy'
   if dry_run:
     target = 'package'
@@ -242,6 +242,9 @@ def build_release(run_tests=False, dry_run=True, cpus=1):
     run_mvn('clean',
             'test -Dtests.jvms=%s -Des.node.mode=local' % (cpus),
             'test -Dtests.jvms=%s -Des.node.mode=network' % (cpus))
+  if bwc_version:
+      print('Running Backwards compatibilty tests against version [%s]' % (bwc_version))
+      run_mvn('clean', 'test -Dtests.filter=@backwards -Dtests.bwc.version=%s -Dtests.bwc=true -Dtests.jvms=1' % bwc_version)
   run_mvn('clean test-compile -Dforbidden.test.signatures="org.apache.lucene.util.LuceneTestCase\$AwaitsFix @ Please fix all bugs before release"')
   run_mvn('clean %s -DskipTests' % (target))
   success = False
@@ -345,7 +348,7 @@ def generate_checksums(files):
     directory = os.path.dirname(release_file)
     file = os.path.basename(release_file)
     checksum_file = '%s.sha1.txt' % file
-    
+
     if os.system('cd %s; shasum %s > %s' % (directory, file, checksum_file)):
       raise RuntimeError('Failed to generate checksum for file %s' % release_file)
     res = res + [os.path.join(directory, checksum_file), release_file]
@@ -379,12 +382,12 @@ def smoke_test_release(release, files, expected_hash, plugins):
       raise RuntimeError('Smoketest failed missing file %s' % (release_file))
     tmp_dir = tempfile.mkdtemp()
     if release_file.endswith('tar.gz'):
-      run('tar -xzf %s -C %s' % (release_file, tmp_dir)) 
+      run('tar -xzf %s -C %s' % (release_file, tmp_dir))
     elif release_file.endswith('zip'):
-      run('unzip %s -d %s' % (release_file, tmp_dir)) 
+      run('unzip %s -d %s' % (release_file, tmp_dir))
     else:
       log('Skip SmokeTest for [%s]' % release_file)
-      continue # nothing to do here 
+      continue # nothing to do here
     es_run_path = os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'bin/elasticsearch')
     print('  Smoke testing package [%s]' % release_file)
     es_plugin_path = os.path.join(tmp_dir, 'elasticsearch-%s' % (release),'bin/plugin')
@@ -472,7 +475,7 @@ def print_sonartype_notice():
        for line in settings_file:
          if line.strip() == '<id>sonatype-nexus-snapshots</id>':
            # moving out - we found the indicator no need to print the warning
-           return 
+           return
   print("""
     NOTE: No sonartype settings detected, make sure you have configured
     your sonartype credentials in '~/.m2/settings.xml':
@@ -499,12 +502,26 @@ def check_s3_credentials():
   if not env.get('AWS_ACCESS_KEY_ID', None) or not env.get('AWS_SECRET_ACCESS_KEY', None):
     raise RuntimeError('Could not find "AWS_ACCESS_KEY_ID" / "AWS_SECRET_ACCESS_KEY" in the env variables please export in order to upload to S3')
 
-VERSION_FILE = 'src/main/java/org/elasticsearch/Version.java'    
+VERSION_FILE = 'src/main/java/org/elasticsearch/Version.java'
 POM_FILE = 'pom.xml'
 
-# we print a notice if we can not find the relevant infos in the ~/.m2/settings.xml 
+# we print a notice if we can not find the relevant infos in the ~/.m2/settings.xml
 print_sonartype_notice()
 
+# finds the highest available bwc version to test against
+def find_bwc_version(release_version, bwc_dir='backwards'):
+  log('Lookup bwc version in directory [%s]' % bwc_dir)
+  bwc_version = None
+  max_version = [int(x) for x in release_version.split('.')]
+  for dir in os.listdir(bwc_dir):
+    if os.path.isdir(os.path.join(bwc_dir, dir)) and dir.startswith('elasticsearch-'):
+      version = [int(x) for x in dir[len('elasticsearch-'):].split('.')]
+      if version < max_version: # bwc tests only against smaller versions
+        if (not bwc_version) or version > [int(x) for x in bwc_version.split('.')]:
+          bwc_version = dir[len('elasticsearch-'):]
+  log('Using bwc version [%s]' % bwc_version)
+  return bwc_version
+
 if __name__ == '__main__':
   parser = argparse.ArgumentParser(description='Builds and publishes a Elasticsearch Release')
   parser.add_argument('--branch', '-b', metavar='master', default=get_current_branch(),
@@ -520,11 +537,13 @@ if __name__ == '__main__':
                       help='Publishes the release. Disable by default.')
   parser.add_argument('--smoke', '-s', dest='smoke', default='',
                       help='Smoke tests the given release')
+  parser.add_argument('--bwc', '-w', dest='bwc', metavar='backwards', default='backwards',
+                      help='Backwards compatibility version path to use to run compatibility tests against')
 
   parser.set_defaults(dryrun=True)
   parser.set_defaults(smoke=None)
   args = parser.parse_args()
-
+  bwc_path = args.bwc
   src_branch = args.branch
   remote = args.remote
   run_tests = args.tests
@@ -534,7 +553,7 @@ if __name__ == '__main__':
   smoke_test_version = args.smoke
   if not dry_run:
     check_s3_credentials()
-    print('WARNING: dryrun is set to "false" - this will push and publish the release') 
+    print('WARNING: dryrun is set to "false" - this will push and publish the release')
     input('Press Enter to continue...')
 
   print(''.join(['-' for _ in range(80)]))
@@ -574,7 +593,7 @@ if __name__ == '__main__':
         print('  Running maven builds now and publish to sonartype - run-tests [%s]' % run_tests)
       else:
         print('  Running maven builds now run-tests [%s]' % run_tests)
-      build_release(run_tests=run_tests, dry_run=dry_run, cpus=cpus)
+      build_release(run_tests=run_tests, dry_run=dry_run, cpus=cpus, bwc_version=find_bwc_version(release_version, bwc_path))
       artifacts = get_artifacts(release_version)
       artifacts_and_checksum = generate_checksums(artifacts)
       smoke_test_release(release_version, artifacts, get_head_hash(), PLUGINS)