Merge pull request #6588 from malept/dist-checksums
Generate and upload checksums for released ZIPs to GitHub
This commit is contained in:
		
				commit
				
					
						8f75f10239
					
				
			
		
					 4 changed files with 118 additions and 32 deletions
				
			
		| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
import atexit
 | 
			
		||||
import contextlib
 | 
			
		||||
import errno
 | 
			
		||||
import hashlib
 | 
			
		||||
import platform
 | 
			
		||||
import re
 | 
			
		||||
import shutil
 | 
			
		||||
| 
						 | 
				
			
			@ -15,9 +16,12 @@ import urllib2
 | 
			
		|||
import os
 | 
			
		||||
import zipfile
 | 
			
		||||
 | 
			
		||||
from config import is_verbose_mode
 | 
			
		||||
from config import is_verbose_mode, s3_config
 | 
			
		||||
from env_util import get_vs_env
 | 
			
		||||
 | 
			
		||||
BOTO_DIR = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'vendor',
 | 
			
		||||
                                        'boto'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_host_arch():
 | 
			
		||||
  """Returns the host architecture with a predictable string."""
 | 
			
		||||
| 
						 | 
				
			
			@ -129,6 +133,22 @@ def make_zip(zip_file_path, files, dirs):
 | 
			
		|||
        for f in filenames:
 | 
			
		||||
          zip_file.write(os.path.join(root, f))
 | 
			
		||||
    zip_file.close()
 | 
			
		||||
  upload_zip_sha256_checksum(zip_file_path)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def upload_zip_sha256_checksum(zip_file_path):
 | 
			
		||||
  bucket, access_key, secret_key = s3_config()
 | 
			
		||||
  checksum_path = '{}.sha256sum'.format(zip_file_path)
 | 
			
		||||
  safe_unlink(checksum_path)
 | 
			
		||||
  sha256 = hashlib.sha256()
 | 
			
		||||
  with open(zip_file_path, 'rb') as f:
 | 
			
		||||
    sha256.update(f.read())
 | 
			
		||||
 | 
			
		||||
  zip_basename = os.path.basename(zip_file_path)
 | 
			
		||||
  with open(checksum_path, 'w') as checksum:
 | 
			
		||||
    checksum.write('{} *{}'.format(sha256.hexdigest(), zip_basename))
 | 
			
		||||
  s3put(bucket, access_key, secret_key, os.path.dirname(checksum_path),
 | 
			
		||||
      'atom-shell/tmp', [checksum_path])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def rm_rf(path):
 | 
			
		||||
