From c1dfc6e06921f3d492af0652393689c18ee63cc3 Mon Sep 17 00:00:00 2001 From: Nik Shevchenko Date: Tue, 24 Mar 2026 16:23:01 -0400 Subject: [PATCH] fix: switch DMG creation to dmgbuild for arrow background in CI create-dmg with --skip-jenkins silently skips all Finder styling. dmgbuild writes .DS_Store directly without Finder/AppleScript. Dark omi-style background with white arrow and install text. Co-Authored-By: Claude Opus 4.6 (1M context) --- codemagic.yaml | 65 ++++++++---------------- desktop/dmg-assets/background.png | Bin 4214 -> 3629 bytes desktop/dmg-assets/dmgbuild_settings.py | 51 +++++++++++++++++++ 3 files changed, 72 insertions(+), 44 deletions(-) create mode 100644 desktop/dmg-assets/dmgbuild_settings.py diff --git a/codemagic.yaml b/codemagic.yaml index f61e60522f4..0c58db6518c 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -1471,35 +1471,23 @@ workflows: xcrun stapler staple "$APP_PATH" - - name: Install create-dmg - script: | - brew install create-dmg - - name: Create DMG installer script: | set -e + pip3 install --break-system-packages dmgbuild APP_PATH=$(find $(pwd)/build/macos -name "Omi.app" -type d | head -1) mkdir -p build/macos/dmg - DMG_NAME="Omi.dmg" - DMG_PATH="build/macos/dmg/${DMG_NAME}" - - # Create professional DMG with Applications folder shortcut - # Use --skip-jenkins to avoid AppleScript timeout issues in CI - create-dmg \ - --volname "Omi ${VERSION}" \ - --volicon "$APP_PATH/Contents/Resources/prodAppIcon.icns" \ - --window-pos 200 120 \ - --window-size 660 400 \ - --icon-size 130 \ - --text-size 16 \ - --icon "Omi.app" 180 180 \ - --hide-extension "Omi.app" \ - --app-drop-link 480 180 \ - --no-internet-enable \ - --skip-jenkins \ - "$DMG_PATH" \ - "$APP_PATH" + DMG_PATH="build/macos/dmg/Omi.dmg" + + # Use dmgbuild instead of create-dmg — writes .DS_Store directly + # without Finder/AppleScript (which hangs in CI with --skip-jenkins) + dmgbuild -s ../desktop/dmg-assets/dmgbuild_settings.py \ + -D app_path="$APP_PATH" \ + -D app_name=Omi \ + -D assets_dir="$(pwd)/../desktop/dmg-assets" \ + "Omi ${VERSION}" \ + "$DMG_PATH" # Sign DMG codesign --force --sign "$DEVELOPER_ID_CERT" "$DMG_PATH" @@ -2295,13 +2283,11 @@ workflows: xcrun stapler staple "$APP_BUNDLE" echo "App stapled" - - name: Install create-dmg - script: | - brew install create-dmg || true - - name: Create DMG installer script: | set -e + pip3 install --break-system-packages dmgbuild + STAGING_DIR="/tmp/omi-dmg-staging-$$" mkdir -p "$STAGING_DIR" # Use ditto to preserve the notarization staple ticket (cp -R drops it) @@ -2310,23 +2296,14 @@ workflows: xcrun stapler validate "$STAGING_DIR/$APP_NAME.app" 2>/dev/null || \ xcrun stapler staple "$STAGING_DIR/$APP_NAME.app" - BG_ARGS="" - [ -f "dmg-assets/background.png" ] && BG_ARGS="--background dmg-assets/background.png" - - create-dmg \ - --volname "$APP_NAME" \ - --volicon "$STAGING_DIR/$APP_NAME.app/Contents/Resources/OmiIcon.icns" \ - --window-pos 200 120 \ - --window-size 610 365 \ - --icon-size 80 \ - --icon "$APP_NAME.app" 155 175 \ - --hide-extension "$APP_NAME.app" \ - --app-drop-link 455 175 \ - --no-internet-enable \ - --skip-jenkins \ - $BG_ARGS \ - "$DMG_PATH" \ - "$STAGING_DIR/$APP_NAME.app" + # Use dmgbuild instead of create-dmg — writes .DS_Store directly + # without Finder/AppleScript (which hangs in CI with --skip-jenkins) + dmgbuild -s dmg-assets/dmgbuild_settings.py \ + -D app_path="$STAGING_DIR/$APP_NAME.app" \ + -D app_name="$APP_NAME" \ + -D assets_dir="$(pwd)/dmg-assets" \ + "$APP_NAME" \ + "$DMG_PATH" rm -rf "$STAGING_DIR" echo "DMG created" diff --git a/desktop/dmg-assets/background.png b/desktop/dmg-assets/background.png index 9022ad0a7a57399acd0006a8e2949637f745c760..97d81832ddaa0167ad2f7118dcdbc798aca08f06 100644 GIT binary patch literal 3629 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 DEvqOq literal 4214 zcmc&&doENe(J!IA%mM@;Y7@ zA$esyhLAVO`#Ik4F%2=y^KPwm)?Mq~`^UL=t$WVzpIK{vziaRB{(L{5&)$2U*;t#2 ziO7mTAP_P5r3oqeX?$>zcmuon zW3RDPzognhoSanLr|h0j%bmd~Gc%*%h|u$0VO35>Nqz-A>(w+~^FX+&}1Js`1wE2sE zgPl52aPF0@Z8hLjJVxPhVGS6jtVIp`(uHp5JPUjm!*u3)CjW9NvhB zrye_T`~_So)EuN9B?_K=YHRD}BKh}I=J1PP)+rD)0l|zoyKg}-&enDh%*4cGc3jxY z(NMS|7a4MS`NU<@tAse5=~VFfSpvM(M3Lc@cCs0ICp9*(%SH{%B_2}w+bQrXYYtxo z>srO(B?<7<))U7wp#`MU}H4DZa$$W?F|dL^URL-1E zSXdYwzcN%jKX1g}ejhGM4Q7s|o5eU)1^Tq$k0&K11&sQbm0+f)ro!xU-kwX8F!=H@DPa6z;}LzZ>f1YQdiwg9 zM~}Yw=9`-B4zx6StQ<`(LygFXY)vAJxL*)hR!`N#b#2tJf1ef7f8k@=PfgJVtc4w5 zg85t~HE{2v#oLm+Yg)z{Cv~Zb$*jJ(v@t$Udk&Re=veNa^#2` zsb+K7Lls%TSwvvqhLA;`fRm zzlzUe16mWHi*z~_wDGx=>f51}rM^5s^qmbtTbi4jF@RPRVG`pZY?`Rd>Cu{C_Eck( ztNcBG|B}ke%HrbUiVEGtj)LpOce$($K(y|4u=CX#_9~f7j*pL*FyeR*1CI5J$!YiY z_JY=p2T+5@#>PN{kz)sG_GV^getv!^6fIuOK~`4QI{BP#{iv%!-Q3)qnnPJ{e}7p? zNl9s`*xtQRxG#^hT~}9Exk}C}E88p^@mgM4ITy_OGB`L0cB^ye%d)}2GXXAm*x&Q= z*IZ5~sD_+pc;{Wsmz9%abJn{G z$&0?(h?Ha!$sL7KOZMd*Mr$&!Bi;nY0by~@cBPP4R#!WzC=@D~wU{k)>e`v*%g1zJ ztPOdQm-^OZTlww6oHciMcad_xiqT4XjsBT4pBrVIZ;<`nZr?t}-vVy=cF2=4?-m@) zZ8r(po=q6?EZcG@=g?wfV~<2!w;f2#_iPdcFG5258bF42E7YpZxxSwAzoF zsDW~x0>z}(YG#81WfN!8@!B$v%(Zfu}N%G44&q?2s|t%3fmtU6*9 z&3r3Hhl*XDvD^(!E5OCxUOS*t3kwS*a-hO*-qh5T$C)>Z!Qna*1HyGaKM@j*h>TQL zR+f{K8_0JE_&ia^2XO*{&=jLU2bKbAEt!`P7Z2GSa;4E|jS_R}`}IONfIW60$`}kL zM#0GN?Ah*tfq<34A`S)hZYk@1uZRv{Y{>)KFqXHTGT)gbr=S2#uyxiK$d7nywUKZ# zB!{Sc?c5`VA+UuzFk(SL0oW8E_-Iu)0HA?UpQh*| zdC0<=O{-dD7+onxyuQA^%aFYix?30!0uUBlB8VEU{e{lXt6YJasaO7)dH`r6aA2V+ z+)Y430@TgjoyB8PjOt&&AUffM0?0n!Pf~yG6Y%#3#+@EbT)9B4T8I0e{09BKfPZ=a z+Gtz#1gb(tKmD=G?ok57oBPL7|Hs$1