mirror of
https://github.com/docker/compose.git
synced 2025-07-15 17:54:29 +02:00
Merge pull request #6270 from docker/release_script_upgrade
Release script upgrade
This commit is contained in:
commit
013cb51582
@ -17,6 +17,8 @@ from release.const import NAME
|
|||||||
from release.const import REPO_ROOT
|
from release.const import REPO_ROOT
|
||||||
from release.downloader import BinaryDownloader
|
from release.downloader import BinaryDownloader
|
||||||
from release.images import ImageManager
|
from release.images import ImageManager
|
||||||
|
from release.pypi import check_pypirc
|
||||||
|
from release.pypi import pypi_upload
|
||||||
from release.repository import delete_assets
|
from release.repository import delete_assets
|
||||||
from release.repository import get_contributors
|
from release.repository import get_contributors
|
||||||
from release.repository import Repository
|
from release.repository import Repository
|
||||||
@ -28,8 +30,6 @@ from release.utils import ScriptError
|
|||||||
from release.utils import update_init_py_version
|
from release.utils import update_init_py_version
|
||||||
from release.utils import update_run_sh_version
|
from release.utils import update_run_sh_version
|
||||||
from release.utils import yesno
|
from release.utils import yesno
|
||||||
from requests.exceptions import HTTPError
|
|
||||||
from twine.commands.upload import main as twine_upload
|
|
||||||
|
|
||||||
|
|
||||||
def create_initial_branch(repository, args):
|
def create_initial_branch(repository, args):
|
||||||
@ -170,25 +170,6 @@ def distclean():
|
|||||||
shutil.rmtree(folder, ignore_errors=True)
|
shutil.rmtree(folder, ignore_errors=True)
|
||||||
|
|
||||||
|
|
||||||
def pypi_upload(args):
|
|
||||||
print('Uploading to PyPi')
|
|
||||||
try:
|
|
||||||
rel = args.release.replace('-rc', 'rc')
|
|
||||||
twine_upload([
|
|
||||||
'dist/docker_compose-{}*.whl'.format(rel),
|
|
||||||
'dist/docker-compose-{}*.tar.gz'.format(rel)
|
|
||||||
])
|
|
||||||
except HTTPError as e:
|
|
||||||
if e.response.status_code == 400 and 'File already exists' in e.message:
|
|
||||||
if not args.finalize_resume:
|
|
||||||
raise ScriptError(
|
|
||||||
'Package already uploaded on PyPi.'
|
|
||||||
)
|
|
||||||
print('Skipping PyPi upload - package already uploaded')
|
|
||||||
else:
|
|
||||||
raise ScriptError('Unexpected HTTP error uploading package to PyPi: {}'.format(e))
|
|
||||||
|
|
||||||
|
|
||||||
def resume(args):
|
def resume(args):
|
||||||
try:
|
try:
|
||||||
distclean()
|
distclean()
|
||||||
@ -277,6 +258,7 @@ def start(args):
|
|||||||
def finalize(args):
|
def finalize(args):
|
||||||
distclean()
|
distclean()
|
||||||
try:
|
try:
|
||||||
|
check_pypirc()
|
||||||
repository = Repository(REPO_ROOT, args.repo)
|
repository = Repository(REPO_ROOT, args.repo)
|
||||||
img_manager = ImageManager(args.release)
|
img_manager = ImageManager(args.release)
|
||||||
pr_data = repository.find_release_pr(args.release)
|
pr_data = repository.find_release_pr(args.release)
|
||||||
@ -284,7 +266,7 @@ def finalize(args):
|
|||||||
raise ScriptError('No PR found for {}'.format(args.release))
|
raise ScriptError('No PR found for {}'.format(args.release))
|
||||||
if not check_pr_mergeable(pr_data):
|
if not check_pr_mergeable(pr_data):
|
||||||
raise ScriptError('Can not finalize release with an unmergeable PR')
|
raise ScriptError('Can not finalize release with an unmergeable PR')
|
||||||
if not img_manager.check_images(args.release):
|
if not img_manager.check_images():
|
||||||
raise ScriptError('Missing release image')
|
raise ScriptError('Missing release image')
|
||||||
br_name = branch_name(args.release)
|
br_name = branch_name(args.release)
|
||||||
if not repository.branch_exists(br_name):
|
if not repository.branch_exists(br_name):
|
||||||
|
@ -6,10 +6,8 @@ else
|
|||||||
./script/release/setup-venv.sh
|
./script/release/setup-venv.sh
|
||||||
fi
|
fi
|
||||||
|
|
||||||
args=$*
|
if test -z "$*"; then
|
||||||
|
|
||||||
if test -z $args; then
|
|
||||||
args="--help"
|
args="--help"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
./.release-venv/bin/python ./script/release/release.py $args
|
./.release-venv/bin/python ./script/release/release.py "$@"
|
||||||
|
@ -27,13 +27,12 @@ class ImageManager(object):
|
|||||||
def build_images(self, repository, files):
|
def build_images(self, repository, files):
|
||||||
print("Building release images...")
|
print("Building release images...")
|
||||||
repository.write_git_sha()
|
repository.write_git_sha()
|
||||||
docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
|
|
||||||
distdir = os.path.join(REPO_ROOT, 'dist')
|
distdir = os.path.join(REPO_ROOT, 'dist')
|
||||||
os.makedirs(distdir, exist_ok=True)
|
os.makedirs(distdir, exist_ok=True)
|
||||||
shutil.copy(files['docker-compose-Linux-x86_64'][0], distdir)
|
shutil.copy(files['docker-compose-Linux-x86_64'][0], distdir)
|
||||||
os.chmod(os.path.join(distdir, 'docker-compose-Linux-x86_64'), 0o755)
|
os.chmod(os.path.join(distdir, 'docker-compose-Linux-x86_64'), 0o755)
|
||||||
print('Building docker/compose image')
|
print('Building docker/compose image')
|
||||||
logstream = docker_client.build(
|
logstream = self.docker_client.build(
|
||||||
REPO_ROOT, tag='docker/compose:{}'.format(self.version), dockerfile='Dockerfile.run',
|
REPO_ROOT, tag='docker/compose:{}'.format(self.version), dockerfile='Dockerfile.run',
|
||||||
decode=True
|
decode=True
|
||||||
)
|
)
|
||||||
@ -44,7 +43,7 @@ class ImageManager(object):
|
|||||||
print(chunk['stream'], end='')
|
print(chunk['stream'], end='')
|
||||||
|
|
||||||
print('Building test image (for UCP e2e)')
|
print('Building test image (for UCP e2e)')
|
||||||
logstream = docker_client.build(
|
logstream = self.docker_client.build(
|
||||||
REPO_ROOT, tag='docker-compose-tests:tmp', decode=True
|
REPO_ROOT, tag='docker-compose-tests:tmp', decode=True
|
||||||
)
|
)
|
||||||
for chunk in logstream:
|
for chunk in logstream:
|
||||||
@ -53,13 +52,15 @@ class ImageManager(object):
|
|||||||
if 'stream' in chunk:
|
if 'stream' in chunk:
|
||||||
print(chunk['stream'], end='')
|
print(chunk['stream'], end='')
|
||||||
|
|
||||||
container = docker_client.create_container(
|
container = self.docker_client.create_container(
|
||||||
'docker-compose-tests:tmp', entrypoint='tox'
|
'docker-compose-tests:tmp', entrypoint='tox'
|
||||||
)
|
)
|
||||||
docker_client.commit(container, 'docker/compose-tests', 'latest')
|
self.docker_client.commit(container, 'docker/compose-tests', 'latest')
|
||||||
docker_client.tag('docker/compose-tests:latest', 'docker/compose-tests:{}'.format(self.version))
|
self.docker_client.tag(
|
||||||
docker_client.remove_container(container, force=True)
|
'docker/compose-tests:latest', 'docker/compose-tests:{}'.format(self.version)
|
||||||
docker_client.remove_image('docker-compose-tests:tmp', force=True)
|
)
|
||||||
|
self.docker_client.remove_container(container, force=True)
|
||||||
|
self.docker_client.remove_image('docker-compose-tests:tmp', force=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def image_names(self):
|
def image_names(self):
|
||||||
@ -69,23 +70,19 @@ class ImageManager(object):
|
|||||||
'docker/compose:{}'.format(self.version)
|
'docker/compose:{}'.format(self.version)
|
||||||
]
|
]
|
||||||
|
|
||||||
def check_images(self, version):
|
def check_images(self):
|
||||||
docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
|
|
||||||
|
|
||||||
for name in self.image_names:
|
for name in self.image_names:
|
||||||
try:
|
try:
|
||||||
docker_client.inspect_image(name)
|
self.docker_client.inspect_image(name)
|
||||||
except docker.errors.ImageNotFound:
|
except docker.errors.ImageNotFound:
|
||||||
print('Expected image {} was not found'.format(name))
|
print('Expected image {} was not found'.format(name))
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def push_images(self):
|
def push_images(self):
|
||||||
docker_client = docker.APIClient(**docker.utils.kwargs_from_env())
|
|
||||||
|
|
||||||
for name in self.image_names:
|
for name in self.image_names:
|
||||||
print('Pushing {} to Docker Hub'.format(name))
|
print('Pushing {} to Docker Hub'.format(name))
|
||||||
logstream = docker_client.push(name, stream=True, decode=True)
|
logstream = self.docker_client.push(name, stream=True, decode=True)
|
||||||
for chunk in logstream:
|
for chunk in logstream:
|
||||||
if 'status' in chunk:
|
if 'status' in chunk:
|
||||||
print(chunk['status'])
|
print(chunk['status'])
|
||||||
|
44
script/release/release/pypi.py
Normal file
44
script/release/release/pypi.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from configparser import Error
|
||||||
|
from requests.exceptions import HTTPError
|
||||||
|
from twine.commands.upload import main as twine_upload
|
||||||
|
from twine.utils import get_config
|
||||||
|
|
||||||
|
from .utils import ScriptError
|
||||||
|
|
||||||
|
|
||||||
|
def pypi_upload(args):
|
||||||
|
print('Uploading to PyPi')
|
||||||
|
try:
|
||||||
|
rel = args.release.replace('-rc', 'rc')
|
||||||
|
twine_upload([
|
||||||
|
'dist/docker_compose-{}*.whl'.format(rel),
|
||||||
|
'dist/docker-compose-{}*.tar.gz'.format(rel)
|
||||||
|
])
|
||||||
|
except HTTPError as e:
|
||||||
|
if e.response.status_code == 400 and 'File already exists' in e.message:
|
||||||
|
if not args.finalize_resume:
|
||||||
|
raise ScriptError(
|
||||||
|
'Package already uploaded on PyPi.'
|
||||||
|
)
|
||||||
|
print('Skipping PyPi upload - package already uploaded')
|
||||||
|
else:
|
||||||
|
raise ScriptError('Unexpected HTTP error uploading package to PyPi: {}'.format(e))
|
||||||
|
|
||||||
|
|
||||||
|
def check_pypirc():
|
||||||
|
try:
|
||||||
|
config = get_config()
|
||||||
|
except Error as e:
|
||||||
|
raise ScriptError('Failed to parse .pypirc file: {}'.format(e))
|
||||||
|
|
||||||
|
if config is None:
|
||||||
|
raise ScriptError('Failed to parse .pypirc file')
|
||||||
|
|
||||||
|
if 'pypi' not in config:
|
||||||
|
raise ScriptError('Missing [pypi] section in .pypirc file')
|
||||||
|
|
||||||
|
if not (config['pypi'].get('username') and config['pypi'].get('password')):
|
||||||
|
raise ScriptError('Missing login/password pair for pypi repo')
|
Loading…
x
Reference in New Issue
Block a user