| 
						 | 
				
			
			@ -202,28 +222,39 @@ def parse_version(version):
 | 
			
		|||
    return vs + ['0'] * (4 - len(vs))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def s3put(bucket, access_key, secret_key, prefix, key_prefix, files):
 | 
			
		||||
  env = os.environ.copy()
 | 
			
		||||
  BOTO_DIR = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'vendor',
 | 
			
		||||
                                          'boto'))
 | 
			
		||||
  env['PYTHONPATH'] = os.path.pathsep.join([
 | 
			
		||||
    env.get('PYTHONPATH', ''),
 | 
			
		||||
def boto_path_dirs():
 | 
			
		||||
  return [
 | 
			
		||||
    os.path.join(BOTO_DIR, 'build', 'lib'),
 | 
			
		||||
    os.path.join(BOTO_DIR, 'build', 'lib.linux-x86_64-2.7')])
 | 
			
		||||
    os.path.join(BOTO_DIR, 'build', 'lib.linux-x86_64-2.7')
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def run_boto_script(access_key, secret_key, script_name, *args):
 | 
			
		||||
  env = os.environ.copy()
 | 
			
		||||
  env['AWS_ACCESS_KEY_ID'] = access_key
 | 
			
		||||
  env['AWS_SECRET_ACCESS_KEY'] = secret_key
 | 
			
		||||
  env['PYTHONPATH'] = os.path.pathsep.join(
 | 
			
		||||
      [env.get('PYTHONPATH', '')] + boto_path_dirs())
 | 
			
		||||
 | 
			
		||||
  boto = os.path.join(BOTO_DIR, 'bin', script_name)
 | 
			
		||||
 | 
			
		||||
  boto = os.path.join(BOTO_DIR, 'bin', 's3put')
 | 
			
		||||
  args = [
 | 
			
		||||
    sys.executable,
 | 
			
		||||
    boto,
 | 
			
		||||
    boto
 | 
			
		||||
  ] + args
 | 
			
		||||
 | 
			
		||||
  execute(args, env)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def s3put(bucket, access_key, secret_key, prefix, key_prefix, files):
 | 
			
		||||
  args = [
 | 
			
		||||
    '--bucket', bucket,
 | 
			
		||||
    '--access_key', access_key,
 | 
			
		||||
    '--secret_key', secret_key,
 | 
			
		||||
    '--prefix', prefix,
 | 
			
		||||
    '--key_prefix', key_prefix,
 | 
			
		||||
    '--grant', 'public-read'
 | 
			
		||||
  ] + files
 | 
			
		||||
 | 
			
		||||
  execute(args, env)
 | 
			
		||||
  run_boto_script(access_key, secret_key, 's3put', *args)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def import_vs_env(target_arch):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										41
									
								
								script/merge-electron-checksums.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								script/merge-electron-checksums.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
# Download individual checksum files for Electron zip files from S3,
 | 
			
		||||
# concatenate them, and upload to GitHub.
 | 
			
		||||
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
 | 
			
		||||
import argparse
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
from lib.config import s3_config
 | 
			
		||||
from lib.util import boto_path_dirs
 | 
			
		||||
 | 
			
		||||
sys.path.extend(boto_path_dirs())
 | 
			
		||||
 | 
			
		||||
from boto.s3.connection import S3Connection
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
  args = parse_args()
 | 
			
		||||
  bucket_name, access_key, secret_key = s3_config()
 | 
			
		||||
  s3 = S3Connection(access_key, secret_key)
 | 
			
		||||
  bucket = s3.get_bucket(bucket_name)
 | 
			
		||||
  if bucket is None:
 | 
			
		||||
    print('S3 bucket "{}" does not exist!'.format(bucket_name), file=sys.stderr)
 | 
			
		||||
    return 1
 | 
			
		||||
  shasums = [s3_object.get_contents_as_string().strip()
 | 
			
		||||
             for s3_object in bucket.list('atom-shell/tmp/', delimiter='/')
 | 
			
		||||
             if s3_object.key.endswith('.sha256sum') and
 | 
			
		||||
             args.version in s3_object.key]
 | 
			
		||||
  print('\n'.join(shasums))
 | 
			
		||||
  return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def parse_args():
 | 
			
		||||
  parser = argparse.ArgumentParser(description='Upload SHASUMS files to GitHub')
 | 
			
		||||
  parser.add_argument('-v', '--version', help='Specify the version',
 | 
			
		||||
                      required=True)
 | 
			
		||||
  return parser.parse_args()
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  sys.exit(main())
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
 | 
			
		||||
import argparse
 | 
			
		||||
import errno
 | 
			
		||||
from io import StringIO
 | 
			
		||||
import os
 | 
			
		||||
import subprocess
 | 
			
		||||
import sys
 | 
			
		||||
| 
						 | 
				
			
			@ -46,8 +47,7 @@ def main():
 | 
			
		|||
 | 
			
		||||
  if not args.publish_release:
 | 
			
		||||
    if not dist_newer_than_head():
 | 
			
		||||
      create_dist = os.path.join(SOURCE_ROOT, 'script', 'create-dist.py')
 | 
			
		||||
      execute([sys.executable, create_dist])
 | 
			
		||||
      run_python_script('create-dist.py')
 | 
			
		||||
 | 
			
		||||
    build_version = get_electron_build_version()
 | 
			
		||||
    if not ELECTRON_VERSION.startswith(build_version):
 | 
			
		||||
| 
						 | 
				
			
			@ -69,14 +69,14 @@ def main():
 | 
			
		|||
                                        tag_exists)
 | 
			
		||||
 | 
			
		||||
  if args.publish_release:
 | 
			
		||||
    # Upload the SHASUMS.txt.
 | 
			
		||||
    execute([sys.executable,
 | 
			
		||||
             os.path.join(SOURCE_ROOT, 'script', 'upload-checksums.py'),
 | 
			
		||||
             '-v', ELECTRON_VERSION])
 | 
			
		||||
    # Upload the Node SHASUMS*.txt.
 | 
			
		||||
    run_python_script('upload-node-checksums.py', '-v', ELECTRON_VERSION)
 | 
			
		||||
 | 
			
		||||
    # Upload the index.json.
 | 
			
		||||
    execute([sys.executable,
 | 
			
		||||
             os.path.join(SOURCE_ROOT, 'script', 'upload-index-json.py')])
 | 
			
		||||
    run_python_script('upload-index-json.py')
 | 
			
		||||
 | 
			
		||||
    # Create and upload the Electron SHASUMS*.txt
 | 
			
		||||
    release_electron_checksums(github, release)
 | 
			
		||||
 | 
			
		||||
    # Press the publish button.
 | 
			
		||||
    publish_release(github, release['id'])
 | 
			
		||||
