summaryrefslogtreecommitdiff
path: root/release.py
diff options
context:
space:
mode:
Diffstat (limited to 'release.py')
-rw-r--r--release.py128
1 files changed, 79 insertions, 49 deletions
diff --git a/release.py b/release.py
index 1744402..dbedaac 100644
--- a/release.py
+++ b/release.py
@@ -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__":