diff options
Diffstat (limited to 'release.py')
-rw-r--r-- | release.py | 128 |
1 files changed, 79 insertions, 49 deletions
@@ -6,18 +6,16 @@ from __future__ import absolute_import, division, print_function import getpass import glob +import io +import json 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 +import requests def run(*args, **kwargs): @@ -25,59 +23,87 @@ def run(*args, **kwargs): subprocess.check_call(list(args), **kwargs) -def wait_for_build_completed_azure(build_client, build_id): +def wait_for_build_complete_github_actions(session, token, run_url): while True: - build = build_client.get_build("bcrypt", build_id) - if build.finish_time is not None: + response = session.get(run_url, headers={ + "Content-Type": "application/json", + "Authorization": "token {}".format(token), + }) + response.raise_for_status() + if response.json()["conclusion"] is not None: break time.sleep(3) -def download_artifacts_azure(build_client, build_id): - artifacts = build_client.get_artifacts("bcrypt", build_id) +def download_artifacts_github_actions(session, token, run_url): + response = session.get(run_url, headers={ + "Content-Type": "application/json", + "Authorization": "token {}".format(token), + }) + response.raise_for_status() + + response = session.get(response.json()["artifacts_url"], headers={ + "Content-Type": "application/json", + "Authorization": "token {}".format(token), + }) + response.raise_for_status() 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) + for artifact in response.json()["artifacts"]: + response = session.get(artifact["archive_download_url"], headers={ + "Content-Type": "application/json", + "Authorization": "token {}".format(token), + }) + with zipfile.ZipFile(io.BytesIO(response.content)) 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" +def build_github_actions_wheels(token, version): + session = requests.Session() + + response = session.post( + "https://api.github.com/repos/pyca/bcrypt/dispatches", + headers={ + "Content-Type": "application/json", + "Accept": "application/vnd.github.everest-preview+json", + "Authorization": "token {}".format(token), + }, + data=json.dumps({ + "event_type": "wheel-builder", + "client_payload": { + "BUILD_VERSION": version, + }, + }), ) - build_description = Build( - definition=definition, + response.raise_for_status() + + # Give it a few seconds for the run to kick off. + time.sleep(5) + response = session.get( + ( + "https://api.github.com/repos/pyca/bcrypt/actions/workflows/" + "wheel-builder.yml/runs?event=repository_dispatch" + ), + headers={ + "Content-Type": "application/json", + "Authorization": "token {}".format(token), + }, ) - 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) + response.raise_for_status() + run_url = response.json()["workflow_runs"][0]["url"] + wait_for_build_complete_github_actions(session, token, run_url) + return download_artifacts_github_actions(session, token, run_url) @click.command() @@ -86,6 +112,8 @@ def release(version): """ ``version`` should be a string like '0.4' or '1.0'. """ + github_token = getpass.getpass("Github person access token: ") + run("git", "tag", "-s", version, "-m", "{0} release".format(version)) run("git", "push", "--tags") @@ -94,8 +122,10 @@ def release(version): 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) + github_actions_wheel_paths = build_github_actions_wheels( + github_token, version + ) + run("twine", "upload", *github_actions_wheel_paths) if __name__ == "__main__": |