Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/ci_scripts/send_build_notification.py
1 views
1
#!/usr/bin/env python3
2
3
import argparse
4
import json
5
import os
6
import plistlib
7
import subprocess
8
import sys
9
10
11
EVENT_PREFIXES = {
12
"started": "🔨",
13
"failed": "💥",
14
"finished": "🚀",
15
}
16
17
WORKFLOW_PREFIXES = [
18
"Nightly",
19
"Release",
20
]
21
22
23
def get_marketing_version():
24
with open("../Signal/Signal-Info.plist", "rb") as file:
25
contents = plistlib.load(file)
26
return contents["CFBundleShortVersionString"]
27
28
29
def get_xcode_version():
30
return subprocess.run(
31
["xcodebuild", "-version"], check=True, capture_output=True, encoding="utf8"
32
).stdout.split("\n")[0]
33
34
35
def build_payload(src, dst, message):
36
payload = {
37
"number": src,
38
"recipients": [dst],
39
"message": message,
40
}
41
return json.dumps(payload)
42
43
44
def main(ns):
45
env = os.environ
46
endpoint = env.get("NOTIFY_ENDPOINT")
47
if endpoint is None:
48
print("Doing nothing because there's no endpoint.")
49
exit(0)
50
workflow = env.get("CI_WORKFLOW", "")
51
if not any(workflow.startswith(prefix) for prefix in WORKFLOW_PREFIXES):
52
print(f"Doing nothing because '{workflow}' isn't valid.")
53
exit(0)
54
55
authorization = env["NOTIFY_AUTHORIZATION"]
56
source = env["NOTIFY_SOURCE"]
57
destination = env["NOTIFY_DESTINATION"]
58
59
build_number = env["CI_BUILD_NUMBER"]
60
build_url = env["CI_BUILD_URL"]
61
prefix = EVENT_PREFIXES[ns.event]
62
ref = env["CI_GIT_REF"]
63
trigger = env["CI_START_CONDITION"]
64
version = get_marketing_version()
65
xcode_version = get_xcode_version()
66
67
message = (
68
f"{prefix} Cloud build for {version} ({build_number}) {ns.event} "
69
f"from {ref} (trigger: {trigger})\n\nXcode version: {xcode_version}\n\n{build_url}"
70
)
71
args = ["curl", "--silent"]
72
args.extend(["-H", "Content-Type: application/json"])
73
args.extend(["-H", f"Authorization: {authorization}"])
74
args.extend(["-d", build_payload(source, destination, message)])
75
args.extend([endpoint])
76
subprocess.run(args)
77
78
79
if __name__ == "__main__":
80
parser = argparse.ArgumentParser()
81
parser.add_argument("event", choices=sorted(EVENT_PREFIXES.keys()))
82
ns = parser.parse_args()
83
main(ns)
84
85