[Chore] Notarize macos app (#8849)

* chore: move to @electron/notarize, last package's deprecated

* chore: use notarytool instead legacy altool

* feat: centralizes notarization dependency

Moves the `@electron/notarize` dependency from individual app packages to the root package.json.  This centralizes the dependency and corrects a conditional check in the notarization script that prevented notarization from occurring.

* fix: updates desktop timer app ID

Updates the app ID to `com.ever.gauzydesktoptimer` and removes the unnecessary `@electron/notarize` dependency.  This resolves notarization issues and streamlines the build process.

* feat: adds Apple credentials to CI workflows

Adds `APPLE_ID`, `APPLE_ID_APP_PASSWORD`, and `APPLE_TEAM_ID` secrets to the following CI workflows:

- `desktop-app-prod.yml`
- `desktop-app-stage.yml`
- `desktop-timer-app-prod.yml`
- `desktop-timer-app-stage.yml`
- `server-api-prod.yml`
- `server-api-stage.yml`
- `server-prod.yml`
- `server-stage.yml`

This allows workflows to access Apple services for functionalities such as code signing and distribution.

* fix: cspell spelling
This commit is contained in:
Kifungo A
2025-03-10 21:28:58 +01:00
committed by GitHub
parent 5ed535d4e1
commit 3df287898a
16 changed files with 2224 additions and 1799 deletions
+2 -1
View File
@@ -555,7 +555,8 @@
"INPM",
"ɵcmp",
"ɵmod",
"ɵcreate"
"ɵcreate",
"notarytool"
],
"useGitignore": true,
"ignorePaths": [
+3
View File
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
+3
View File
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
+3
View File
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
+3
View File
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
+3
View File
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
+3
View File
@@ -139,6 +139,9 @@ jobs:
DO_KEY_ID: ${{ secrets.DO_KEY_ID }}
DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }}
NX_NO_CLOUD: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_APP_PASSWORD: ${{ secrets.APPLE_ID_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
release-windows:
runs-on: ${{ matrix.os }}
-1
View File
@@ -65,7 +65,6 @@
"consolidate": "^0.16.0",
"custom-electron-titlebar": "^4.2.8",
"electron-log": "^4.4.8",
"electron-notarize": "^1.2.2",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"electron-util": "^0.18.1",
+176 -176
View File
@@ -1,177 +1,177 @@
{
"name": "gauzy-desktop-timer",
"productName": "Gauzy Desktop Timer",
"version": "0.1.0",
"description": "Gauzy Desktop Timer",
"license": "AGPL-3.0",
"homepage": "https://gauzy.co",
"repository": {
"type": "git",
"url": "https://github.com/ever-co/ever-gauzy.git"
},
"bugs": {
"url": "https://github.com/ever-co/ever-gauzy/issues"
},
"private": true,
"author": {
"name": "Ever Co. LTD",
"email": "ever@ever.co",
"url": "https://ever.co"
},
"main": "index.js",
"workspaces": {
"packages": [
"../../../dist/packages/contracts",
"../../../dist/packages/desktop-core",
"../../../dist/packages/desktop-lib",
"../../../dist/packages/desktop-window",
"../../../dist/packages/ui-config",
"../../../dist/packages/constants"
]
},
"build": {
"appId": "com.ever.gauzydesktoptimer",
"artifactName": "${name}-${version}.${ext}",
"productName": "Gauzy Desktop Timer",
"copyright": "Copyright © 2019-Present. Ever Co. LTD",
"afterSign": "tools/notarize.js",
"dmg": {
"sign": false
},
"asar": true,
"npmRebuild": true,
"asarUnpack": [
"node_modules/screenshot-desktop/lib/win32",
"node_modules/@sentry/electron",
"node_modules/better-sqlite3",
"node_modules/@sentry/profiling-node/lib"
],
"directories": {
"buildResources": "icons",
"output": "../desktop-timer-packages"
},
"publish": [
{
"provider": "github",
"repo": "ever-gauzy-desktop-timer",
"releaseType": "release"
},
{
"provider": "spaces",
"name": "ever",
"region": "sfo3",
"path": "/ever-gauzy-desktop-timer",
"acl": "public-read"
}
],
"mac": {
"category": "public.app-category.developer-tools",
"icon": "icon.icns",
"target": [
"zip",
"dmg"
],
"asarUnpack": "**/*.node",
"artifactName": "${name}-${version}.${ext}",
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "tools/build/entitlements.mas.plist",
"entitlementsInherit": "tools/build/entitlements.mas.plist",
"extendInfo": {
"NSAppleEventsUsageDescription": "Please allow access to script browser applications to detect the current URL when triggering instant lookup.",
"NSCameraUsageDescription": "Please allow access to Gauzy Desktop Timer to make screenshot"
}
},
"win": {
"publisherName": "Ever",
"target": [
{
"target": "nsis",
"arch": [
"x64"
]
}
],
"icon": "icon.ico",
"verifyUpdateCodeSignature": false
},
"linux": {
"icon": "linux",
"target": [
"AppImage",
"deb",
"tar.gz"
],
"executableName": "gauzy-desktop-timer",
"artifactName": "${name}-${version}.${ext}",
"synopsis": "Desktop",
"category": "Development"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"allowToChangeInstallationDirectory": true,
"allowElevation": true,
"installerIcon": "icon.ico",
"artifactName": "${name}-${version}.${ext}",
"deleteAppDataOnUninstall": true,
"menuCategory": true
},
"extraResources": [
"./data/**/*",
"databaseDir",
{
"from": "assets",
"to": "assets"
}
],
"extraFiles": [
"./**/desktop-lib/**/migrations/*"
]
},
"dependencies": {
"@datorama/akita": "^8.0.1",
"@datorama/akita-ngdevtools": "^7.0.0",
"@electron/remote": "^2.0.8",
"@gauzy/contracts": "file:../../../dist/packages/contracts",
"@gauzy/desktop-core": "file:../../../dist/packages/desktop-core",
"@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib",
"@gauzy/desktop-window": "file:../../../dist/packages/desktop-window",
"@gauzy/ui-config": "file:../../../dist/packages/ui-config",
"@gauzy/constants": "file:../../../dist/packages/constants",
"@sentry/electron": "^4.18.0",
"@sentry/profiling-node": "^7.101.1",
"@sentry/replay": "^7.101.1",
"@sentry/node": "^7.101.1",
"@sentry/tracing": "^7.101.1",
"@sentry/types": "^7.101.1",
"auto-launch": "5.0.5",
"consolidate": "^0.16.0",
"electron-log": "^4.4.8",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"electron-util": "^0.18.1",
"embedded-queue": "^0.0.11",
"form-data": "^4.0.1",
"htmlparser2": "^8.0.2",
"knex": "^3.1.0",
"libsql": "^0.3.16",
"moment": "^2.30.1",
"node-fetch": "^2.6.7",
"node-notifier": "^8.0.0",
"mysql2": "^3.12.0",
"pg": "^8.13.1",
"pg-query-stream": "^4.7.1",
"screenshot-desktop": "^1.15.0",
"sound-play": "1.1.0",
"squirrelly": "^8.0.8",
"tslib": "^2.6.2",
"twing": "^5.0.2",
"locutus": "^2.0.30",
"underscore": "^1.13.3",
"undici": "^6.10.2",
"custom-electron-titlebar": "^4.2.8"
}
}
"name": "gauzy-desktop-timer",
"productName": "Gauzy Desktop Timer",
"version": "0.1.0",
"description": "Gauzy Desktop Timer",
"license": "AGPL-3.0",
"homepage": "https://gauzy.co",
"repository": {
"type": "git",
"url": "https://github.com/ever-co/ever-gauzy.git"
},
"bugs": {
"url": "https://github.com/ever-co/ever-gauzy/issues"
},
"private": true,
"author": {
"name": "Ever Co. LTD",
"email": "ever@ever.co",
"url": "https://ever.co"
},
"main": "index.js",
"workspaces": {
"packages": [
"../../../dist/packages/contracts",
"../../../dist/packages/desktop-core",
"../../../dist/packages/desktop-lib",
"../../../dist/packages/desktop-window",
"../../../dist/packages/ui-config",
"../../../dist/packages/constants"
]
},
"build": {
"appId": "com.ever.gauzydesktoptimer",
"artifactName": "${name}-${version}.${ext}",
"productName": "Gauzy Desktop Timer",
"copyright": "Copyright © 2019-Present. Ever Co. LTD",
"afterSign": "tools/notarize.js",
"dmg": {
"sign": false
},
"asar": true,
"npmRebuild": true,
"asarUnpack": [
"node_modules/screenshot-desktop/lib/win32",
"node_modules/@sentry/electron",
"node_modules/better-sqlite3",
"node_modules/@sentry/profiling-node/lib"
],
"directories": {
"buildResources": "icons",
"output": "../desktop-timer-packages"
},
"publish": [
{
"provider": "github",
"repo": "ever-gauzy-desktop-timer",
"releaseType": "release"
},
{
"provider": "spaces",
"name": "ever",
"region": "sfo3",
"path": "/ever-gauzy-desktop-timer",
"acl": "public-read"
}
],
"mac": {
"category": "public.app-category.developer-tools",
"icon": "icon.icns",
"target": [
"zip",
"dmg"
],
"asarUnpack": "**/*.node",
"artifactName": "${name}-${version}.${ext}",
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "tools/build/entitlements.mas.plist",
"entitlementsInherit": "tools/build/entitlements.mas.plist",
"extendInfo": {
"NSAppleEventsUsageDescription": "Please allow access to script browser applications to detect the current URL when triggering instant lookup.",
"NSCameraUsageDescription": "Please allow access to Gauzy Desktop Timer to make screenshot"
}
},
"win": {
"publisherName": "Ever",
"target": [
{
"target": "nsis",
"arch": [
"x64"
]
}
],
"icon": "icon.ico",
"verifyUpdateCodeSignature": false
},
"linux": {
"icon": "linux",
"target": [
"AppImage",
"deb",
"tar.gz"
],
"executableName": "gauzy-desktop-timer",
"artifactName": "${name}-${version}.${ext}",
"synopsis": "Desktop",
"category": "Development"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"allowToChangeInstallationDirectory": true,
"allowElevation": true,
"installerIcon": "icon.ico",
"artifactName": "${name}-${version}.${ext}",
"deleteAppDataOnUninstall": true,
"menuCategory": true
},
"extraResources": [
"./data/**/*",
"databaseDir",
{
"from": "assets",
"to": "assets"
}
],
"extraFiles": [
"./**/desktop-lib/**/migrations/*"
]
},
"dependencies": {
"@datorama/akita": "^8.0.1",
"@datorama/akita-ngdevtools": "^7.0.0",
"@electron/remote": "^2.0.8",
"@gauzy/contracts": "file:../../../dist/packages/contracts",
"@gauzy/desktop-core": "file:../../../dist/packages/desktop-core",
"@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib",
"@gauzy/desktop-window": "file:../../../dist/packages/desktop-window",
"@gauzy/ui-config": "file:../../../dist/packages/ui-config",
"@gauzy/constants": "file:../../../dist/packages/constants",
"@sentry/electron": "^4.18.0",
"@sentry/profiling-node": "^7.101.1",
"@sentry/replay": "^7.101.1",
"@sentry/node": "^7.101.1",
"@sentry/tracing": "^7.101.1",
"@sentry/types": "^7.101.1",
"auto-launch": "5.0.5",
"consolidate": "^0.16.0",
"electron-log": "^4.4.8",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"electron-util": "^0.18.1",
"embedded-queue": "^0.0.11",
"form-data": "^4.0.1",
"htmlparser2": "^8.0.2",
"knex": "^3.1.0",
"libsql": "^0.3.16",
"moment": "^2.30.1",
"node-fetch": "^2.6.7",
"node-notifier": "^8.0.0",
"mysql2": "^3.12.0",
"pg": "^8.13.1",
"pg-query-stream": "^4.7.1",
"screenshot-desktop": "^1.15.0",
"sound-play": "1.1.0",
"squirrelly": "^8.0.8",
"tslib": "^2.6.2",
"twing": "^5.0.2",
"locutus": "^2.0.30",
"underscore": "^1.13.3",
"undici": "^6.10.2",
"custom-electron-titlebar": "^4.2.8"
}
}
-1
View File
@@ -66,7 +66,6 @@
"auto-launch": "5.0.5",
"consolidate": "^0.16.0",
"electron-log": "^4.4.8",
"electron-notarize": "^1.2.2",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"electron-util": "^0.18.1",
-1
View File
@@ -62,7 +62,6 @@
"auto-launch": "5.0.5",
"consolidate": "^0.16.0",
"electron-log": "^4.4.8",
"electron-notarize": "^1.2.2",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"electron-util": "^0.18.1",
+1
View File
@@ -455,6 +455,7 @@
"@compodoc/compodoc": "^1.1.19",
"@cypress/browserify-preprocessor": "^3.0.2",
"@electron/remote": "^2.0.8",
"@electron/notarize": "^2.5.0",
"@nestjs/schematics": "^10.2.3",
"@nestjs/testing": "^10.4.15",
"@nstudio/angular": "^20.0.3",
+16 -9
View File
@@ -1,4 +1,4 @@
const { notarize } = require('electron-notarize');
const { notarize } = require('@electron/notarize');
require('dotenv').config();
exports.default = async (context) => {
@@ -10,10 +10,11 @@ exports.default = async (context) => {
}
} = context;
const { APPLE_ID, APPLE_ID_APP_PASSWORD, CSC_LINK } = process.env;
const { APPLE_ID, APPLE_ID_APP_PASSWORD, APPLE_TEAM_ID, CSC_LINK } = process.env;
const appPath = `${appOutDir}/${appName}.app`;
if (
electronPlatformName !== 'darwin' ||
electronPlatformName !== 'darwin' &&
// If `CSC_LINK` is not defined, the app hasn't been signed before by electron-builder.
!CSC_LINK
) {
@@ -24,10 +25,16 @@ exports.default = async (context) => {
throw new Error('`APPLE_ID` or `APPLE_ID_APP_PASSWORD` is missing');
}
await notarize({
appBundleId,
appPath: `${appOutDir}/${appName}.app`,
appleId: APPLE_ID,
appleIdPassword: APPLE_ID_APP_PASSWORD
});
try {
await notarize({
tool: 'notarytool',
appleId: APPLE_ID,
appleIdPassword: APPLE_ID_APP_PASSWORD,
teamId: APPLE_TEAM_ID,
appBundleId,
appPath
});
} catch (error) {
console.error(`ERROR: Failed to notarized: ${error}`);
}
};
+2005 -1610
View File
File diff suppressed because it is too large Load Diff