| 
						 | 
				
			
			@ -108,13 +108,10 @@ def main():
 | 
			
		|||
 | 
			
		||||
  if PLATFORM == 'win32' and not tag_exists:
 | 
			
		||||
    # Upload PDBs to Windows symbol server.
 | 
			
		||||
    execute([sys.executable,
 | 
			
		||||
             os.path.join(SOURCE_ROOT, 'script', 'upload-windows-pdb.py')])
 | 
			
		||||
    run_python_script('upload-windows-pdb.py')
 | 
			
		||||
 | 
			
		||||
    # Upload node headers.
 | 
			
		||||
    execute([sys.executable,
 | 
			
		||||
             os.path.join(SOURCE_ROOT, 'script', 'upload-node-headers.py'),
 | 
			
		||||
             '-v', args.version])
 | 
			
		||||
    run_python_script('upload-node-headers.py', '-v', args.version)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def parse_args():
 | 
			
		||||
| 
						 | 
				
			
			@ -127,6 +124,11 @@ def parse_args():
 | 
			
		|||
  return parser.parse_args()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def run_python_script(script, *args):
 | 
			
		||||
  script_path = os.path.join(SOURCE_ROOT, 'script', script),
 | 
			
		||||
  return execute([sys.executable, script_path] + args)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_electron_build_version():
 | 
			
		||||
  if get_target_arch() == 'arm' or os.environ.has_key('CI'):
 | 
			
		||||
    # In CI we just build as told.
 | 
			
		||||
| 
						 | 
				
			
			@ -202,23 +204,35 @@ def create_release_draft(github, tag):
 | 
			
		|||
  return r
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def release_electron_checksums(github, release):
 | 
			
		||||
  checksums = run_python_script(
 | 
			
		||||
      'merge-electron-checksums.py', '-v', ELECTRON_VERSION)
 | 
			
		||||
  upload_io_to_github(github, release,
 | 
			
		||||
      'SHASUMS256.txt', StringIO(checksums), 'text/plain')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def upload_electron(github, release, file_path):
 | 
			
		||||
  # Delete the original file before uploading in CI.
 | 
			
		||||
  filename = os.path.basename(file_path)
 | 
			
		||||
  if os.environ.has_key('CI'):
 | 
			
		||||
    try:
 | 
			
		||||
      for asset in release['assets']:
 | 
			
		||||
        if asset['name'] == os.path.basename(file_path):
 | 
			
		||||
        if asset['name'] == filename:
 | 
			
		||||
          github.repos(ELECTRON_REPO).releases.assets(asset['id']).delete()
 | 
			
		||||
          break
 | 
			
		||||
    except Exception:
 | 
			
		||||
      pass
 | 
			
		||||
 | 
			
		||||
  # Upload the file.
 | 
			
		||||
  params = {'name': os.path.basename(file_path)}
 | 
			
		||||
  headers = {'Content-Type': 'application/zip'}
 | 
			
		||||
  name = os.path.dirname(file_path)
 | 
			
		||||
  with open(file_path, 'rb') as f:
 | 
			
		||||
    upload_io_to_github(github, release, name, f, 'application/zip')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def upload_io_to_github(github, release, name, io, content_type):
 | 
			
		||||
  params = {'name': name}
 | 
			
		||||
  headers = {'Content-Type': content_type}
 | 
			
		||||
  github.repos(ELECTRON_REPO).releases(release['id']).assets.post(
 | 
			
		||||
        params=params, headers=headers, data=f, verify=False)
 | 
			
		||||
      params=params, headers=headers, data=io, verify=False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def publish_release(github, release_id):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue