From 40304ea009d673b33cb142198c32c468300fa106 Mon Sep 17 00:00:00 2001 From: Nico Franke Date: Sat, 4 Mar 2023 19:03:37 +0100 Subject: [PATCH] Release v0.0.1 --- .dockerignore | 1 + .github/workflows/release-docker.yml | 93 +++++++++++++ .github/workflows/release-electron.yml | 42 ++++++ apps/api/.dockerignore | 1 + apps/api/Dockerfile | 30 +++++ apps/api/package.json | 7 +- apps/api/src/server.ts | 2 +- apps/electron/.gitignore | 1 + apps/electron/electron-builder.yml | 18 +-- .../electron.vite.config.1674941033004.mjs | 58 --------- apps/electron/package.json | 21 ++- apps/electron/src/renderer/index.html | 2 +- .../electron/src/renderer/src/components.d.ts | 5 - .../src/composables/useOfflineFallbackFn.ts | 2 +- .../electron/src/renderer/src/pages/index.vue | 4 +- .../src/renderer/src/pages/round/score.vue | 4 +- .../renderer/src/pages/round/selection.vue | 2 +- .../src/renderer/src/stores/settings.ts | 2 +- apps/web/.dockerignore | 2 + apps/web/Dockerfile | 30 +++++ apps/web/layouts/auth.vue | 6 +- apps/web/package.json | 2 +- package.json | 8 +- packages/eslint-config-custom/package.json | 2 +- packages/pitch-worklet-processor/package.json | 2 +- packages/tsconfig/package.json | 2 +- pnpm-lock.yaml | 123 +++++++++++++----- turbo.json | 8 +- 28 files changed, 344 insertions(+), 136 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/release-docker.yml create mode 100644 .github/workflows/release-electron.yml create mode 100644 apps/api/.dockerignore create mode 100644 apps/api/Dockerfile delete mode 100644 apps/electron/electron.vite.config.1674941033004.mjs create mode 100644 apps/web/.dockerignore create mode 100644 apps/web/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.github/workflows/release-docker.yml b/.github/workflows/release-docker.yml new file mode 100644 index 00000000..2c7d1a76 --- /dev/null +++ b/.github/workflows/release-docker.yml @@ -0,0 +1,93 @@ +name: Release Dockers + +on: + push: + branches: + - main + release: + types: [published] + +jobs: + api_to_registry: + name: Build and push API Docker image + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: zernico/sing-api + flavor: | + latest=auto + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=edge,branch=main + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + file: ./apps/api/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 + + web_to_registry: + name: Build and push web Docker image + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: zernico/sing-web + flavor: | + latest=auto + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=edge,branch=main + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + file: ./apps/web/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 \ No newline at end of file diff --git a/.github/workflows/release-electron.yml b/.github/workflows/release-electron.yml new file mode 100644 index 00000000..ddd1a7ea --- /dev/null +++ b/.github/workflows/release-electron.yml @@ -0,0 +1,42 @@ +name: Release Electron + +on: + push: + branches: + - main + release: + types: [published] + +jobs: + release-electron: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest] + + steps: + - name: Check out code + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - uses: pnpm/action-setup@v2 + with: + version: 7.25.0 + + - name: Setup Node.js environment + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + - name: Release electron app + run: pnpm run release --filter="electron..." + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RENDERER_VITE_API_URL: ${{ vars.RENDERER_VITE_API_URL }} + RENDERER_VITE_WEB_URL: ${{ vars.RENDERER_VITE_WEB_URL }} diff --git a/apps/api/.dockerignore b/apps/api/.dockerignore new file mode 100644 index 00000000..53c37a16 --- /dev/null +++ b/apps/api/.dockerignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile new file mode 100644 index 00000000..4d53db1e --- /dev/null +++ b/apps/api/Dockerfile @@ -0,0 +1,30 @@ +FROM node:18-alpine AS builder + +RUN apk update && apk add --no-cache libc6-compat +RUN corepack enable && corepack prepare pnpm@7.4.1 --activate + +WORKDIR /app + +ENV PNPM_HOME="/root/.local/share/pnpm" +ENV PATH="${PATH}:${PNPM_HOME}" +RUN pnpm install -g turbo +COPY . . +RUN turbo prune --scope=api --docker + +FROM node:18-alpine AS runner + +RUN apk update && apk add --no-cache libc6-compat +RUN corepack enable && corepack prepare pnpm@7.4.1 --activate + +WORKDIR /app + +COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml +COPY --from=builder /app/out/full/ ./ +RUN pnpm install --frozen-lockfile +RUN pnpm run build --filter="api..." + +EXPOSE 5000 + +WORKDIR /app/apps/api + +CMD ["pnpm", "start:prod"] \ No newline at end of file diff --git a/apps/api/package.json b/apps/api/package.json index f85aae46..88acfd17 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "0.0.0", + "version": "0.0.1", "main": "server.ts", "scripts": { "build": "tsc", @@ -11,7 +11,8 @@ "db:push": "dotenv -e .env prisma db push", "db:migrate:dev": "dotenv -e .env -- prisma migrate dev", "db:migrate:deploy": "dotenv -e .env -- prisma migrate deploy", - "db:reset": "dotenv -e .env -- prisma migrate reset" + "db:reset": "dotenv -e .env -- prisma migrate reset", + "start:prod": "pnpm run db:migrate:deploy && pnpm run start" }, "dependencies": { "@fastify/cors": "^8.2.0", @@ -33,7 +34,7 @@ "@types/node": "^18.11.18", "eslint": "^8.32.0", "eslint-config-custom": "workspace:*", - "prisma": "^4.9.0", + "prisma": "^4.11.0", "ts-node-dev": "^2.0.0", "tsconfig": "workspace:*" } diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index a9ab9a7d..562a0431 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -26,7 +26,7 @@ server.register(fastifyTRPCPlugin, { trpcOptions: { router: appRouter, createContext }, }) -server.listen({ port: env.PORT }, (err) => { +server.listen({ host: '0.0.0.0', port: env.PORT }, (err) => { if (err) { console.error(err) process.exit(1) diff --git a/apps/electron/.gitignore b/apps/electron/.gitignore index e7c3088d..50a14d90 100644 --- a/apps/electron/.gitignore +++ b/apps/electron/.gitignore @@ -2,3 +2,4 @@ node_modules dist out *.log* +electron.vite.config.*.mjs \ No newline at end of file diff --git a/apps/electron/electron-builder.yml b/apps/electron/electron-builder.yml index ca31df53..439107e6 100644 --- a/apps/electron/electron-builder.yml +++ b/apps/electron/electron-builder.yml @@ -1,5 +1,7 @@ -appId: com.electron.app -productName: electron +appId: de.zernico.sing +productName: Tune Perfect +extraMetadata: + name: tuneperfect directories: buildResources: build files: @@ -10,9 +12,10 @@ files: - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}' asarUnpack: - resources/* -afterSign: build/notarize.js win: - executableName: electron + executableName: tuneperfect + publish: + - github nsis: artifactName: ${name}-${version}-setup.${ext} shortcutName: ${productName} @@ -32,11 +35,8 @@ linux: - AppImage - snap - deb - maintainer: electronjs.org - category: Utility + maintainer: ZerNico + category: Game appImage: artifactName: ${name}-${version}.${ext} npmRebuild: false -publish: - provider: generic - url: https://example.com/auto-updates diff --git a/apps/electron/electron.vite.config.1674941033004.mjs b/apps/electron/electron.vite.config.1674941033004.mjs deleted file mode 100644 index 7b41c3f0..00000000 --- a/apps/electron/electron.vite.config.1674941033004.mjs +++ /dev/null @@ -1,58 +0,0 @@ -// electron.vite.config.ts -import { resolve } from "path"; -import { defineConfig, externalizeDepsPlugin } from "electron-vite"; -import Vue from "@vitejs/plugin-vue"; -import Pages from "vite-plugin-pages"; -import Components from "unplugin-vue-components/vite"; -import AutoImport from "unplugin-auto-import/vite"; -import Unocss from "unocss/vite"; -import VueMacros from "unplugin-vue-macros/vite"; -import svgLoader from "vite-svg-loader"; -var electron_vite_config_default = defineConfig({ - main: { - plugins: [externalizeDepsPlugin()] - }, - preload: { - plugins: [externalizeDepsPlugin()] - }, - renderer: { - resolve: { - alias: { - "@renderer": resolve("src/renderer/src") - } - }, - plugins: [ - VueMacros({ - plugins: { - vue: Vue({ - reactivityTransform: true - }) - } - }), - Pages(), - AutoImport({ - imports: [ - "vue", - "vue/macros", - "vue-router", - "@vueuse/core", - "pinia", - { - "@tanstack/vue-query": ["useQuery", "useMutation"] - } - ], - dts: "src/auto-imports.d.ts", - dirs: ["./src/composables", "./src/stores"], - vueTemplate: true - }), - Components({ - dts: "src/components.d.ts" - }), - Unocss(), - svgLoader() - ] - } -}); -export { - electron_vite_config_default as default -}; diff --git a/apps/electron/package.json b/apps/electron/package.json index 61cff037..7f94e006 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -1,9 +1,12 @@ { "name": "electron", - "version": "0.0.0", - "description": "An Electron application with Vue and TypeScript", + "version": "0.0.1", + "description": "A karaoke game in Vue", "main": "./out/main/index.js", - "homepage": "https://www.electronjs.org", + "repository": { + "type": "git", + "url": "https://github.com/ZerNico/sing.git" + }, "scripts": { "format": "prettier --write .", "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix", @@ -12,11 +15,13 @@ "typecheck": "npm run typecheck:node && npm run typecheck:web", "start": "electron-vite preview", "dev": "electron-vite dev --watch", - "build": "npm run typecheck && electron-vite build", + "prebuild": "npm run typecheck && electron-vite build", + "build": "npm run prebuild && electron-builder --config", "postinstall": "electron-builder install-app-deps", - "build:win": "npm run build && electron-builder --win --config", - "build:mac": "npm run build && electron-builder --mac --config", - "build:linux": "npm run build && electron-builder --linux --config" + "build:win": "npm run prebuild && electron-builder --win --config", + "build:mac": "npm run prebuild && electron-builder --mac --config", + "build:linux": "npm run prebuild && electron-builder --linux --config", + "release": "npm run prebuild && electron-builder -p onTagOrDraft --config" }, "dependencies": { "@electron-toolkit/preload": "^1.0.3", @@ -38,10 +43,12 @@ "@vueuse/core": "^9.11.1", "@vueuse/integrations": "^9.11.1", "@vueuse/sound": "^2.0.1", + "ajv": "^8.12.0", "api": "workspace:*", "dywapitchtrack": "^0.2.0", "electron": "^21.3.3", "electron-builder": "^23.6.0", + "electron-builder-notarize": "^1.5.1", "electron-vite": "^1.0.17", "eslint": "^8.31.0", "eslint-config-custom": "workspace:*", diff --git a/apps/electron/src/renderer/index.html b/apps/electron/src/renderer/index.html index fc2390c8..4cbbdab6 100644 --- a/apps/electron/src/renderer/index.html +++ b/apps/electron/src/renderer/index.html @@ -2,7 +2,7 @@ - Electron + Tune Perfect = T extends (...t: [...infer Arg]) => any ? Arg : never -type InferReturn = T extends (...t: [...infer Arg]) => infer Res ? Res : never +type InferReturn = T extends () => infer Res ? Res : never export default function useOfflineFallbackFn any>(fn: TFunc, fallbackFn: TFunc): (...args: InferArgs) => InferReturn { const lobbyStore = useLobbyStore() diff --git a/apps/electron/src/renderer/src/pages/index.vue b/apps/electron/src/renderer/src/pages/index.vue index 61eec7fc..cfa652c7 100644 --- a/apps/electron/src/renderer/src/pages/index.vue +++ b/apps/electron/src/renderer/src/pages/index.vue @@ -11,8 +11,8 @@ const createLobby = () => client.lobby.create.mutate() const { isLoading, isError, isSuccess, mutate } = useMutation({ mutationFn: createLobby, - retry: 4, - retryDelay: 1000, + retry: 3, + retryDelay: 0, onSuccess: (data) => { lobbyStore.jwt = data.jwt lobbyStore.lobby = data.lobby diff --git a/apps/electron/src/renderer/src/pages/round/score.vue b/apps/electron/src/renderer/src/pages/round/score.vue index ce4014be..baebf641 100644 --- a/apps/electron/src/renderer/src/pages/round/score.vue +++ b/apps/electron/src/renderer/src/pages/round/score.vue @@ -85,7 +85,7 @@ onBeforeUnmount(() => { const uploadHighscore = async () => { if (!song.value) return - if (roundStore.player1 && roundStore.player1.id !== 'guest') { + if (roundStore.player1 && roundStore.player1.id !== 'guest' && score1.value > 0) { await client.highscore.create.mutate({ userId: roundStore.player1.id, score: score1.value, @@ -93,7 +93,7 @@ const uploadHighscore = async () => { }) } - if (roundStore.player2 && roundStore.player2.id !== 'guest') { + if (roundStore.player2 && roundStore.player2.id !== 'guest' && score2.value > 0) { await client.highscore.create.mutate({ userId: roundStore.player2.id, score: score2.value, diff --git a/apps/electron/src/renderer/src/pages/round/selection.vue b/apps/electron/src/renderer/src/pages/round/selection.vue index de13a13e..7cb602e9 100644 --- a/apps/electron/src/renderer/src/pages/round/selection.vue +++ b/apps/electron/src/renderer/src/pages/round/selection.vue @@ -86,7 +86,7 @@ watch(users, (newUsers) => { } }) -const { position, increment, decrement } = useLoop(buttons.value.length - 1, { initial: 2 }) +const { position, increment, decrement } = useLoop(buttons.value.length - 1, { initial: micCount.value }) useMenuNavigation(useRepeatThrottleFn(e => onNavigate(e), 150)) const onNavigate = (event: MenuNavigationEvent) => { diff --git a/apps/electron/src/renderer/src/stores/settings.ts b/apps/electron/src/renderer/src/stores/settings.ts index f64c94d8..59e4ea99 100644 --- a/apps/electron/src/renderer/src/stores/settings.ts +++ b/apps/electron/src/renderer/src/stores/settings.ts @@ -24,7 +24,7 @@ export const useSettingsStore = defineStore('settings', { master: 50, game: 100, preview: 50, - menu: 100, + menu: 50, }, microphones: [], }), diff --git a/apps/web/.dockerignore b/apps/web/.dockerignore new file mode 100644 index 00000000..3f04b440 --- /dev/null +++ b/apps/web/.dockerignore @@ -0,0 +1,2 @@ +.output +.turbo \ No newline at end of file diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 00000000..a6d14f5f --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,30 @@ +FROM node:18-alpine AS builder + +RUN apk update && apk add --no-cache libc6-compat +RUN corepack enable && corepack prepare pnpm@7.4.1 --activate + +WORKDIR /app + +ENV PNPM_HOME="/root/.local/share/pnpm" +ENV PATH="${PATH}:${PNPM_HOME}" +RUN pnpm install -g turbo +COPY . . +RUN turbo prune --scope=web --docker + +FROM node:18-alpine AS runner + +RUN apk update && apk add --no-cache libc6-compat +RUN corepack enable && corepack prepare pnpm@7.4.1 --activate + +WORKDIR /app + +COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml +COPY --from=builder /app/out/full/ ./ +RUN pnpm install --frozen-lockfile +RUN pnpm run build --filter="web..." + +ENV NUXT_HOST=0.0.0.0 +ENV NUXT_PORT=3000 + +EXPOSE 3000 +CMD ["node", "apps/web/.output/server/index.mjs"] diff --git a/apps/web/layouts/auth.vue b/apps/web/layouts/auth.vue index 892ab737..ffcf9060 100644 --- a/apps/web/layouts/auth.vue +++ b/apps/web/layouts/auth.vue @@ -26,6 +26,10 @@ const leave = useMutation({ }) }, }) + +const consoleUrl = computed(() => { + return `${runtimeConfig.public.zitadelIssuer}/ui/console/users/me?login_hint=${user.value?.username}@${user.value?.orgDomain}` +})