macOS: save dSYM files

The focus of this commit is to store the dSYM files associated with
official macOS builds. dSYM files allow us to map crash reports to
source.

The dSYM files are primarily uploaded to our official blob storage where
all releases are also stored. We also upload the dSYM files to Sentry
since I'm experimenting with using that for crash reproting (note:
manual crash reporting, no automatic network traffic).

This commit also changes our blob URLs for releases to use the full
Git SHA rather than a build number. This is much easier to trace back.
This commit is contained in:
Mitchell Hashimoto
2024-08-28 20:50:50 -07:00
parent fa440b718e
commit 3ba0787ec2
4 changed files with 121 additions and 15 deletions

View File

@ -7,6 +7,48 @@ on:
name: Release PR name: Release PR
jobs: jobs:
sentry-dsym-debug:
runs-on: namespace-profile-ghostty-sm
needs: [build-macos-debug]
steps:
- uses: actions/checkout@v4
- name: Install sentry-cli
run: |
curl -sL https://sentry.io/get-cli/ | bash
- name: Download dSYM
run: |
GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)
curl -L https://pr.files.ghostty.dev/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-debug-dsym.zip > dsym.zip
- name: Upload dSYM to Sentry
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: |
sentry-cli dif upload --project ghostty --wait dsym.zip
sentry-dsym:
runs-on: namespace-profile-ghostty-sm
needs: [build-macos]
steps:
- uses: actions/checkout@v4
- name: Install sentry-cli
run: |
curl -sL https://sentry.io/get-cli/ | bash
- name: Download dSYM
run: |
GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)
curl -L https://pr.files.ghostty.dev/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-dsym.zip > dsym.zip
- name: Upload dSYM to Sentry
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: |
sentry-cli dif upload --project ghostty --wait dsym.zip
build-macos: build-macos:
runs-on: namespace-profile-ghostty-macos runs-on: namespace-profile-ghostty-macos
timeout-minutes: 90 timeout-minutes: 90
@ -42,6 +84,7 @@ jobs:
run: | run: |
echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)" >> $GITHUB_ENV
# GhosttyKit is the framework that is built from Zig for our native # GhosttyKit is the framework that is built from Zig for our native
# Mac app to access. Build this in release mode. # Mac app to access. Build this in release mode.
@ -132,14 +175,18 @@ jobs:
# Zip up the app # Zip up the app
- name: Zip App - name: Zip App
run: cd macos/build/Release && zip -9 -r --symlinks ../../../ghostty-macos-universal.zip Ghostty.app run: |
cd macos/build/Release
zip -9 -r --symlinks ../../../ghostty-macos-universal.zip Ghostty.app
zip -9 -r --symlinks ../../../ghostty-macos-universal-dsym.zip Ghostty.app.dSYM/
# Update Blob Storage # Update Blob Storage
- name: Prep R2 Storage - name: Prep R2 Storage
run: | run: |
mkdir blob mkdir blob
mkdir -p blob/${GHOSTTY_BUILD} mkdir -p blob/${GHOSTTY_COMMIT_LONG}
cp ghostty-macos-universal.zip blob/${GHOSTTY_BUILD}/ghostty-macos-universal.zip cp ghostty-macos-universal.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal.zip
cp ghostty-macos-universal-dsym.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-dsym.zip
- name: Upload to R2 - name: Upload to R2
uses: ryand56/r2-upload-action@latest uses: ryand56/r2-upload-action@latest
with: with:
@ -185,6 +232,7 @@ jobs:
run: | run: |
echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)" >> $GITHUB_ENV
# GhosttyKit is the framework that is built from Zig for our native # GhosttyKit is the framework that is built from Zig for our native
# Mac app to access. Build this in release mode. # Mac app to access. Build this in release mode.
@ -275,14 +323,18 @@ jobs:
# Zip up the app # Zip up the app
- name: Zip App - name: Zip App
run: cd macos/build/Release && zip -9 -r --symlinks ../../../ghostty-macos-universal-debug.zip Ghostty.app run: |
cd macos/build/Release
zip -9 -r --symlinks ../../../ghostty-macos-universal-debug.zip Ghostty.app
zip -9 -r --symlinks ../../../ghostty-macos-universal-debug-dsym.zip Ghostty.app.dSYM/
# Update Blob Storage # Update Blob Storage
- name: Prep R2 Storage - name: Prep R2 Storage
run: | run: |
mkdir blob mkdir blob
mkdir -p blob/${GHOSTTY_BUILD} mkdir -p blob/${GHOSTTY_COMMIT_LONG}
cp ghostty-macos-universal-debug.zip blob/${GHOSTTY_BUILD}/ghostty-macos-universal-debug.zip cp ghostty-macos-universal-debug.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-debug.zip
cp ghostty-macos-universal-debug-dsym.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-debug-dsym.zip
- name: Upload to R2 - name: Upload to R2
uses: ryand56/r2-upload-action@latest uses: ryand56/r2-upload-action@latest
with: with:

