[Electron] macOS ์ฑ ๋น๋ ์ "์ฑ์ด ์์๋์์ต๋๋ค" ์ค๋ฅ ํด๊ฒฐ๊ธฐ (electron-builder 26.15.0+ ๋์)
Electron ์ฑ์ ๊ฐ๋ฐํ๊ณ ย electron-builder๋ฅผ ์ฌ์ฉํ์ฌ macOS ํจํค์ง(dmg)์ ์ํํ ํ, ๋ค๋ฅธ ์ปดํจํฐ๋ ๋ค์ด๋ก๋ ๊ฒฝ๋ก๋ฅผ ํตํด ์ค์นํ์ ๋ ์๋์ ๊ฐ์ด ์ฑ์ด ์์๋์๋ค๋ฉฐ ์คํ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
โย "TistoryEditor.app"์ด ์์๋์๊ธฐ ๋๋ฌธ์ ์ด ์ ์์ต๋๋ค. ํด์งํต์ผ๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
๋ก์ปฌ์์ ๊ฐ๋ฐํ๊ณ ๋น๋ํ ๋ฐ์ด๋๋ฆฌ๋ ์ ์์ ์ผ๋ก ์คํ๋๋๋ฐ, ๋ฐฐํฌ์ฉ ๋น๋(์: GitHub Actions ๋น๋ ์ํฐํฉํธ)๋ง ์ ๋
์์๋์๋ค๊ณ ๋์ค๋ ์ด ๊ธฐ์ดํ ํ์์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณต์ ํฉ๋๋ค.
1. ํ์ ๋ถ์ ๋ฐ ์๋ฌ ๋ก๊ทธ
์ค์น๋ ์ฑ ๋ฒ๋ค์ ์ฝ๋ ์๋ช
์ํ๋ฅผ ํฐ๋ฏธ๋์์ ๊ฒ์ฆํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์น๋ช
์ ์ธ ์๋ช
๋ฆฌ์์ค ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
$ codesign -vvv --deep --strict /Applications/YourApp.app
/Applications/YourApp.app: code has no resources but signature indicates they must be present
์ด ์ค๋ฅ๋ **"์๋ช
์ด ์กด์ฌํด์ผ ํ๋ค๊ณ ์ง์ํ๋๋ฐ ์ค์ ๋ด๋ถ ๋ฆฌ์์ค์ ์๋ช
๋ฐ์ดํฐ๊ฐ ์ผ์นํ์ง ์๊ฑฐ๋ ๋๋ฝ๋์๋ค"**๋ ๋ป์
๋๋ค.
2. ์ ๋ฐ์ํ๋๊ฐ? (์์ธ ๋ถ์)
โ ์์ธ ์ ๊ณต: electron-builder v26.15.0 ์
๋ฐ์ดํธ
electron-builderย ๋ฒ์ 26.8.x ๋์ญ์์๋ ๋ณ๋์ ์ต์
์์ด๋ ad-hoc(์์) ์๋ช
์ด ์๋ฌต์ ์ผ๋ก ์ ์ฒ๋ฆฌ๋์ด ์ค๋ฅ ์์ด ๋์ํ์์ต๋๋ค.
๊ทธ๋ฌ๋ย electron-builder v26.15.0ย ํจ์น(PR #9822)์์ macOS์ ์ฝ๋ ์๋ช
๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์
๋์์ต๋๋ค.
์ธ์ฆ์๊ฐ ๊ฐ์ง๋์ง ์์ ๊ฒฝ์ฐ ์๋ช
๊ณผ์ ์ ์๋ ๊ฑด๋๋ฐ๋๋ก ์ฒ๋ฆฌย (fix(mac): skip signing when no certificate found)
Ad-hoc ์์ ์๋ช
์ย hardenedRuntimeย ํ์ฑํ ์ํ์ ๋ํ ๊ฒฝ๊ณ ์ถ๊ฐย (warn on ad-hoc + hardenedRuntime)
โก ์๋ช
์คํต(Skip)๊ณผ ์๋ณธ ์๋ช
์ ์ถฉ๋
GitHub Actions ๋ฑ Apple ๊ฐ๋ฐ์ ์ธ์ฆ์๊ฐ ๋ฑ๋ก๋์ด ์์ง ์์ ํด๋ฆฐ ๋น๋ ํ๊ฒฝ์์ ํจํค์ง์ ์ํํ ๋,ย electron-builder๋ ์ ํจํ ์ธ์ฆ์๊ฐ ์๋ค๊ณ ํ๋จํ์ฌย ์๋ช
๋จ๊ณ ์์ฒด๋ฅผ ํต์งธ๋ก ๊ฑด๋๋๋๋ค(skipped).
๋ฌธ์ ๋ Electron ์๋ณธ ๋ฐฐํฌ ๋ฐ์ด๋๋ฆฌ(npm์ ๋ฐฐํฌ๋ ๋ฒ์ )๊ฐ ์ด๋ฏธ Apple์ ๊ธฐ๋ณธ ์ธ์ฆ์๋ก **์ฌ์ ์๋ช
(Pre-signed)**๋์ด ์๋ค๋ ์ ์
๋๋ค. ๋ฉ์ธ ์ฑ์ ์ด๋ฆ์ด ๋ฐ๋ ์ํ์์ ์ต์ข
์ฝ๋ ์๋ช
๋จ๊ณ๊ฐ ์คํต๋์ด ๋ฒ๋ฆฌ๋, ๊นจ์ง ์๋ณธ ์๋ช
ํ์ (_CodeSignatureย ํด๋ ๋ฑ)๋ง ์ฑ ๋ฒ๋ค ๋ด๋ถ์ ํผ์๋ ์ฑ ๊ทธ๋๋ก ๋ฐฉ์น๋๊ฒ ๋ฉ๋๋ค. ์ด๋ก ์ธํด macOS ๊ฒ์ดํธํคํผ๊ฐ ๊ฒ์ฆ ๋จ๊ณ์์ ์ฑ์ย ์์๋ ์ํ๋ก ๋์ธ์ฐ์ด ์คํ์ ์์ ํ ์ฐจ๋จํ ๊ฒ์
๋๋ค.
โข Hardened Runtime(๊ฐํ๋ ๋ฐํ์)๊ณผ์ ์ถฉ๋
์ค๋ น ์์ ์๋ช
์ ์๋ํ๋๋ผ๋,ย electron-builder๋ macOS ๋น๋ ์ ๊ธฐ๋ณธ์ ์ผ๋กย hardenedRuntime: true๋ฅผ ๊ฐ์ ํฉ๋๋ค. ์์ ์๋ช
์๋ Apple Team ID๊ฐ ํฌํจ๋์ง ์๋๋ฐ, ๊ฐํ๋ ๋ฐํ์์ด ๋์ํ๋ฉด macOS๊ฐ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Team ID ์ผ์น๋ฅผ ๊ฒ์ฆ(Library Validation)ํ๋ฏ๋กย Team ID Mismatch๋ก ์ธํด ์ฑ์ด ์คํ ์ฆ์ ํฌ๋์๋ก ์ค๋จ๋ฉ๋๋ค.
3. ํด๊ฒฐ ๋ฐฉ๋ฒ (electron-builder ์ค์ )
์ ์ ์ ํ ๊ฐ๋ฐ์ ๊ณ์ (์ฐ $99)์ผ๋ก ์๋ช
๋ฐ ๊ณต์ฆ(Notarization)์ ์ฐ๋ํ์ง ์๊ณ ,ย ๋ฌด๋ฃ ์์ ์๋ช
(Ad-hoc) ๋ฐฐํฌ๋ฅผ ์ ์งํ๊ธฐ ์ํด์๋ ๋ค์ 3๊ฐ์ง ํต์ฌ ์ค์ ์ ์กฐํฉํ์ฌย electron-builder.yml์ ์์ ํด์ผ ํฉ๋๋ค.
electron-builder.ymlย (๋๋ย package.jsonย ๋ดย buildย ์ต์
)์ย macย ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํฉ๋๋ค.
mac:
target: dmg
category: public.app-category.utilities
# 1. ์๋ช
์คํต์ ๋ฐฉ์งํ๊ณ ๊ฐ์ ๋ก ๋ชจ๋ ์์์ ad-hoc ์์ ์๋ช
์ ์ฉ
identity: "-"
# 2. ์์ ์๋ช
์ํ์์ Team ID ๋ถ์ผ์น๋ก ์ธํ ์คํ ํฌ๋์(Gatekeeper ์ฐจ๋จ) ๋ฐฉ์ง
hardenedRuntime: false
# 3. ๋น๋ ๊ณผ์ ์์ ์ ์ ๊ณต์ฆ ์ฌ๋ถ ๊ฒ์ฆ ์คํจ๋ก ์ธํด ๋น๋๊ฐ ์ค๋จ๋๋ ํ์ ๋ฐฉ์ง
gatekeeperAssess: false
identity: "-": ์ธ์ฆ์๊ฐ ์์ด๋ ์๋ช
์ ๊ฑด๋๋ฐ์ง ์๊ณ ,ย codesign --sign - --forceย ๋ช
๋ น์ ํตํด ๋ชจ๋ ์๋ธ ํ๋ ์์ํฌ์ ๋ฆฌ์์ค์ ์๋ช
์ ad-hoc ์ฌ์์ผ๋ก ๋ฎ์ด์์ ๊ฐฑ์ (Overwriting)ํด ์ค๋๋ค. (codesign ์๋ฌ ์๋ฒฝ ํด๊ฒฐ)
hardenedRuntime: false: ad-hoc ์๋ช
์์๋ ๋ฐ๋์ ํ์์ด๋ฉฐ, ๋ฉ์ธ ์ฑ๊ณผ Electron Framework ๊ฐ์ Team ID ๋ถ์ผ์น ๊ฒ์ฆ ์ ์ฐจ๋ฅผ ์ฐํํ๋๋ก ๋ง๋ญ๋๋ค.
gatekeeperAssess: false: ๋น๋ ๋์ค ๋น๋ ํด์ด ๋ก์ปฌ์์ย spctl --assessย ๊ฒ์ฆ์ ์ํํ์ฌ ์๋ฌ๋ฅผ ๋์ง๊ณ ๋น๋๋ฅผ ์์ ์คํจ์ํค๋ ๋์์ ๋นํ์ฑํํฉ๋๋ค.
์์ 3๊ฐ์ง ์ค์ ์ ๋ฐ์ํ์ฌ ๋น๋ํ ํ ํฐ๋ฏธ๋์์ ์ฝ๋ ์๋ช
์ํ๋ฅผ ์ฌ๊ฒ์ฆํด ๋ณด๋ฉด, ์ด์ ์ ๋ฆฌ์์ค ์์ ์๋ฌ๊ฐ ์์ ํ ์ฌ๋ผ์ง๊ณ ๋์คํฌ ์์์ ์์ ํ ์๋ช
์ํ๋ก ์ ์ ํต๊ณผํจ์ ํ์ธํ ์ ์์ต๋๋ค.
$ codesign -vvv --deep --strict dist/mac-arm64/YourApp.app
/dist/mac-arm64/YourApp.app: valid on disk
/dist/mac-arm64/YourApp.app: satisfies its Designated Requirement
์ดํ ๊นํ๋ธ ์ก์
๋ฑ CI ์๋ฒ์์ ๋ฐฐํฌ๋ ์๋ก์ดย .dmgย ํ์ผ์ ๋ด๋ ค๋ฐ์ ์ค์นํด๋ณด๋ฉดย "์์๋์์ต๋๋ค"ย ๋ผ๋ ์๋ด ์์ด ์ ์์ ์ผ๋ก ์ ์คํ๋ฉ๋๋ค. (์ ์ ์๋ช
๋ ์ฑ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ต์ด ์คํ ์์๋ ๋ง์ฐ์ค ์ฐํด๋ฆญ -> ์ด๊ธฐ ๋ฑ์ ํตํด ๊ฒ์ดํธํคํผ๋ฅผ ํ ๋ฒ ์น์ธํด ์ฃผ๋ ์ผ๋ฐ์ ์ธ ad-hoc ์คํ ์ ์ฐจ๋ง ๊ฑฐ์น๋ฉด ๋ฉ๋๋ค.)