CI Test
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m10s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m10s
This commit is contained in:
67
.gitea/workflows/build-and-push.yaml
Normal file
67
.gitea/workflows/build-and-push.yaml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
name: Build and Push Docker Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Determine Image Tag
|
||||||
|
id: tag
|
||||||
|
run: |
|
||||||
|
# Prüfe ob es ein Git Tag ist
|
||||||
|
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
|
||||||
|
# Verwende den Tag-Namen (z.B. v1.0.0)
|
||||||
|
TAG="${{ github.ref_name }}"
|
||||||
|
elif [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||||
|
# Für main Branch: verwende 'latest'
|
||||||
|
TAG="latest"
|
||||||
|
else
|
||||||
|
# Für andere Branches: verwende Branch-Name + kurzen Commit-SHA
|
||||||
|
TAG="${{ github.ref_name }}-${{ github.sha }}"
|
||||||
|
TAG="${TAG:0:50}" # Limit auf 50 Zeichen
|
||||||
|
fi
|
||||||
|
echo "IMAGE_TAG=${TAG}" >> $GITHUB_OUTPUT
|
||||||
|
echo "📦 Image Tag: ${TAG}"
|
||||||
|
|
||||||
|
- name: Create .env file from secrets and variables
|
||||||
|
run: |
|
||||||
|
cd docker
|
||||||
|
cat > .env << EOF
|
||||||
|
REGISTRY_URL=${{ vars.REGISTRY_URL }}
|
||||||
|
NAMESPACE=${{ vars.NAMESPACE }}
|
||||||
|
REPO_NAME=${{ vars.REPO_NAME }}
|
||||||
|
IMAGE_TAG=${{ steps.tag.outputs.IMAGE_TAG }}
|
||||||
|
CI_GITEA_USER=${{ secrets.CI_GITEA_USER }}
|
||||||
|
CI_GITEA_TOKEN=${{ secrets.CI_GITEA_TOKEN }}
|
||||||
|
EOF
|
||||||
|
echo "✅ .env file created with IMAGE_TAG=${{ steps.tag.outputs.IMAGE_TAG }}"
|
||||||
|
|
||||||
|
- name: Build Docker Image
|
||||||
|
run: |
|
||||||
|
cd docker
|
||||||
|
chmod +x build.sh
|
||||||
|
./build.sh
|
||||||
|
|
||||||
|
- name: Push Docker Image to Registry
|
||||||
|
run: |
|
||||||
|
cd docker
|
||||||
|
chmod +x push.sh
|
||||||
|
./push.sh
|
||||||
|
|
||||||
|
- name: Summary
|
||||||
|
run: |
|
||||||
|
echo "🎉 Build and Push completed successfully!"
|
||||||
|
echo "📦 Image: ${{ vars.REGISTRY_URL }}/${{ vars.NAMESPACE }}/${{ vars.REPO_NAME }}:${{ steps.tag.outputs.IMAGE_TAG }}"
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
name: Build, Push & Deploy Angular App
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE_NAME: ${{ vars.IMAGE_NAME }}
|
|
||||||
GITEA_REGISTRY: ${{ vars.IMAGE_REGISTRY }}
|
|
||||||
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
|
||||||
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
|
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
|
||||||
CI_REGISTRY_USER: ${{ secrets.CI_REGISTRY_USER }}
|
|
||||||
CI_REGISTRY_PASSWORD: ${{ secrets.CI_REGISTRY_PASSWORD }}
|
|
||||||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
||||||
TAG: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || 'latest' }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# build:
|
|
||||||
# name: 🏗️ Build Docker Image
|
|
||||||
# runs-on: ubuntu-latest
|
|
||||||
# steps:
|
|
||||||
# - uses: actions/checkout@v3
|
|
||||||
#
|
|
||||||
# - name: Install Docker client
|
|
||||||
# run: |
|
|
||||||
# sudo apt-get update
|
|
||||||
# sudo apt-get install -y docker.io bash
|
|
||||||
#
|
|
||||||
# - name: Build Docker Image
|
|
||||||
# run: |
|
|
||||||
# chmod +x ./docker/build.sh
|
|
||||||
# cd docker
|
|
||||||
# ./build.sh "${IMAGE_NAME}" "${TAG}"
|
|
||||||
|
|
||||||
push:
|
|
||||||
name: ⬆️ Build and Push Image to Gitea Registry
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# needs: build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Build and Push Image
|
|
||||||
env:
|
|
||||||
GITEA_REGISTRY: ${{ vars.IMAGE_REGISTRY }}
|
|
||||||
GITEA_USER: ${{ secrets.CI_REGISTRY_USER }}
|
|
||||||
GITEA_TOKEN: ${{ secrets.CI_REGISTRY_PASSWORD }}
|
|
||||||
IMAGE_NAME: ${{ vars.IMAGE_NAME }}
|
|
||||||
TAG: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || 'latest' }}
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y docker.io bash
|
|
||||||
cd docker
|
|
||||||
chmod +x ./push-to-gitea.sh
|
|
||||||
./push-to-gitea.sh "${IMAGE_NAME}" "${TAG}"
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
name: 🚀 Deploy to Remote Server
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: push
|
|
||||||
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')
|
|
||||||
steps:
|
|
||||||
- name: Prepare environment
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y openssh-client docker.io
|
|
||||||
|
|
||||||
- name: Deploy via SSH
|
|
||||||
run: |
|
|
||||||
echo "${DEPLOY_KEY}" > /tmp/deploy_key.pem
|
|
||||||
chmod 600 /tmp/deploy_key.pem
|
|
||||||
|
|
||||||
ssh -i /tmp/deploy_key.pem -o StrictHostKeyChecking=no \
|
|
||||||
${DEPLOY_USER}@${DEPLOY_HOST} <<EOF
|
|
||||||
docker login ${GITEA_REGISTRY} -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}"
|
|
||||||
docker pull ${GITEA_REGISTRY}/${CI_REGISTRY_USER}/${IMAGE_NAME}:${TAG}
|
|
||||||
docker stop ${IMAGE_NAME} || true
|
|
||||||
docker rm ${IMAGE_NAME} || true
|
|
||||||
docker run -d --name ${IMAGE_NAME} -p 80:80 ${GITEA_REGISTRY}/${CI_REGISTRY_USER}/${IMAGE_NAME}:${TAG}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# notify:
|
|
||||||
# name: 🔔 Notify Deployment Result
|
|
||||||
# runs-on: ubuntu-latest
|
|
||||||
# needs: deploy
|
|
||||||
# if: always()
|
|
||||||
# steps:
|
|
||||||
# - name: Send Discord Notification
|
|
||||||
# run: |
|
|
||||||
# STATUS=${{ job.status }}
|
|
||||||
# MESSAGE="🚀 *Angular-Web-App Deployment* (${{ github.ref_name }}) finished with status: **${STATUS}**"
|
|
||||||
# curl -H "Content-Type: application/json" \
|
|
||||||
# -X POST \
|
|
||||||
# -d "{\"content\": \"${MESSAGE}\"}" \
|
|
||||||
# ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
||||||
|
|
||||||
# deploy-prod:
|
|
||||||
# if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
# deploy-staging:
|
|
||||||
# if: github.ref == 'refs/heads/dev'
|
|
||||||
124
docker/BUILD.md
Normal file
124
docker/BUILD.md
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
# Docker Build Anleitung
|
||||||
|
|
||||||
|
## Multi-Stage Build
|
||||||
|
|
||||||
|
Das Dockerfile verwendet einen Multi-Stage Build mit zwei Stages:
|
||||||
|
|
||||||
|
### Stage 1: Builder
|
||||||
|
- **Base Image**: Node.js 24.7.0-alpine
|
||||||
|
- **Aufgabe**: Baut die Angular-Applikation
|
||||||
|
- Installiert Dependencies mit `npm ci`
|
||||||
|
- Führt `npm run build` aus
|
||||||
|
|
||||||
|
### Stage 2: Runner
|
||||||
|
- **Base Image**: nginx-unprivileged:alpine3.22
|
||||||
|
- **Aufgabe**: Serviert die statischen Dateien
|
||||||
|
- Kopiert die gebauten Dateien aus der Builder-Stage
|
||||||
|
- Läuft auf Port 8080
|
||||||
|
|
||||||
|
## Build Ausführen
|
||||||
|
|
||||||
|
### Empfohlen: Build-Script mit .env Integration
|
||||||
|
|
||||||
|
Das empfohlene Vorgehen ist die Verwendung des Build-Scripts, welches automatisch den Image-Namen und Tag aus der `.env` Datei liest:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd docker
|
||||||
|
./build.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Script liest folgende Variablen aus der `.env` Datei:
|
||||||
|
- `REGISTRY_URL`: Die Registry-URL (z.B. gitea.moz-tech.de)
|
||||||
|
- `NAMESPACE`: Der Namespace/Benutzer (z.B. murat)
|
||||||
|
- `REPO_NAME`: Der Repository-Name (z.B. enerport-web-app)
|
||||||
|
- `IMAGE_TAG`: Das Image-Tag (z.B. latest, v1.0.0, dev)
|
||||||
|
|
||||||
|
Der vollständige Image-Name wird dann als `${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}:${IMAGE_TAG}` zusammengesetzt.
|
||||||
|
|
||||||
|
**Beispiel .env:**
|
||||||
|
```env
|
||||||
|
REGISTRY_URL=gitea.moz-tech.de
|
||||||
|
NAMESPACE=murat
|
||||||
|
REPO_NAME=enerport-web-app
|
||||||
|
IMAGE_TAG=latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manueller Build
|
||||||
|
|
||||||
|
#### Vom docker/ Verzeichnis aus:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd docker
|
||||||
|
docker build -f Dockerfile -t enerport-web-app ..
|
||||||
|
```
|
||||||
|
|
||||||
|
**Wichtig**: Der Build-Kontext muss das Parent-Verzeichnis (`..`) sein, damit alle Source-Dateien verfügbar sind.
|
||||||
|
|
||||||
|
#### Vom Root-Verzeichnis aus:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -f docker/Dockerfile -t enerport-web-app .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Container Starten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -p 8080:8080 enerport-web-app
|
||||||
|
```
|
||||||
|
|
||||||
|
Die Applikation ist dann unter http://localhost:8080 erreichbar und leitet automatisch zur deutschen Lokalisierung um (http://localhost:8080/de/).
|
||||||
|
|
||||||
|
### Verfügbare Sprachen
|
||||||
|
|
||||||
|
Die Applikation unterstützt mehrere Sprachen durch i18n:
|
||||||
|
- **Deutsch (de)**: http://localhost:8080/de/
|
||||||
|
- **Deutsch-Deutschland (de-DE)**: http://localhost:8080/de-DE/
|
||||||
|
- **Englisch (en)**: http://localhost:8080/en/
|
||||||
|
|
||||||
|
## Image zur Registry pushen
|
||||||
|
|
||||||
|
Nach dem erfolgreichen Build kann das Image mit dem Push-Script zur Gitea Registry hochgeladen werden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd docker
|
||||||
|
./push.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Push-Script:
|
||||||
|
- ✅ Liest automatisch alle Registry-Daten aus der `.env` Datei
|
||||||
|
- ✅ Prüft ob das Image lokal existiert
|
||||||
|
- ✅ Authentifiziert sich bei der Gitea Registry mit Token
|
||||||
|
- ✅ Pusht das Image zur Registry
|
||||||
|
- ✅ Logout nach erfolgreichem Push
|
||||||
|
|
||||||
|
**Workflow:**
|
||||||
|
```bash
|
||||||
|
# 1. Image bauen
|
||||||
|
./build.sh
|
||||||
|
|
||||||
|
# 2. Image zur Registry pushen
|
||||||
|
./push.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD mit Gitea Actions
|
||||||
|
|
||||||
|
Für automatische Builds bei jedem Commit auf den `main` Branch wurde ein Gitea Workflow eingerichtet:
|
||||||
|
|
||||||
|
📄 **Workflow-Datei:** `.gitea/workflows/build-and-push.yaml`
|
||||||
|
|
||||||
|
Der Workflow:
|
||||||
|
- ✅ Wird automatisch bei Push auf `main` ausgeführt
|
||||||
|
- ✅ Baut das Docker Image mit `build.sh`
|
||||||
|
- ✅ Pusht das Image zur Registry mit `push.sh`
|
||||||
|
- ✅ Verwendet Gitea Variables und Secrets (keine .env Datei in Git)
|
||||||
|
|
||||||
|
**Setup-Anleitung:** Siehe [GITEA_SETUP.md](GITEA_SETUP.md) für die Einrichtung der benötigten Gitea Variables und Secrets.
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Die `.dockerignore` Datei im docker/ Verzeichnis verhindert, dass unnötige Dateien ins Image kopiert werden
|
||||||
|
- Das finale Image ist optimiert und enthält nur die gebauten statischen Dateien und Nginx
|
||||||
|
- Der Nginx-Container läuft unprivileged auf Port 8080 für erhöhte Sicherheit
|
||||||
|
- Die Scripts `build.sh` und `push.sh` nutzen die `.env` Datei für zentrale Konfiguration
|
||||||
|
- Das Gitea Token in der `.env` Datei sollte niemals in Git committed werden
|
||||||
|
- Für CI/CD werden Variables und Secrets aus Gitea verwendet (siehe GITEA_SETUP.md)
|
||||||
128
docker/GITEA_SETUP.md
Normal file
128
docker/GITEA_SETUP.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Gitea CI/CD Setup
|
||||||
|
|
||||||
|
Diese Anleitung erklärt, wie Sie die benötigten Variables und Secrets in Gitea für den automatischen Build und Push Workflow einrichten.
|
||||||
|
|
||||||
|
## Gitea Workflow
|
||||||
|
|
||||||
|
Der Workflow `.gitea/workflows/build-and-push.yaml` wird automatisch ausgeführt und:
|
||||||
|
1. Bestimmt automatisch den Image-Tag basierend auf dem Commit/Tag
|
||||||
|
2. Baut das Docker Image
|
||||||
|
3. Pusht das Image zur Gitea Registry
|
||||||
|
|
||||||
|
### Automatische Tag-Generierung
|
||||||
|
|
||||||
|
Der IMAGE_TAG wird automatisch bestimmt:
|
||||||
|
|
||||||
|
| Trigger | Tag-Format | Beispiel |
|
||||||
|
|---------|-----------|----------|
|
||||||
|
| Push auf `main` Branch | `latest` | `latest` |
|
||||||
|
| Git Tag (v*) | Tag-Name | `v1.0.0`, `v2.1.3` |
|
||||||
|
| Andere Branches | `{branch}-{sha}` | `develop-a1b2c3d` |
|
||||||
|
|
||||||
|
**Sie müssen IMAGE_TAG NICHT mehr als Variable setzen** - es wird automatisch generiert!
|
||||||
|
|
||||||
|
## Benötigte Gitea Variables und Secrets
|
||||||
|
|
||||||
|
### Variables (öffentlich)
|
||||||
|
|
||||||
|
Navigieren Sie zu: **Settings → Actions → Variables**
|
||||||
|
|
||||||
|
Erstellen Sie folgende Variables:
|
||||||
|
|
||||||
|
| Name | Wert | Beispiel |
|
||||||
|
|------|------|----------|
|
||||||
|
| `REGISTRY_URL` | URL der Gitea Registry | `gitea.moz-tech.de` |
|
||||||
|
| `NAMESPACE` | Namespace/Benutzer | `murat` |
|
||||||
|
| `REPO_NAME` | Repository Name | `enerport-web-app` |
|
||||||
|
|
||||||
|
**Hinweis:** `IMAGE_TAG` wird automatisch aus dem Commit/Tag generiert und muss nicht als Variable gesetzt werden.
|
||||||
|
|
||||||
|
### Secrets (vertraulich)
|
||||||
|
|
||||||
|
Navigieren Sie zu: **Settings → Actions → Secrets**
|
||||||
|
|
||||||
|
Erstellen Sie folgende Secrets:
|
||||||
|
|
||||||
|
| Name | Wert | Beispiel |
|
||||||
|
|------|------|----------|
|
||||||
|
| `CI_GITEA_USER` | Gitea Benutzername | `murat` |
|
||||||
|
| `CI_GITEA_TOKEN` | Gitea Access Token | `74a7738116bfb99497a7781291efc5766901f497` |
|
||||||
|
|
||||||
|
**Hinweis:**
|
||||||
|
- User und Token werden zusammen als Secrets gespeichert für eine sichere Authentifizierung
|
||||||
|
- Der Prefix `CI_GITEA_` ist erforderlich, da Gitea keine Variablen mit dem Prefix `GITEA_` erlaubt
|
||||||
|
|
||||||
|
## Access Token erstellen
|
||||||
|
|
||||||
|
1. Navigieren Sie zu **Settings → Applications → Manage Access Tokens**
|
||||||
|
2. Klicken Sie auf **Generate New Token**
|
||||||
|
3. Geben Sie einen Namen ein (z.B. "Docker Registry")
|
||||||
|
4. Wählen Sie die Berechtigung: **write:package** (für Registry Push)
|
||||||
|
5. Klicken Sie auf **Generate Token**
|
||||||
|
6. Kopieren Sie den Token und fügen Sie ihn als Secret `CI_GITEA_TOKEN` hinzu
|
||||||
|
|
||||||
|
## Workflow testen
|
||||||
|
|
||||||
|
Nach der Einrichtung der Variables und Secrets:
|
||||||
|
|
||||||
|
### Test 1: Push auf main Branch (erstellt 'latest' Tag)
|
||||||
|
```bash
|
||||||
|
git add .
|
||||||
|
git commit -m "Test CI/CD workflow"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
→ Erstellt Image: `gitea.moz-tech.de/murat/enerport-web-app:latest`
|
||||||
|
|
||||||
|
### Test 2: Git Tag erstellen (erstellt versioniertes Image)
|
||||||
|
```bash
|
||||||
|
git tag v1.0.0
|
||||||
|
git push origin v1.0.0
|
||||||
|
```
|
||||||
|
→ Erstellt Image: `gitea.moz-tech.de/murat/enerport-web-app:v1.0.0`
|
||||||
|
|
||||||
|
### Workflow-Status überprüfen:
|
||||||
|
- Navigieren Sie zu **Actions** in Ihrem Gitea Repository
|
||||||
|
- Sie sollten den Workflow "Build and Push Docker Image" sehen
|
||||||
|
- Klicken Sie darauf, um die Logs und den verwendeten Tag zu sehen
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Fehler: "REGISTRY_URL not set in .env"
|
||||||
|
→ Stellen Sie sicher, dass alle Variables korrekt in Gitea eingerichtet sind
|
||||||
|
|
||||||
|
### Fehler: "Failed to login to registry"
|
||||||
|
→ Überprüfen Sie das `GITEA_TOKEN` Secret und stellen Sie sicher, dass es die **write:package** Berechtigung hat
|
||||||
|
|
||||||
|
### Fehler: "Image not found locally"
|
||||||
|
→ Der Build-Schritt ist fehlgeschlagen. Überprüfen Sie die Build-Logs im Workflow
|
||||||
|
|
||||||
|
## Lokale Entwicklung vs. CI/CD
|
||||||
|
|
||||||
|
### Lokal:
|
||||||
|
- Verwendet die `docker/.env` Datei
|
||||||
|
- Manuelle Ausführung von `./build.sh` und `./push.sh`
|
||||||
|
|
||||||
|
### CI/CD (Gitea):
|
||||||
|
- Erstellt `.env` Datei automatisch aus Gitea Variables/Secrets
|
||||||
|
- Automatische Ausführung bei jedem Push auf `main`
|
||||||
|
|
||||||
|
## Sicherheit
|
||||||
|
|
||||||
|
⚠️ **Wichtig:**
|
||||||
|
- Committen Sie die `docker/.env` Datei NIEMALS in Git (bereits in `.gitignore`)
|
||||||
|
- Das `GITEA_TOKEN` sollte nur als Secret gespeichert werden
|
||||||
|
- Alle anderen Werte können als Variables gespeichert werden
|
||||||
|
|
||||||
|
## Image Pull
|
||||||
|
|
||||||
|
Nach erfolgreichem Push können Sie das Image wie folgt pullen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Login zur Registry
|
||||||
|
docker login gitea.moz-tech.de -u murat
|
||||||
|
|
||||||
|
# Image pullen
|
||||||
|
docker pull gitea.moz-tech.de/murat/enerport-web-app:latest
|
||||||
|
|
||||||
|
# Container starten
|
||||||
|
docker run -p 8080:8080 gitea.moz-tech.de/murat/enerport-web-app:latest
|
||||||
101
docker/build.sh
101
docker/build.sh
@@ -1,21 +1,94 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/bash
|
||||||
set -e
|
|
||||||
|
|
||||||
# Bild- und Tag-Parameter
|
# ==============================================
|
||||||
IMAGE="${1:-angular-web-app}"
|
# Docker Build Script mit .env Integration
|
||||||
TAG="${2:-latest}"
|
# ==============================================
|
||||||
|
# Dieses Script liest IMAGE_NAME und IMAGE_TAG
|
||||||
|
# aus der .env Datei und führt den Docker Build aus
|
||||||
|
# ==============================================
|
||||||
|
|
||||||
# Pfad zum Skript selbst
|
set -e # Exit on error
|
||||||
|
|
||||||
|
# Farben für Output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Script-Verzeichnis ermitteln
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
ENV_FILE="${SCRIPT_DIR}/.env"
|
||||||
|
|
||||||
# Root-Verzeichnis (eine Ebene über docker/)
|
echo -e "${GREEN}=== Docker Build Script ===${NC}"
|
||||||
ROOT_DIR="$(realpath "$SCRIPT_DIR/..")"
|
echo ""
|
||||||
|
|
||||||
# Dockerfile-Pfad
|
# Prüfen ob .env Datei existiert
|
||||||
DOCKERFILE="$SCRIPT_DIR/Dockerfile"
|
if [ ! -f "$ENV_FILE" ]; then
|
||||||
|
echo -e "${RED}ERROR: .env file not found at ${ENV_FILE}${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
echo "🏗️ Baue Docker-Image..."
|
# .env Datei laden
|
||||||
echo "🔹 Dockerfile: $DOCKERFILE"
|
echo -e "${YELLOW}Loading environment variables from .env...${NC}"
|
||||||
echo "🔹 Build-Kontext: $ROOT_DIR"
|
set -a # Automatisch alle Variablen exportieren
|
||||||
|
source "$ENV_FILE"
|
||||||
|
set +a
|
||||||
|
|
||||||
docker build -f "$DOCKERFILE" -t "${IMAGE}:${TAG}" "$ROOT_DIR"
|
# Validierung der erforderlichen Variablen
|
||||||
|
if [ -z "$REGISTRY_URL" ]; then
|
||||||
|
echo -e "${RED}ERROR: REGISTRY_URL not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$NAMESPACE" ]; then
|
||||||
|
echo -e "${RED}ERROR: NAMESPACE not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$REPO_NAME" ]; then
|
||||||
|
echo -e "${RED}ERROR: REPO_NAME not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Image Name aus .env Variablen zusammensetzen
|
||||||
|
IMAGE_NAME="${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}"
|
||||||
|
|
||||||
|
# Image Tag (default: latest)
|
||||||
|
IMAGE_TAG="${IMAGE_TAG:-latest}"
|
||||||
|
|
||||||
|
# Vollständiger Image Name mit Tag
|
||||||
|
FULL_IMAGE_NAME="${IMAGE_NAME}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
echo -e "${GREEN}Image Name:${NC} ${FULL_IMAGE_NAME}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Docker Build ausführen
|
||||||
|
echo -e "${YELLOW}Starting Docker build...${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Zum Script-Verzeichnis wechseln
|
||||||
|
cd "$SCRIPT_DIR"
|
||||||
|
|
||||||
|
# Build-Befehl mit Parent-Verzeichnis als Kontext
|
||||||
|
docker build \
|
||||||
|
-f Dockerfile \
|
||||||
|
-t "$FULL_IMAGE_NAME" \
|
||||||
|
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||||
|
..
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✓ Build successful!${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "Image: ${GREEN}${FULL_IMAGE_NAME}${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}To run the container:${NC}"
|
||||||
|
echo -e " docker run -p 8080:8080 ${FULL_IMAGE_NAME}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Optional: Image auch mit 'latest' Tag erstellen für lokale Entwicklung
|
||||||
|
if [ "$IMAGE_TAG" != "latest" ]; then
|
||||||
|
echo -e "${YELLOW}Tagging image as 'latest' for local development...${NC}"
|
||||||
|
docker tag "$FULL_IMAGE_NAME" "${IMAGE_NAME}:latest"
|
||||||
|
echo -e "${GREEN}✓ Tagged as ${IMAGE_NAME}:latest${NC}"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|||||||
@@ -48,9 +48,19 @@ http {
|
|||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
# Angular Routing
|
# Redirect root to default locale (de) - using relative redirect
|
||||||
|
location = / {
|
||||||
|
return 301 $scheme://$http_host/de/;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Serve each locale
|
||||||
|
location ~ ^/(de|de-DE|en)/ {
|
||||||
|
try_files $uri $uri/ /$1/index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fallback for any other routes to default locale
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
return 301 $scheme://$http_host/de$request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Static Assets Caching
|
# Static Assets Caching
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e # Skript bei Fehlern sofort beenden
|
|
||||||
|
|
||||||
# === .env-Datei laden ===
|
|
||||||
if [ -f .env ]; then
|
|
||||||
echo "📄 Lade Umgebungsvariablen aus .env..."
|
|
||||||
export $(grep -v '^#' .env | xargs)
|
|
||||||
else
|
|
||||||
echo "⚠️ Keine .env-Datei gefunden – verwende Umgebungsvariablen oder Defaults."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# === KONFIGURATION ===
|
|
||||||
GITEA_REGISTRY="${GITEA_REGISTRY:-gitea.example.com}"
|
|
||||||
GITEA_USER="${GITEA_USER:-}"
|
|
||||||
GITEA_TOKEN="${GITEA_TOKEN:-}"
|
|
||||||
|
|
||||||
DEFAULT_IMAGE="angular-web-app"
|
|
||||||
DEFAULT_TAG="latest"
|
|
||||||
|
|
||||||
# === PARAMETER ===
|
|
||||||
IMAGE_NAME="${1:-$DEFAULT_IMAGE}"
|
|
||||||
TAG="${2:-$DEFAULT_TAG}"
|
|
||||||
|
|
||||||
# === BUILD AUSFÜHREN ===
|
|
||||||
echo "🏗️ Baue Docker-Image..."
|
|
||||||
./build.sh "$IMAGE_NAME" "$TAG"
|
|
||||||
|
|
||||||
# === IMAGE-TAGGING ===
|
|
||||||
FULL_IMAGE="${GITEA_REGISTRY}/${GITEA_USER}/${IMAGE_NAME}:${TAG}"
|
|
||||||
echo "🏷️ Tagge Image für Gitea-Registry: ${FULL_IMAGE}"
|
|
||||||
docker tag "${IMAGE_NAME}:${TAG}" "${FULL_IMAGE}"
|
|
||||||
|
|
||||||
# === LOGIN ===
|
|
||||||
if [ -n "$GITEA_USER" ] && [ -n "$GITEA_TOKEN" ]; then
|
|
||||||
echo "🔐 Melde bei Gitea Registry an (${GITEA_REGISTRY})..."
|
|
||||||
echo "$GITEA_TOKEN" | docker login "$GITEA_REGISTRY" -u "$GITEA_USER" --password-stdin
|
|
||||||
else
|
|
||||||
echo "⚠️ Kein Benutzername oder Token angegeben – überspringe Login."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# === PRÜFEN, OB IMAGE SCHON EXISTIERT ===
|
|
||||||
echo "🔎 Prüfe, ob Image bereits in Registry existiert..."
|
|
||||||
EXISTS=false
|
|
||||||
if docker manifest inspect "${FULL_IMAGE}" >/dev/null 2>&1; then
|
|
||||||
EXISTS=true
|
|
||||||
echo "🟡 Image ${FULL_IMAGE} existiert bereits in der Registry."
|
|
||||||
else
|
|
||||||
echo "🟢 Image ${FULL_IMAGE} ist neu – wird gepusht."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# === DIGESTS VERGLEICHEN (wenn vorhanden) ===
|
|
||||||
if [ "$EXISTS" = true ]; then
|
|
||||||
LOCAL_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "${FULL_IMAGE}" 2>/dev/null | cut -d'@' -f2)
|
|
||||||
REMOTE_DIGEST=$(docker manifest inspect "${FULL_IMAGE}" 2>/dev/null | sha256sum | awk '{print $1}')
|
|
||||||
|
|
||||||
if [ -n "$LOCAL_DIGEST" ] && [ -n "$REMOTE_DIGEST" ] && [ "$LOCAL_DIGEST" = "$REMOTE_DIGEST" ]; then
|
|
||||||
echo "✅ Lokales und entferntes Image sind identisch – Push wird übersprungen."
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "🆕 Unterschiede festgestellt – Push wird ausgeführt."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# === PUSH ===
|
|
||||||
echo "⬆️ Push zum Gitea-Repository..."
|
|
||||||
docker push "${FULL_IMAGE}"
|
|
||||||
|
|
||||||
echo "✅ Upload abgeschlossen: ${FULL_IMAGE}"
|
|
||||||
119
docker/push.sh
Executable file
119
docker/push.sh
Executable file
@@ -0,0 +1,119 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# ==============================================
|
||||||
|
# Docker Push Script für Gitea Registry
|
||||||
|
# ==============================================
|
||||||
|
# Dieses Script liest Registry-Daten aus der
|
||||||
|
# .env Datei und pusht das Image zur Registry
|
||||||
|
# ==============================================
|
||||||
|
|
||||||
|
set -e # Exit on error
|
||||||
|
|
||||||
|
# Farben für Output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Script-Verzeichnis ermitteln
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
ENV_FILE="${SCRIPT_DIR}/.env"
|
||||||
|
|
||||||
|
echo -e "${GREEN}=== Docker Push Script für Gitea Registry ===${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Prüfen ob .env Datei existiert
|
||||||
|
if [ ! -f "$ENV_FILE" ]; then
|
||||||
|
echo -e "${RED}ERROR: .env file not found at ${ENV_FILE}${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# .env Datei laden
|
||||||
|
echo -e "${YELLOW}Loading environment variables from .env...${NC}"
|
||||||
|
set -a # Automatisch alle Variablen exportieren
|
||||||
|
source "$ENV_FILE"
|
||||||
|
set +a
|
||||||
|
|
||||||
|
# Validierung der erforderlichen Variablen
|
||||||
|
if [ -z "$REGISTRY_URL" ]; then
|
||||||
|
echo -e "${RED}ERROR: REGISTRY_URL not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$NAMESPACE" ]; then
|
||||||
|
echo -e "${RED}ERROR: NAMESPACE not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$REPO_NAME" ]; then
|
||||||
|
echo -e "${RED}ERROR: REPO_NAME not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$CI_GITEA_USER" ]; then
|
||||||
|
echo -e "${RED}ERROR: CI_GITEA_USER not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$CI_GITEA_TOKEN" ]; then
|
||||||
|
echo -e "${RED}ERROR: CI_GITEA_TOKEN not set in .env${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Image Name und Tag zusammensetzen
|
||||||
|
IMAGE_TAG="${IMAGE_TAG:-latest}"
|
||||||
|
FULL_IMAGE_NAME="${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
echo -e "${BLUE}Registry:${NC} ${REGISTRY_URL}"
|
||||||
|
echo -e "${BLUE}Image:${NC} ${FULL_IMAGE_NAME}"
|
||||||
|
echo -e "${BLUE}User:${NC} ${CI_GITEA_USER}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Prüfen ob das Image lokal existiert
|
||||||
|
echo -e "${YELLOW}Checking if image exists locally...${NC}"
|
||||||
|
if ! docker image inspect "$FULL_IMAGE_NAME" > /dev/null 2>&1; then
|
||||||
|
echo -e "${RED}ERROR: Image ${FULL_IMAGE_NAME} not found locally${NC}"
|
||||||
|
echo -e "${YELLOW}Please build the image first using ./build.sh${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✓ Image found locally${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Login zur Gitea Registry
|
||||||
|
echo -e "${YELLOW}Logging in to Gitea Registry...${NC}"
|
||||||
|
echo "$CI_GITEA_TOKEN" | docker login "$REGISTRY_URL" -u "$CI_GITEA_USER" --password-stdin
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✓ Successfully logged in to ${REGISTRY_URL}${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}ERROR: Failed to login to registry${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Image pushen
|
||||||
|
echo -e "${YELLOW}Pushing image to registry...${NC}"
|
||||||
|
docker push "$FULL_IMAGE_NAME"
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✓ Successfully pushed image!${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}Image available at:${NC}"
|
||||||
|
echo -e " ${FULL_IMAGE_NAME}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Pull-Befehl anzeigen
|
||||||
|
echo -e "${BLUE}To pull this image:${NC}"
|
||||||
|
echo -e " docker pull ${FULL_IMAGE_NAME}"
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo -e "${RED}ERROR: Failed to push image${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Logout
|
||||||
|
echo -e "${YELLOW}Logging out from registry...${NC}"
|
||||||
|
docker logout "$REGISTRY_URL" > /dev/null 2>&1
|
||||||
|
echo -e "${GREEN}✓ Logged out${NC}"
|
||||||
Reference in New Issue
Block a user