ci: generate appcast, upload it

This commit is contained in:
Mitchell Hashimoto
2023-12-18 21:15:49 -08:00
parent 51fa5ea3d4
commit c352d88afd
3 changed files with 80 additions and 0 deletions

View File

@ -179,7 +179,19 @@ jobs:
files: ghostty-macos-universal.zip
token: ${{ secrets.GH_RELEASE_TOKEN }}
# Create our appcast for Sparkle
- name: Generate Appcast
env:
SPARKLE_KEY: ${{ secrets.PROD_MACOS_SPARKLE_KEY }}
run: |
echo $SPARKLE_KEY > signing.key
sign_update -f signing.key src/App.zig > sign_update.txt
curl -L https://tip.files.ghostty.dev/appcast.xml > appcast.xml
python3 ./dist/macos/update_appcast_tip.py
test -f appcast_new.xml
# Update Blob Storage
- name: Upload to Blob Storage
run: |
s3cmd put ghostty-macos-universal.zip s3://ghostty-tip/${GHOSTTY_BUILD}/ghostty-macos-universal.zip
s3cmd put appcast_new.xml s3://ghostty-tip/appcast.xml

66
dist/macos/update_appcast_tip.py vendored Normal file
View File

@ -0,0 +1,66 @@
"""
This script is used to update the appcast.xml file for Ghostty releases.
The script is currently hardcoded to only work for tip releases and therefore
doesn't have rich release notes, hardcodes the URL to the tip bucket, etc.
This expects the following files in the current directory:
- sign_update.txt - contains the output from "sign_update" in the Sparkle
framework for the current build.
- appcast.xml - the existing appcast file.
And the following environment variables to be set:
- GHOSTTY_BUILD - the build number
- GHOSTTY_COMMIT - the commit hash
The script will output a new appcast file called appcast_new.xml.
"""
import os
import xml.etree.ElementTree as ET
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
build = os.environ["GHOSTTY_BUILD"]
commit = os.environ["GHOSTTY_COMMIT"]
# Read our sign_update output
with open("sign_update.txt", "r") as f:
# format is a=b b=c etc. create a map of this. values may contain equal
# signs, so we can't just split on equal signs.
attrs = {}
for pair in f.read().split(" "):
key, value = pair.split("=", 1)
value = value.strip()
if value[0] == '"':
value = value[1:-1]
attrs[key] = value
# Open our existing appcast and find the channel element. This is where
# we'll add our new item.
et = ET.parse('appcast.xml')
channel = et.find("channel")
# Create the item using some absoultely terrible XML manipulation.
item = ET.SubElement(channel, "item")
elem = ET.SubElement(item, "title")
elem.text = f"Build {build}"
elem = ET.SubElement(item, "pubDate")
elem.text = now.strftime("%a, %d %b %Y %H:%M:%S %z")
elem = ET.SubElement(item, "sparkle:version")
elem.text = build
elem = ET.SubElement(item, "sparkle:shortVersionString")
elem.text = commit
elem = ET.SubElement(item, "sparkle:minimumSystemVersion")
elem.text = "12.0.0"
elem = ET.SubElement(item, "description")
elem.text = f"""
<p>Automated build from commit <pre>{commit}</pre>.</p>
"""
elem = ET.SubElement(item, "enclosure")
elem.set("url", f"https://tip.files.ghostty.dev/{build}/ghostty-macos-universal.zip")
elem.set("type", "application/octet-stream")
for key, value in attrs.items():
elem.set(key, value)
# Output the new appcast.
et.write("appcast_new.xml")

View File

@ -91,6 +91,8 @@
<string>A program in Ghostty wants to use speech recognition.</string>
<key>NSSystemAdministrationUsageDescription</key>
<string>A program in Ghostty requires elevated privileges.</string>
<key>SUPublicEDKey</key>
<string>wsNcGf5hirwtdXMVnYoxRIX/SqZQLMOsYlD3q3imeok=</string>
<key>CFBundleVersion</key>
<string></string>
<key>CFBundleShortVersionString</key>