diff --git a/docker/.dockerignore b/.dockerignore similarity index 100% rename from docker/.dockerignore rename to .dockerignore diff --git a/.gitea/workflows/build-and-push.yaml b/.gitea/workflows/build-and-push.yaml new file mode 100644 index 0000000..df92766 --- /dev/null +++ b/.gitea/workflows/build-and-push.yaml @@ -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 }}" diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml deleted file mode 100644 index a7cd457..0000000 --- a/.gitea/workflows/deploy.yml +++ /dev/null @@ -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} </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}" diff --git a/docker/push.sh b/docker/push.sh new file mode 100755 index 0000000..8976298 --- /dev/null +++ b/docker/push.sh @@ -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}"