View File

@ -21,6 +21,48 @@ jobs:
git tag -fa tip -m "Latest Continuous Release" ${GITHUB_SHA} git tag -fa tip -m "Latest Continuous Release" ${GITHUB_SHA}
git push --force origin tip git push --force origin tip
sentry-dsym-debug:
runs-on: namespace-profile-ghostty-sm
needs: [build-macos-debug]
steps:
- uses: actions/checkout@v4
- name: Install sentry-cli
run: |
curl -sL https://sentry.io/get-cli/ | bash
- name: Download dSYM
run: |
GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)
curl -L https://tip.files.ghostty.dev/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-debug-dsym.zip > dsym.zip
- name: Upload dSYM to Sentry
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: |
sentry-cli dif upload --project ghostty --wait dsym.zip
sentry-dsym:
runs-on: namespace-profile-ghostty-sm
needs: [build-macos]
steps:
- uses: actions/checkout@v4
- name: Install sentry-cli
run: |
curl -sL https://sentry.io/get-cli/ | bash
- name: Download dSYM
run: |
GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)
curl -L https://tip.files.ghostty.dev/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-dsym.zip > dsym.zip
- name: Upload dSYM to Sentry
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: |
sentry-cli dif upload --project ghostty --wait dsym.zip
build-macos: build-macos:
if: | if: |
${{ ${{
@ -66,6 +108,7 @@ jobs:
run: | run: |
echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)" >> $GITHUB_ENV
# GhosttyKit is the framework that is built from Zig for our native # GhosttyKit is the framework that is built from Zig for our native
# Mac app to access. Build this in release mode. # Mac app to access. Build this in release mode.
@ -154,9 +197,12 @@ jobs:
echo "Attach staple" echo "Attach staple"
xcrun stapler staple "macos/build/Release/Ghostty.app" xcrun stapler staple "macos/build/Release/Ghostty.app"
# Zip up the app # Zip up the app and symbols
- name: Zip App - name: Zip App
run: cd macos/build/Release && zip -9 -r --symlinks ../../../ghostty-macos-universal.zip Ghostty.app run: |
cd macos/build/Release
zip -9 -r --symlinks ../../../ghostty-macos-universal.zip Ghostty.app
zip -9 -r --symlinks ../../../ghostty-macos-universal-dsym.zip Ghostty.app.dSYM/
# Update Release # Update Release
- name: Release - name: Release
@ -184,8 +230,9 @@ jobs:
- name: Prep R2 Storage - name: Prep R2 Storage
run: | run: |
mkdir blob mkdir blob
mkdir -p blob/${GHOSTTY_BUILD} mkdir -p blob/${GHOSTTY_COMMIT_LONG}
cp ghostty-macos-universal.zip blob/${GHOSTTY_BUILD}/ghostty-macos-universal.zip cp ghostty-macos-universal.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal.zip
cp ghostty-macos-universal-dsym.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-dsym.zip
cp appcast_new.xml blob/appcast.xml cp appcast_new.xml blob/appcast.xml
- name: Upload to R2 - name: Upload to R2
uses: ryand56/r2-upload-action@latest uses: ryand56/r2-upload-action@latest
@ -242,6 +289,7 @@ jobs:
run: | run: |
echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV echo "GHOSTTY_BUILD=$(git rev-list --count head)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV echo "GHOSTTY_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
echo "GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)" >> $GITHUB_ENV
# GhosttyKit is the framework that is built from Zig for our native # GhosttyKit is the framework that is built from Zig for our native
# Mac app to access. Build this in release mode. # Mac app to access. Build this in release mode.
@ -332,7 +380,10 @@ jobs:
# Zip up the app # Zip up the app
- name: Zip App - name: Zip App
run: cd macos/build/Release && zip -9 -r --symlinks ../../../ghostty-macos-universal-debug.zip Ghostty.app run: |
cd macos/build/Release
zip -9 -r --symlinks ../../../ghostty-macos-universal-debug.zip Ghostty.app
zip -9 -r --symlinks ../../../ghostty-macos-universal-debug-dsym.zip Ghostty.app.dSYM/
# Update Release # Update Release
- name: Release - name: Release
@ -349,8 +400,9 @@ jobs:
- name: Prep R2 Storage - name: Prep R2 Storage
run: | run: |
mkdir blob mkdir blob
mkdir -p blob/${GHOSTTY_BUILD} mkdir -p blob/${GHOSTTY_COMMIT_LONG}
cp ghostty-macos-universal-debug.zip blob/${GHOSTTY_BUILD}/ghostty-macos-universal-debug.zip cp ghostty-macos-universal-debug.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-debug.zip
cp ghostty-macos-universal-debug-dsym.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-debug-dsym.zip
- name: Upload to R2 - name: Upload to R2
uses: ryand56/r2-upload-action@latest uses: ryand56/r2-upload-action@latest
with: with:

View File

@ -22,6 +22,7 @@ from datetime import datetime, timezone
now = datetime.now(timezone.utc) now = datetime.now(timezone.utc)
build = os.environ["GHOSTTY_BUILD"] build = os.environ["GHOSTTY_BUILD"]
commit = os.environ["GHOSTTY_COMMIT"] commit = os.environ["GHOSTTY_COMMIT"]
commit_long = os.environ["GHOSTTY_COMMIT_LONG"]
repo = "https://github.com/ghostty-org/ghostty" repo = "https://github.com/ghostty-org/ghostty"
# Read our sign_update output # Read our sign_update output
@ -83,7 +84,7 @@ elem.text = "12.0.0"
elem = ET.SubElement(item, "description") elem = ET.SubElement(item, "description")
elem.text = f""" elem.text = f"""
<p> <p>
Automated build from commit <code><a href="{repo}/commits/{commit}">{commit}</a></code> Automated build from commit <code><a href="{repo}/commits/{commit_long}">{commit}</a></code>
on {now.strftime('%Y-%m-%d')}. on {now.strftime('%Y-%m-%d')}.
</p> </p>
<p> <p>
@ -93,7 +94,7 @@ commit history <a href="{repo}">on GitHub</a> for all changes.
</p> </p>
""" """
elem = ET.SubElement(item, "enclosure") elem = ET.SubElement(item, "enclosure")
elem.set("url", f"https://tip.files.ghostty.dev/{build}/ghostty-macos-universal.zip") elem.set("url", f"https://tip.files.ghostty.dev/{commit_long}/ghostty-macos-universal.zip")
elem.set("type", "application/octet-stream") elem.set("type", "application/octet-stream")
for key, value in attrs.items(): for key, value in attrs.items():
elem.set(key, value) elem.set(key, value)

View File

@ -770,6 +770,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;