Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
c0c8130
feat: added build pipeline
CodeMaster4711 Nov 2, 2025
fd5811e
fix: Add Cargo.lock and update Dockerfile to handle missing lockfile
CodeMaster4711 Nov 2, 2025
75b3754
fix: Upgrade Node.js from 18 to 20 for SvelteKit compatibility
CodeMaster4711 Nov 2, 2025
12a3969
fix: Upgrade Rust from 1.70 to 1.82 for Edition 2024 support
CodeMaster4711 Nov 2, 2025
d09ea87
fix: Use Rust nightly for Edition 2024 support (home crate)
CodeMaster4711 Nov 2, 2025
13dca2f
fix: Set PUBLIC_API_BASE_URL env var for frontend build
CodeMaster4711 Nov 2, 2025
77c7222
fix: Use dynamic env for JWT_SECRET instead of static (runtime vs bui…
CodeMaster4711 Nov 2, 2025
86208ef
perf: Optimize Docker build - better caching and single platform (amd64)
CodeMaster4711 Nov 2, 2025
7d54f0d
fix: Re-enable arm64 build for Apple Silicon support
CodeMaster4711 Nov 2, 2025
e5996de
perf: Use native Apple Silicon runner (macos-14) for ARM64 builds
CodeMaster4711 Nov 2, 2025
7519645
fix: Use OrbStack instead of Colima for macOS Docker (no VM needed)
CodeMaster4711 Nov 2, 2025
3e55945
fix: pipeline amd compile arm
CodeMaster4711 Nov 2, 2025
c460e4e
fix: arm runner
CodeMaster4711 Nov 2, 2025
6313ed2
feat: semantic release pipeline
CodeMaster4711 Nov 3, 2025
db6753e
fix: docker image run and semantic release config
CodeMaster4711 Nov 3, 2025
49459ae
fix: docker run
CodeMaster4711 Nov 4, 2025
ade948d
fix: docker build
CodeMaster4711 Nov 4, 2025
6307671
fix: arm runner nativ macos
CodeMaster4711 Nov 4, 2025
dfa4d63
fix: macos runner
CodeMaster4711 Nov 4, 2025
75836cb
fix: macos runner
CodeMaster4711 Nov 4, 2025
1b7a306
fix: pipeline
CodeMaster4711 Nov 4, 2025
b138cd1
ci: added auto release with semantic release
CodeMaster4711 Nov 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# FinanceVault Environment Configuration

# ============================================
# Security (REQUIRED)
# ============================================
# Generate a secure JWT secret with: openssl rand -hex 32
JWT_SECRET=changeme_generate_secure_secret_with_openssl_rand_hex_32

# ============================================
# Backend Configuration
# ============================================
# Database connection string
DATABASE_URL=sqlite:/data/finance.db

# Rust logging level (trace, debug, info, warn, error)
RUST_LOG=info

# Frontend URL for CORS (must match the actual frontend URL)
FRONTEND_URL=http://localhost:3000

# ============================================
# Frontend Configuration
# ============================================
# Node environment
NODE_ENV=production

# Frontend port
PORT=3000

# ============================================
# Production Settings
# ============================================
# For production deployment, update these:
# JWT_SECRET=<your-secure-random-string>
# FRONTEND_URL=https://yourdomain.com
# RUST_LOG=info
194 changes: 194 additions & 0 deletions .github/CICD.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
# CI/CD Workflow Documentation 🚀

## Überblick

Das FinanceVault Projekt nutzt einen **automatisierten Release- und Build-Prozess** mit semantic-release und GitHub Actions.

## Workflow-Ablauf

### 1. Release Pipeline (`release.yml`)

**Trigger:** Push auf den `main` Branch

**Ablauf:**
1. ✅ Commit-Analyzer prüft Commit-Messages (Conventional Commits)
2. 📊 Bestimmt die neue Version (major/minor/patch)
3. 📝 Generiert CHANGELOG.md
4. 🔄 Aktualisiert Versionen in:
- `package.json` (Root)
- `frontend/package.json`
- `backend/Cargo.toml`
5. 🏷️ Erstellt Git Tag (z.B. `v1.2.3`)
6. 📦 Erstellt GitHub Release
7. ⚙️ Committed Änderungen zurück (`[skip ci]`)

**Ausgabe:**
- GitHub Release mit Changelog
- Versionierte Dateien im Repository
- Git Tag für Docker Build

### 2. Docker Build Pipeline (`docker-build-push.yml`)

**Trigger:**
- Git Tag `v*` (wird vom Release-Workflow erstellt)
- Manueller Trigger (`workflow_dispatch`)

**Ablauf:**
1. 🏗️ Baut AMD64 Image
2. 🏗️ Baut ARM64 Image
3. 🔗 Erstellt Multi-Arch Manifest
4. 📤 Pushed zu GitHub Container Registry

**Tags:**
- `v1.2.3` (exakte Version vom Git Tag)
- `v1.2` (Major.Minor)
- `latest` (nur für main branch)
- `main-sha123-amd64` / `main-sha123-arm64` (Arch-spezifisch)

## Commit Message Format

Wir verwenden [Conventional Commits](https://www.conventionalcommits.org/):

```
<type>(<scope>): <subject>

<body>

<footer>
```

### Types und ihre Auswirkung:

| Type | Beschreibung | Release | Beispiel |
|------------|---------------------------|---------|---------------------------------------------|
| `feat:` | Neues Feature | MINOR | `feat(auth): add OAuth2 support` |
| `fix:` | Bugfix | PATCH | `fix(api): correct expense calculation` |
| `perf:` | Performance | PATCH | `perf(db): optimize query performance` |
| `refactor:`| Code-Umstrukturierung | PATCH | `refactor(ui): restructure components` |
| `build:` | Build-System | PATCH | `build(docker): update base image` |
| `docs:` | Dokumentation | NONE | `docs(readme): update installation guide` |
| `style:` | Code-Style | NONE | `style(lint): fix formatting issues` |
| `test:` | Tests | NONE | `test(auth): add unit tests` |
| `ci:` | CI/CD | NONE | `ci(actions): update workflow` |
| `chore:` | Wartungsarbeiten | NONE | `chore(deps): update dependencies` |

### Breaking Changes

Für **Major Version** Bump:

```
feat(api)!: redesign authentication API

BREAKING CHANGE: The authentication endpoint now requires OAuth2 tokens instead of JWT
```

## Beispiel-Workflow

### Feature entwickeln und releasen:

```bash
# 1. Feature Branch erstellen
git checkout -b feat/new-dashboard

# 2. Änderungen entwickeln
# ... Code ändern ...

# 3. Committen mit Conventional Commits
git commit -m "feat(dashboard): add expense overview widget"
git commit -m "feat(ui): add dark mode toggle"

# 4. Push und PR erstellen
git push origin feat/new-dashboard

# 5. PR Review und Merge in main
# Nach dem Merge:
# ✅ Release Pipeline läuft
# ✅ Neue Version wird erstellt (z.B. v0.2.0)
# ✅ Git Tag wird erstellt
# ✅ Docker Build wird getriggert
# ✅ Image wird mit v0.2.0 getaggt und gepushed
```

### Bugfix releasen:

```bash
git checkout -b fix/expense-calculation

# Bugfix entwickeln
git commit -m "fix(api): correct decimal rounding in expenses"

# Merge in main → Release v0.2.1
```

## Version Management

Die Version wird automatisch in folgenden Dateien aktualisiert:

- ✅ `/package.json`
- ✅ `/frontend/package.json`
- ✅ `/backend/Cargo.toml`
- ✅ `/CHANGELOG.md`

**Wichtig:** Versionen **NIE manuell** ändern! Immer über semantic-release.

## Docker Images abrufen

Nach einem erfolgreichen Release:

```bash
# Latest Version
docker pull ghcr.io/codemaster4711/financevault:latest

# Spezifische Version
docker pull ghcr.io/codemaster4711/financevault:v0.2.0

# Major.Minor Version
docker pull ghcr.io/codemaster4711/financevault:v0.2

# Spezifische Architektur (falls nötig)
docker pull ghcr.io/codemaster4711/financevault:v0.2.0-amd64
docker pull ghcr.io/codemaster4711/financevault:v0.2.0-arm64
```

## Troubleshooting

### Release wird nicht erstellt

**Ursache:** Keine relevanzbaren Commits seit letztem Release

**Lösung:**
- Prüfe ob commits `feat:`, `fix:`, etc. verwenden
- Prüfe GitHub Actions Log

### Docker Build schlägt fehl

**Ursache:** Build-Fehler oder fehlende Permissions

**Lösung:**
1. Check `docker-build-push.yml` Actions Log
2. Teste Build lokal: `docker build -t test .`
3. Prüfe ob `GITHUB_TOKEN` Permissions hat

### Version wird nicht aktualisiert

**Ursache:** Update-Script schlägt fehl

**Lösung:**
1. Check `release.yml` Actions Log (Schritt "Run semantic-release")
2. Prüfe ob `.github/scripts/update-versions.sh` ausführbar ist
3. Teste Script lokal

## Manueller Release

Falls nötig, kann ein Release manuell getriggert werden:

1. Gehe zu Actions → Release
2. Klicke "Run workflow"
3. Wähle Branch `main`
4. Klicke "Run workflow"

## Weitere Informationen

- 📖 [Semantic Release Docs](https://semantic-release.gitbook.io/)
- 📖 [Conventional Commits](https://www.conventionalcommits.org/)
- 📖 [GitHub Actions Docs](https://docs.github.com/actions)
59 changes: 59 additions & 0 deletions .github/scripts/test-update-versions.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/bin/bash
# Test script for version updates

set -e

echo "🧪 Testing version update script..."
echo ""

# Backup current versions
echo "📦 Creating backups..."
cp package.json package.json.backup
cp frontend/package.json frontend/package.json.backup
cp backend/Cargo.toml backend/Cargo.toml.backup

# Set test version
TEST_VERSION="9.9.9"
echo "🔧 Setting test version to ${TEST_VERSION}..."

# Update root package.json
sed -i.tmp "s/\"version\": \"[^\"]*\"/\"version\": \"${TEST_VERSION}\"/" package.json
rm -f package.json.tmp

# Run update script
echo "▶️ Running update-versions.sh..."
chmod +x .github/scripts/update-versions.sh
.github/scripts/update-versions.sh

# Verify updates
echo ""
echo "✅ Verification:"
echo ""

ROOT_VERSION=$(node -p "require('./package.json').version")
FRONTEND_VERSION=$(node -p "require('./frontend/package.json').version")
BACKEND_VERSION=$(grep "^version = " backend/Cargo.toml | head -n1 | cut -d'"' -f2)

echo "Root version: ${ROOT_VERSION}"
echo "Frontend version: ${FRONTEND_VERSION}"
echo "Backend version: ${BACKEND_VERSION}"

# Restore backups
echo ""
echo "🔄 Restoring backups..."
mv package.json.backup package.json
mv frontend/package.json.backup frontend/package.json
mv backend/Cargo.toml.backup backend/Cargo.toml

# Check if all versions match
if [ "$ROOT_VERSION" = "$TEST_VERSION" ] && \
[ "$FRONTEND_VERSION" = "$TEST_VERSION" ] && \
[ "$BACKEND_VERSION" = "$TEST_VERSION" ]; then
echo ""
echo "✅ Test PASSED! All versions updated correctly."
exit 0
else
echo ""
echo "❌ Test FAILED! Version mismatch detected."
exit 1
fi
23 changes: 23 additions & 0 deletions .github/scripts/update-versions.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash
set -e

# Get the new version from package.json
NEW_VERSION=$(node -p "require('./package.json').version")

echo "Updating versions to ${NEW_VERSION}..."

# Update frontend package.json
if [ -f "frontend/package.json" ]; then
echo "Updating frontend/package.json..."
sed -i.bak "s/\"version\": \"[^\"]*\"/\"version\": \"${NEW_VERSION}\"/" frontend/package.json
rm -f frontend/package.json.bak
fi

# Update backend Cargo.toml
if [ -f "backend/Cargo.toml" ]; then
echo "Updating backend/Cargo.toml..."
sed -i.bak "s/^version = \"[^\"]*\"/version = \"${NEW_VERSION}\"/" backend/Cargo.toml
rm -f backend/Cargo.toml.bak
fi

echo "Version update complete!"
41 changes: 41 additions & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# GitHub Actions Workflows

Dieses Verzeichnis enthält alle CI/CD Workflows für FinanceVault.

## Workflows

### 📦 `release.yml` - Semantic Release
Automatisches Versioning und Release-Erstellung basierend auf Conventional Commits.

**Trigger:** Push auf `main`

**Funktionen:**
- 🔍 Analysiert Commits
- 🏷️ Erstellt neue Version (semver)
- 📝 Generiert CHANGELOG
- 🔄 Aktualisiert package.json und Cargo.toml
- 📦 Erstellt GitHub Release
- 🏷️ Erstellt Git Tag

### 🐳 `docker-build-push.yml` - Docker Build & Push
Baut Multi-Arch Docker Images und pushed sie zu GitHub Container Registry.

**Trigger:** Git Tags (`v*`)

**Funktionen:**
- 🏗️ Multi-Architecture Build (AMD64, ARM64)
- 📤 Push zu ghcr.io
- 🏷️ Smart Tagging (version, major.minor, latest)
- 💾 Build Cache für schnellere Builds

## Scripts

### `scripts/update-versions.sh`
Helper-Script zum Aktualisieren der Versionen in:
- `package.json` (Root)
- `frontend/package.json`
- `backend/Cargo.toml`

## Dokumentation

Siehe [CICD.md](./CICD.md) für detaillierte Workflow-Dokumentation.
Loading