Skip to content

Commit

Permalink
feat: Track installation source (#86)
Browse files Browse the repository at this point in the history
  • Loading branch information
cyaiox authored Dec 6, 2024
1 parent ff50643 commit 0f2471a
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 1 deletion.
116 changes: 116 additions & 0 deletions .github/workflows/store-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: Store Release

on:
release:
types:
- published

concurrency:
group: release-${{ github.ref }}
cancel-in-progress: true

defaults:
run:
shell: 'bash'

jobs:
strategy:
fail-fast: true
matrix:
os: [ macos-latest, windows-latest ]
store: [ itch.io ]

runs-on: ${{ matrix.os }}

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true

- name: Set up Node.js
uses: actions/setup-node@v4
with:
cache: 'npm'

- name: Install dependencies
run: npm ci
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1

- name: Get Release Tag
id: release_tag
run: |
echo "RELEASE_TAG=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT
- name: Build Release for ${{ matrix.store }}
run: npm run build
env:
MODE: production
VITE_PROVIDER: ${{ matrix.store }}
# Segment API Key
VITE_SEGMENT_API_KEY: ${{ secrets.SEGMENT_API_KEY }}
# Sentry AUTH Token
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
VITE_SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
# AWS Secrets
VITE_AWS_ACCESS_KEY_ID: ${{ secrets.EXPLORER_TEAM_AWS_ACCESS_KEY_ID }}
VITE_AWS_SECRET_ACCESS_KEY: ${{ secrets.EXPLORER_TEAM_AWS_SECRET_ACCESS_KEY }}
VITE_AWS_DEFAULT_REGION: ${{ secrets.EXPLORER_TEAM_AWS_DEFAULT_REGION }}
VITE_AWS_S3_BUCKET: ${{ secrets.EXPLORER_TEAM_S3_BUCKET }}
VITE_AWS_S3_BUCKET_PUBLIC_URL: ${{ vars.EXPLORER_TEAM_S3_BUCKET_PUBLIC_URL }}

# Download 'SSLcom/esigner-codesign' to a folder called 'esigner-codesign' in the root of the project
- name: Checkout esigner-codesign repository (Windows)
if: ${{ matrix.os == 'windows-latest' }}
uses: actions/checkout@v3
with:
repository: 'SSLcom/esigner-codesign'
path: esigner-codesign

- name: Compile artifacts and upload them to S3
# I use this action because it is capable of retrying multiple times if there are any issues with the distribution server
uses: nick-fields/retry@v3
with:
timeout_minutes: 15
max_attempts: 6
retry_wait_seconds: 15
retry_on: error
shell: 'bash'
command: npx electron-builder --config electron-store-builder.cjs \
-c.extraMetadata.version=${{ steps.release_tag.outputs.release_tag }} \
-c.mac.notarize.teamId=${{ env.APPLE_TEAM_ID }} \
--publish always
env:
# Code Signing params
# See https://www.electron.build/code-signing
CSC_LINK: ${{ secrets.MACOS_CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.MACOS_CSC_KEY_PASSWORD }}
# Notarization params
# See https://www.electron.build/configuration/mac#NotarizeNotaryOptions
APPLE_ID: ${{ secrets.MACOS_NOTARIZATION_APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.MACOS_NOTARIZATION_PWD }}
APPLE_TEAM_ID: ${{ secrets.MACOS_NOTARIZATION_TEAM_ID }}
# Publishing artifacts
RELEASE_TAG: ${{ steps.release_tag.outputs.release_tag }}
GH_TOKEN: ${{ secrets.github_token }} # GitHub token, automatically provided (No need to define this secret in the repo settings)
# The following are the parameters required by the esigner-codesign action to work, we must explicitly pass in even the optional ones since we're not using the action directly, but from the checked out repo
CODE_SIGN_SCRIPT_PATH: "${{ github.workspace }}\\esigner-codesign\\dist\\index.js"
INPUT_COMMAND: "sign"
INPUT_FILE_PATH: "${{ github.workspace }}\\dist\\Decentraland Launcher-win-x64.exe"
INPUT_OVERRIDE: "true"
INPUT_MALWARE_BLOCK: "false"
INPUT_CLEAN_LOGS: "false"
INPUT_JVM_MAX_MEMORY: "1024M"
INPUT_ENVIRONMENT_NAME: "PROD"
INPUT_USERNAME: ${{ secrets.ES_USERNAME }}
INPUT_PASSWORD: ${{ secrets.ES_PASSWORD }}
INPUT_TOTP_SECRET: ${{ secrets.ES_TOTP_SECRET }}
INPUT_CREDENTIAL_ID: ${{ secrets.WINDOWS_CREDENTIAL_ID_SIGNER }}
# S3 Params
PROVIDER: ${{ matrix.store }}
AWS_ACCESS_KEY_ID: ${{ secrets.EXPLORER_TEAM_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.EXPLORER_TEAM_AWS_SECRET_ACCESS_KEY }}
AWS_S3_BUCKET: ${{ secrets.EXPLORER_TEAM_S3_BUCKET }}
AWS_DEFAULT_REGION: ${{ secrets.EXPLORER_TEAM_AWS_DEFAULT_REGION }}
16 changes: 16 additions & 0 deletions electron-store-builder.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const baseConfig = require('./electron-builder.cjs');

const config = {
...baseConfig,
publish: [
{
provider: 's3',
bucket: process.env.AWS_S3_BUCKET,
endpoint: process.env.AWS_ENDPOINT_URL,
region: process.env.AWS_DEFAULT_REGION,
path: `/launcher/${process.env.PROVIDER}/releases/${process.env.RELEASE_TAG}/`,
},
],
};

module.exports = config;
6 changes: 6 additions & 0 deletions packages/main/src/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import JSZip from 'jszip';
import { extract, list } from 'tar';
import semver from 'semver';

const DEFAULT_PROVIDER = 'dcl';

export function getAppVersion(): string {
return app.getVersion();
}
Expand Down Expand Up @@ -165,3 +167,7 @@ export function compareVersions(version1: string, version2: string) {
const result = semver.compare(version1, version2);
return result > 0;
}

export function getProvider() {
return import.meta.env.VITE_PROVIDER || DEFAULT_PROVIDER;
}
4 changes: 3 additions & 1 deletion packages/main/src/modules/ipc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
getBucketURL,
RELEASE_PREFIX,
} from '#shared';
import { getAppBasePath, decompressFile, getOSName, isAppUpdated, PLATFORM, getAppVersion } from '../helpers';
import { getAppBasePath, decompressFile, getOSName, isAppUpdated, PLATFORM, getAppVersion, getProvider } from '../helpers';
import { getUserId } from './config';

const EXPLORER_PATH = join(getAppBasePath(), 'Explorer');
Expand Down Expand Up @@ -220,6 +220,8 @@ export async function launchExplorer(event: Electron.IpcMainInvokeEvent, version
analytics.getAnonymousId(),
'--session_id',
analytics.getSessionId(),
'--provider',
getProvider(),
].filter(arg => !!arg);
log.info('[Main Window][IPC][LaunchExplorer] Opening the Explorer', explorerParams);
spawn(explorerBinPath, explorerParams, { cwd: explorerBinDir, detached: true, stdio: 'ignore' })
Expand Down

0 comments on commit 0f2471a

Please sign in to comment.