Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update release automation for CI updates #178

Merged
merged 5 commits into from
May 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ include src/build_bcrypt.py
recursive-include src/_csrc *
recursive-include tests *.py

exclude requirements.txt tasks.py .travis.yml azure-pipelines.yml
exclude requirements.txt release.py .travis.yml azure-pipelines.yml

exclude .azure-pipelines
recursive-exclude .azure-pipelines *
Expand Down
102 changes: 102 additions & 0 deletions release.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.

from __future__ import absolute_import, division, print_function

import getpass
import glob
import os
import subprocess
import tempfile
import time
import zipfile

from azure.devops.connection import Connection
from azure.devops.v5_1.build.models import Build

import click

from msrest.authentication import BasicAuthentication


def run(*args, **kwargs):
print("[running] {0}".format(list(args)))
subprocess.check_call(list(args), **kwargs)


def wait_for_build_completed_azure(build_client, build_id):
while True:
build = build_client.get_build("bcrypt", build_id)
if build.finish_time is not None:
break
time.sleep(3)


def download_artifacts_azure(build_client, build_id):
artifacts = build_client.get_artifacts("bcrypt", build_id)
paths = []
for artifact in artifacts:
contents = build_client.get_artifact_content_zip(
"bcrypt", build_id, artifact.name
)
with tempfile.NamedTemporaryFile() as f:
for chunk in contents:
f.write(chunk)
f.flush()
with zipfile.ZipFile(f.name) as z:
for name in z.namelist():
if not name.endswith(".whl"):
continue
p = z.open(name)
out_path = os.path.join(
os.path.dirname(__file__),
"dist",
os.path.basename(name),
)
with open(out_path, "wb") as f:
f.write(p.read())
paths.append(out_path)
return paths


def build_wheels_azure(version):
token = getpass.getpass("Azure personal access token: ")
credentials = BasicAuthentication("", token)
connection = Connection(
base_url="https://dev.azure.com/pyca", creds=credentials
)
build_client = connection.clients.get_build_client()
[definition] = build_client.get_definitions(
"bcrypt", "bcrypt-wheel-builder"
)
build_description = Build(
definition=definition,
)
build = build_client.queue_build(
project="bcrypt", build=build_description
)
wait_for_build_completed_azure(build_client, build.id)
return download_artifacts_azure(build_client, build.id)


@click.command()
@click.argument("version")
def release(version):
"""
``version`` should be a string like '0.4' or '1.0'.
"""
run("git", "tag", "-s", version, "-m", "{0} release".format(version))
run("git", "push", "--tags")

run("python", "setup.py", "sdist")

packages = glob.glob("dist/bcrypt-{0}*".format(version))
run("twine", "upload", "-s", *packages)

azure_wheel_paths = build_wheels_azure(version)
run("twine", "upload", *azure_wheel_paths)


if __name__ == "__main__":
release()
120 changes: 0 additions & 120 deletions tasks.py

This file was deleted.