-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Electron app setup and release workflow #403
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,53 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: electron-build | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
on: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
push: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
tags: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- "v*" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
jobs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
release: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
runs-on: ${{ matrix.os }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
strategy: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
matrix: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
os: [macos-latest, ubuntu-latest, windows-latest] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
node-version: [18.x] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
defaults: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
run: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
working-directory: ./native | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Check out Git repository | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Install Node.js | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
uses: actions/setup-node@v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
node-version: ${{ matrix.node-version }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Set up pnpm | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
uses: pnpm/action-setup@v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Install Dependencies | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
run: pnpm install --no-frozen-lockfile | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Build Electron App | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
run: pnpm run build | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Build and publish | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
env: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
pnpm run electron-builder --publish always | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+34
to
+42
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling and build verification. The build steps should include error handling and verification of outputs. - name: Build Electron App
- run: pnpm run build
+ run: |
+ pnpm run build
+ if [ $? -ne 0 ]; then
+ echo "Build failed"
+ exit 1
+ fi
+ # Verify build outputs
+ if [ ! -d "dist" ]; then
+ echo "Build directory not found"
+ exit 1
+ fi 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Upload Release Assets | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
uses: softprops/action-gh-release@v1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
files: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
./release/**/*.exe | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
./release/**/*.dmg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
./release/**/*.AppImage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
./release/**/*.yml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
./release/latest*.yml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
env: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,63 @@ | ||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||
"name": "@codepair/native", | ||||||||||||||||||||||||||||||||||
"version": "1.0.1", | ||||||||||||||||||||||||||||||||||
"main": "dist/main.js", | ||||||||||||||||||||||||||||||||||
"description": "Codepair Native", | ||||||||||||||||||||||||||||||||||
"author": "yorkie-team", | ||||||||||||||||||||||||||||||||||
"repository": { | ||||||||||||||||||||||||||||||||||
"type": "git", | ||||||||||||||||||||||||||||||||||
"url": "https://github.com/minai621/codepair" | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"license": "Apache-2.0", | ||||||||||||||||||||||||||||||||||
Comment on lines
+1
to
+11
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification 🛠️ Refactor suggestion Repository URL needs to be updated to match the official repository The repository URL in package.json should be updated to point to the official yorkie-team repository instead of the personal fork. Based on the git remote information, here's what needs to be changed:
🔗 Analysis chainReview and update repository metadata Several metadata fields need attention:
{
"name": "@codepair/native",
- "version": "1.0.1",
+ "version": "1.0.0",
"main": "dist/main.js",
"description": "Codepair Native",
"author": "yorkie-team",
"repository": {
"type": "git",
- "url": "https://github.com/minai621/codepair"
+ "url": "<main-repository-url>"
}, Let me try another script to get the repository information since the previous command didn't work as expected. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Verify the correct repository URL
gh repo view --json url --jq .url
Length of output: 287 Script: #!/bin/bash
# Try different approaches to get repository info
cat package.json | grep -A 5 "repository"
# Also check if there's a root package.json
cat native/package.json | grep -A 5 "repository"
# Check git remote
git remote -v
Length of output: 366 |
||||||||||||||||||||||||||||||||||
"scripts": { | ||||||||||||||||||||||||||||||||||
"build": "tsc src/main.ts --outDir dist", | ||||||||||||||||||||||||||||||||||
"start": "pnpm run build && cross-env NODE_ENV=production pnpx electron dist/main.js", | ||||||||||||||||||||||||||||||||||
"start:dev": "pnpm run start:codepair:dev && pnpm run build && cross-env NODE_ENV=development pnpx electron dist/main.js", | ||||||||||||||||||||||||||||||||||
"start:codepair:dev": "cd ../frontend && Pnpm run dev & ", | ||||||||||||||||||||||||||||||||||
"electron-builder": "pnpm run build && electron-builder", | ||||||||||||||||||||||||||||||||||
"release": "pnpm run build && electron-builder --publish always" | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
Comment on lines
+12
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix script configuration issues There are several issues in the scripts configuration:
"scripts": {
- "build": "tsc src/main.ts --outDir dist",
+ "build": "tsc -p tsconfig.json",
"start": "pnpm run build && cross-env NODE_ENV=production pnpx electron dist/main.js",
"start:dev": "pnpm run start:codepair:dev && pnpm run build && cross-env NODE_ENV=development pnpx electron dist/main.js",
- "start:codepair:dev": "cd ../frontend && Pnpm run dev & ",
+ "start:codepair:dev": "cd ../frontend && pnpm run dev",
"electron-builder": "pnpm run build && electron-builder",
"release": "pnpm run build && electron-builder --publish always"
}, 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||
"devDependencies": { | ||||||||||||||||||||||||||||||||||
"@types/node": "^22.7.6", | ||||||||||||||||||||||||||||||||||
"cross-env": "^7.0.3", | ||||||||||||||||||||||||||||||||||
"electron": "^33.0.1", | ||||||||||||||||||||||||||||||||||
"electron-builder": "^25.1.8", | ||||||||||||||||||||||||||||||||||
"typescript": "^5.3.3" | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"build": { | ||||||||||||||||||||||||||||||||||
"publish": { | ||||||||||||||||||||||||||||||||||
"provider": "github" | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"appId": "com.example.codepair", | ||||||||||||||||||||||||||||||||||
"productName": "codepair", | ||||||||||||||||||||||||||||||||||
"files": [ | ||||||||||||||||||||||||||||||||||
"dist/**/*", | ||||||||||||||||||||||||||||||||||
"node_modules/**/*", | ||||||||||||||||||||||||||||||||||
"package.json", | ||||||||||||||||||||||||||||||||||
"!node_modules/**/*.{ts,map}" | ||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||
"directories": { | ||||||||||||||||||||||||||||||||||
"output": "release" | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"mac": { | ||||||||||||||||||||||||||||||||||
"target": "dmg" | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"win": { | ||||||||||||||||||||||||||||||||||
"target": [ | ||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||
"target": "nsis", | ||||||||||||||||||||||||||||||||||
"arch": [ | ||||||||||||||||||||||||||||||||||
"x64" | ||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"nsis": { | ||||||||||||||||||||||||||||||||||
"oneClick": false, | ||||||||||||||||||||||||||||||||||
"allowToChangeInstallationDirectory": true | ||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
"linux": { | ||||||||||||||||||||||||||||||||||
"target": "AppImage" | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,30 @@ | ||||||||||||||||||||||||||||||||||||||
import { app, BrowserWindow } from "electron"; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
function createWindow() { | ||||||||||||||||||||||||||||||||||||||
const win = new BrowserWindow({ | ||||||||||||||||||||||||||||||||||||||
width: 800, | ||||||||||||||||||||||||||||||||||||||
height: 600, | ||||||||||||||||||||||||||||||||||||||
webPreferences: { | ||||||||||||||||||||||||||||||||||||||
nodeIntegration: true, | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||
Comment on lines
+4
to
+10
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: Secure the BrowserWindow configuration The current window configuration has security vulnerabilities. Node integration should be disabled by default, and a preload script should be used instead. Apply these security-focused changes: const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
- nodeIntegration: true,
+ nodeIntegration: false,
+ contextIsolation: true,
+ sandbox: true,
+ preload: path.join(__dirname, 'preload.js')
},
});
|
||||||||||||||||||||||||||||||||||||||
if (process.env.NODE_ENV === "development") { | ||||||||||||||||||||||||||||||||||||||
win.loadURL("http://localhost:5173"); | ||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||
win.loadURL("https://codepair.yorkie.dev"); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
Comment on lines
+11
to
+15
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling for URL loading The URL loading lacks error handling and validation. Also, consider adding security headers for the loaded content. Consider this improved implementation: if (process.env.NODE_ENV === "development") {
- win.loadURL("http://localhost:5173");
+ win.loadURL("http://localhost:5173").catch(err => {
+ console.error('Failed to load dev server:', err);
+ });
} else {
- win.loadURL("https://codepair.yorkie.dev");
+ win.loadURL("https://codepair.yorkie.dev", {
+ httpHeaders: {
+ 'Content-Security-Policy': "default-src 'self' https://codepair.yorkie.dev"
+ }
+ }).catch(err => {
+ console.error('Failed to load production URL:', err);
+ });
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
app.whenReady().then(createWindow); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
app.on("window-all-closed", () => { | ||||||||||||||||||||||||||||||||||||||
if (process.platform !== "darwin") { | ||||||||||||||||||||||||||||||||||||||
app.quit(); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
app.on("activate", () => { | ||||||||||||||||||||||||||||||||||||||
if (BrowserWindow.getAllWindows().length === 0) { | ||||||||||||||||||||||||||||||||||||||
createWindow(); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
{ | ||
"compilerOptions": { | ||
"target": "ES2020", | ||
"module": "ESNext", | ||
"outDir": "dist", | ||
"esModuleInterop": true, | ||
"skipLibCheck": true, | ||
"lib": ["ES2020", "DOM", "DOM.Iterable"], | ||
|
||
/* Bundler mode */ | ||
"moduleResolution": "bundler", | ||
|
||
/* Linting */ | ||
"strict": true | ||
}, | ||
"include": ["src"], | ||
"exclude": ["dist"] | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove --no-frozen-lockfile flag for consistent builds.
Using
--no-frozen-lockfile
in CI/CD can lead to inconsistent builds across different environments as it allows package versions to be updated during installation.📝 Committable suggestion