# .gitlab-ci.yml # GitLab CI/CD Pipeline for D3RO Voice stages: - validate - test - build - package - publish - deploy variables: NODE_VERSION: "20" PACKAGE_NAME: "d3ro-voice" default: image: node:20-bookworm before_script: - npm ci # ──────────────────────────────────────────────────────────────────── # Validate & Lint # ──────────────────────────────────────────────────────────────────── lint-and-typecheck: stage: validate script: - npm run lint || true - npm run typecheck rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "develop"' - if: '$CI_COMMIT_TAG' # ──────────────────────────────────────────────────────────────────── # Unit & Integration Tests # ──────────────────────────────────────────────────────────────────── test-unit: stage: test script: - npm test coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/' artifacts: when: always reports: junit: junit.xml rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "develop"' - if: '$CI_COMMIT_TAG' # ──────────────────────────────────────────────────────────────────── # Build Workspaces # ──────────────────────────────────────────────────────────────────── build-workspaces: stage: build script: - npm run build --workspace=@d3ro/desktop - npm run build --workspace=@d3ro/admin artifacts: paths: - apps/desktop/out/ - apps/admin/.next/ expire_in: 1 day rules: - if: '$CI_COMMIT_BRANCH == "main"' - if: '$CI_COMMIT_TAG' # ──────────────────────────────────────────────────────────────────── # Package Windows (Windows Runner) # ──────────────────────────────────────────────────────────────────── package-windows: stage: package tags: - windows - electron before_script: - npm ci script: - npm run build --workspace=@d3ro/desktop - cd apps/desktop - npx electron-builder --win --x64 --config electron-builder.yml artifacts: name: "d3ro-voice-windows-$CI_COMMIT_TAG" paths: - apps/desktop/release/*/*.exe - apps/desktop/release/*/*.blockmap - apps/desktop/release/*/latest.yml expire_in: 7 days rules: - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+.*$/' # ──────────────────────────────────────────────────────────────────── # Package macOS (macOS Runner) # ──────────────────────────────────────────────────────────────────── package-macos: stage: package tags: - macos - arm64 before_script: - npm ci script: - npm run build --workspace=@d3ro/desktop - cd apps/desktop - npx electron-builder --mac --arm64 --config electron-builder.yml artifacts: name: "d3ro-voice-macos-$CI_COMMIT_TAG" paths: - apps/desktop/release/*/*.dmg - apps/desktop/release/*/*.zip - apps/desktop/release/*/*.blockmap - apps/desktop/release/*/latest-mac.yml expire_in: 7 days rules: - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+.*$/' # ──────────────────────────────────────────────────────────────────── # Publish Release (GitLab Package Registry + Release Page) # ──────────────────────────────────────────────────────────────────── publish-release: stage: publish image: node:20-bookworm needs: - job: package-windows artifacts: true - job: package-macos artifacts: true optional: true script: - node scripts/ci/publish-gitlab-release.mjs rules: - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+.*$/' # ──────────────────────────────────────────────────────────────────── # Deploy Admin Dashboard to NAS / Production Server # ──────────────────────────────────────────────────────────────────── deploy-admin-nas: stage: deploy image: docker:24-cli services: - docker:24-dind before_script: - echo "$DOCKER_REGISTRY_PASSWORD" | docker login -u "$DOCKER_REGISTRY_USER" --password-stdin script: - docker build -t d3ro-voice-admin:latest -f Dockerfile.admin . - docker compose -f docker-compose.prod.yml up -d admin rules: - if: '$CI_COMMIT_BRANCH == "main"'