135 lines
4.5 KiB
Python
135 lines
4.5 KiB
Python
|
# Licensed to Elasticsearch under one or more contributor
|
||
|
# license agreements. See the NOTICE file distributed with
|
||
|
# this work for additional information regarding copyright
|
||
|
# ownership. Elasticsearch licenses this file to you under
|
||
|
# the Apache License, Version 2.0 (the "License"); you may
|
||
|
# not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing,
|
||
|
# software distributed under the License is distributed on
|
||
|
# an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||
|
# either express or implied. See the License for the specific
|
||
|
# language governing permissions and limitations under the License.
|
||
|
|
||
|
import datetime
|
||
|
import os
|
||
|
import shutil
|
||
|
import sys
|
||
|
import time
|
||
|
import urllib
|
||
|
import urllib.request
|
||
|
import zipfile
|
||
|
|
||
|
from os.path import dirname, abspath
|
||
|
|
||
|
"""
|
||
|
This tool builds a release from the a given elasticsearch plugin branch.
|
||
|
|
||
|
It is basically a wrapper on top of launch_release.py which:
|
||
|
|
||
|
- tries to get a more recent version of launch_release.py in ...
|
||
|
- download it if needed
|
||
|
- launch it passing all arguments to it, like:
|
||
|
|
||
|
$ python3 dev_tools/release.py --branch master --publish --remote origin
|
||
|
|
||
|
Important options:
|
||
|
|
||
|
# Dry run
|
||
|
$ python3 dev_tools/release.py
|
||
|
|
||
|
# Dry run without tests
|
||
|
python3 dev_tools/release.py --skiptests
|
||
|
|
||
|
# Release, publish artifacts and announce
|
||
|
$ python3 dev_tools/release.py --publish
|
||
|
|
||
|
See full documentation in launch_release.py
|
||
|
"""
|
||
|
env = os.environ
|
||
|
|
||
|
# Change this if the source repository for your scripts is at a different location
|
||
|
SOURCE_REPO = 'elasticsearch/elasticsearch-plugins-script'
|
||
|
# We define that we should download again the script after 1 days
|
||
|
SCRIPT_OBSOLETE_DAYS = 1
|
||
|
# We ignore in master.zip file the following files
|
||
|
IGNORED_FILES = ['.gitignore', 'README.md']
|
||
|
|
||
|
|
||
|
ROOT_DIR = abspath(os.path.join(abspath(dirname(__file__)), '../'))
|
||
|
TARGET_TOOLS_DIR = ROOT_DIR + '/plugin_tools'
|
||
|
DEV_TOOLS_DIR = ROOT_DIR + '/dev-tools'
|
||
|
BUILD_RELEASE_FILENAME = 'release.zip'
|
||
|
BUILD_RELEASE_FILE = TARGET_TOOLS_DIR + '/' + BUILD_RELEASE_FILENAME
|
||
|
SOURCE_URL = 'https://github.com/%s/archive/master.zip' % SOURCE_REPO
|
||
|
|
||
|
# Download a recent version of the release plugin tool
|
||
|
try:
|
||
|
os.mkdir(TARGET_TOOLS_DIR)
|
||
|
print('directory %s created' % TARGET_TOOLS_DIR)
|
||
|
except FileExistsError:
|
||
|
pass
|
||
|
|
||
|
|
||
|
try:
|
||
|
# we check latest update. If we ran an update recently, we
|
||
|
# are not going to check it again
|
||
|
download = True
|
||
|
|
||
|
try:
|
||
|
last_download_time = datetime.datetime.fromtimestamp(os.path.getmtime(BUILD_RELEASE_FILE))
|
||
|
if (datetime.datetime.now()-last_download_time).days < SCRIPT_OBSOLETE_DAYS:
|
||
|
download = False
|
||
|
except FileNotFoundError:
|
||
|
pass
|
||
|
|
||
|
if download:
|
||
|
urllib.request.urlretrieve(SOURCE_URL, BUILD_RELEASE_FILE)
|
||
|
with zipfile.ZipFile(BUILD_RELEASE_FILE) as myzip:
|
||
|
for member in myzip.infolist():
|
||
|
filename = os.path.basename(member.filename)
|
||
|
# skip directories
|
||
|
if not filename:
|
||
|
continue
|
||
|
if filename in IGNORED_FILES:
|
||
|
continue
|
||
|
|
||
|
# copy file (taken from zipfile's extract)
|
||
|
source = myzip.open(member.filename)
|
||
|
target = open(os.path.join(TARGET_TOOLS_DIR, filename), "wb")
|
||
|
with source, target:
|
||
|
shutil.copyfileobj(source, target)
|
||
|
# We keep the original date
|
||
|
date_time = time.mktime(member.date_time + (0, 0, -1))
|
||
|
os.utime(os.path.join(TARGET_TOOLS_DIR, filename), (date_time, date_time))
|
||
|
print('plugin-tools updated from %s' % SOURCE_URL)
|
||
|
except urllib.error.HTTPError:
|
||
|
pass
|
||
|
|
||
|
|
||
|
# Let see if we need to update the release.py script itself
|
||
|
source_time = os.path.getmtime(TARGET_TOOLS_DIR + '/release.py')
|
||
|
repo_time = os.path.getmtime(DEV_TOOLS_DIR + '/release.py')
|
||
|
if source_time > repo_time:
|
||
|
input('release.py needs an update. Press a key to update it...')
|
||
|
shutil.copyfile(TARGET_TOOLS_DIR + '/release.py', DEV_TOOLS_DIR + '/release.py')
|
||
|
|
||
|
# We can launch the build process
|
||
|
try:
|
||
|
PYTHON = 'python'
|
||
|
# make sure python3 is used if python3 is available
|
||
|
# some systems use python 2 as default
|
||
|
os.system('python3 --version > /dev/null 2>&1')
|
||
|
PYTHON = 'python3'
|
||
|
except RuntimeError:
|
||
|
pass
|
||
|
|
||
|
release_args = ''
|
||
|
for x in range(1, len(sys.argv)):
|
||
|
release_args += ' ' + sys.argv[x]
|
||
|
|
||
|
os.system('%s %s/build_release.py %s' % (PYTHON, TARGET_TOOLS_DIR, release_args))
|