From 3c26e00d9bde9e5445cfe69698d56fc77f65fc96 Mon Sep 17 00:00:00 2001 From: denshooter <44590296+denshooter@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:02:39 +0100 Subject: [PATCH] Dev (#39) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ chore: update CI workflow to include testing and multi-arch build (#29) * ✨ chore: remove unused dependencies from package-lock.json and updated to a better local dev environment (#30) * ✨ test: add unit tests * ✨ test: add unit tests for whole project * ✨ feat: add whatwg-fetch for improved fetch support * ✨ chore: update Node.js version to 22 in workflow * ✨ refactor: update types and improve email handling tests * ✨ refactor: remove unused imports * ✨ fix: normalize image name to lowercase in workflows * ✨ fix: ensure Docker image names are consistently lowercase * ✨ chore: update * ✨ chore: update base URL to use secret variable * ✨ chore: update to login to ghcr * ✨ fix: add missing 'fi' to close if statement in workflow * D branch 1 (#32) * full upgrade (#31) * ✨ chore: update CI workflow to include testing and multi-arch build (#29) * ✨ chore: remove unused dependencies from package-lock.json and updated to a better local dev environment (#30) * ✨ test: add unit tests * ✨ test: add unit tests for whole project * ✨ feat: add whatwg-fetch for improved fetch support * ✨ chore: update Node.js version to 22 in workflow * ✨ refactor: update types and improve email handling tests * ✨ refactor: remove unused imports * ✨ fix: normalize image name to lowercase in workflows * ✨ fix: ensure Docker image names are consistently lowercase * ✨ chore: update * ✨ chore: update base URL to use secret variable * ✨ chore: update to login to ghcr * ✨ fix: add missing 'fi' to close if statement in workflow * 🚀 fix: update Docker run commands to use specific network * D branch 1 (#34) * full upgrade (#31) * ✨ chore: update CI workflow to include testing and multi-arch build (#29) * ✨ chore: remove unused dependencies from package-lock.json and updated to a better local dev environment (#30) * ✨ test: add unit tests * ✨ test: add unit tests for whole project * ✨ feat: add whatwg-fetch for improved fetch support * ✨ chore: update Node.js version to 22 in workflow * ✨ refactor: update types and improve email handling tests * ✨ refactor: remove unused imports * ✨ fix: normalize image name to lowercase in workflows * ✨ fix: ensure Docker image names are consistently lowercase * ✨ chore: update * ✨ chore: update base URL to use secret variable * ✨ chore: update to login to ghcr * ✨ fix: add missing 'fi' to close if statement in workflow * 🚀 fix: update Docker run commands to use specific network * ✨ fix: add error handling for invalid project data * D branch 2 (#35) * full upgrade (#31) * ✨ chore: update CI workflow to include testing and multi-arch build (#29) * ✨ chore: remove unused dependencies from package-lock.json and updated to a better local dev environment (#30) * ✨ test: add unit tests * ✨ test: add unit tests for whole project * ✨ feat: add whatwg-fetch for improved fetch support * ✨ chore: update Node.js version to 22 in workflow * ✨ refactor: update types and improve email handling tests * ✨ refactor: remove unused imports * ✨ fix: normalize image name to lowercase in workflows * ✨ fix: ensure Docker image names are consistently lowercase * ✨ chore: update * ✨ chore: update base URL to use secret variable * ✨ chore: update to login to ghcr * ✨ fix: add missing 'fi' to close if statement in workflow * ✨ fix: format code for better readability in Contact and Footer components * D branch 2 (#36) * full upgrade (#31) * ✨ chore: update CI workflow to include testing and multi-arch build (#29) * ✨ chore: remove unused dependencies from package-lock.json and updated to a better local dev environment (#30) * ✨ test: add unit tests * ✨ test: add unit tests for whole project * ✨ feat: add whatwg-fetch for improved fetch support * ✨ chore: update Node.js version to 22 in workflow * ✨ refactor: update types and improve email handling tests * ✨ refactor: remove unused imports * ✨ fix: normalize image name to lowercase in workflows * ✨ fix: ensure Docker image names are consistently lowercase * ✨ chore: update * ✨ chore: update base URL to use secret variable * ✨ chore: update to login to ghcr * ✨ fix: add missing 'fi' to close if statement in workflow * ✨ fix: format code for better readability in Contact and Footer components * 🚀 fix: update Docker commands and remove hardcoded API URL * Update main.yml * Update main.yml * Update main.yml * D branch 1 (#37) * full upgrade (#31) * ✨ chore: update CI workflow to include testing and multi-arch build (#29) * ✨ chore: remove unused dependencies from package-lock.json and updated to a better local dev environment (#30) * ✨ test: add unit tests * ✨ test: add unit tests for whole project * ✨ feat: add whatwg-fetch for improved fetch support * ✨ chore: update Node.js version to 22 in workflow * ✨ refactor: update types and improve email handling tests * ✨ refactor: remove unused imports * ✨ fix: normalize image name to lowercase in workflows * ✨ fix: ensure Docker image names are consistently lowercase * ✨ chore: update * ✨ chore: update base URL to use secret variable * ✨ chore: update to login to ghcr * ✨ fix: add missing 'fi' to close if statement in workflow * ✨ feat: display base URL in Hero component * Update main.yml * Update next.config.ts * next.config.ts aktualisieren * Update main.yml * ✨ chore: refactor environment variable handling in workflow * ✨ chore: update GitHub Actions workflow for improved security and caching * 🚀 chore: update Trivy action version and enhance config * ✨ chore: update GitHub Actions workflows and add linter * 🚫 chore: remove Docker image vulnerability scan step * ✨ chore: update environment variable logging in workflow * ✨ chore: add dynamic environment for deployment jobs * 🚀 chore: set deployment environment to GitHub ref name * 🎉 chore: remove environment variable exposure in CI/CD * ✨ chore: remove sensitive environment variable logging and update variable references * ✨ chore: log environment variables for debugging purposes * ✨ chore: create .env file for environment variables setup * ✨ feat: copy .env file to Docker image for config * ✨ refactor: update environment variables to public scope * ✨ chore: remove environment variable from Hero component * ✨ fix: update environment variable references in workflow * ✨ chore: add folder structure display to workflow steps * ✨ chore: reorder CI steps for improved workflow clarity * ✨ fix: remove unnecessary console logs and correct base URL variable * 🚀 feat: add GitHub Actions for deployment and testing workflows * ✨ chore: add branch filters for workflows in YAML files --- .github/workflows/build.yml | 40 ++++++++++ .github/workflows/deploy.yml | 70 +++++++++++++++++ .github/workflows/lint.yml | 56 ++++++++++++++ .github/workflows/main.yml | 146 ----------------------------------- .github/workflows/test.yml | 67 ++++++++++++++++ 5 files changed, 233 insertions(+), 146 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/main.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..066dd72 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: Build and Push Docker Image + +on: + workflow_run: + workflows: ["Test Code Base"] + types: + - completed + branches: + - production + - dev + - preview + +jobs: + build: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Log in to GHCR + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin + + - name: Create Deployment .env File + run: | + cat > .env <> $GITHUB_ENV + echo "PORT=4000" >> $GITHUB_ENV + elif [[ "${{ github.event.workflow_run.head_branch }}" == "dev" ]]; then + echo "DEPLOY_ENV=dev" >> $GITHUB_ENV + echo "PORT=4001" >> $GITHUB_ENV + elif [[ "${{ github.event.workflow_run.head_branch }}" == "preview" ]]; then + echo "DEPLOY_ENV=preview" >> $GITHUB_ENV + echo "PORT=4002" >> $GITHUB_ENV + fi + + - name: Log in to GHCR + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin + + - name: Pull Docker Image + run: | + IMAGE_NAME="ghcr.io/${{ github.repository_owner }}/my-nextjs-app:${{ github.event.workflow_run.head_branch }}" + IMAGE_NAME=$(echo "$IMAGE_NAME" | tr '[:upper:]' '[:lower:]') + docker pull "$IMAGE_NAME" + + - name: Zero-Downtime Deployment + run: | + CONTAINER_NAME="nextjs-$DEPLOY_ENV" + NEW_CONTAINER_NAME="$CONTAINER_NAME-new" + + # Entferne vorhandenen temporären Container, falls vorhanden + docker rm -f "$NEW_CONTAINER_NAME" || true + + echo "Deploying $CONTAINER_NAME with $IMAGE_NAME" + + # Starte neuen Container auf einem temporären Port + docker run -d --name "$NEW_CONTAINER_NAME" --network big-bear-ghost_ghost-network -p 40000:3000 \ + -e NODE_ENV=production \ + "$IMAGE_NAME" + + sleep 10 + + if [ "$(docker inspect --format='{{.State.Running}}' "$NEW_CONTAINER_NAME")" = "true" ]; then + docker stop "$CONTAINER_NAME" || true + docker rm "$CONTAINER_NAME" || true + docker rename "$NEW_CONTAINER_NAME" "$CONTAINER_NAME" + docker network connect big-bear-ghost_ghost-network "$CONTAINER_NAME" + echo "Deployment erfolgreich!" + else + echo "Neuer Container konnte nicht gestartet werden!" + docker logs "$NEW_CONTAINER_NAME" + exit 1 + fi diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..0e646ac --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,56 @@ +name: Lint Code Base + +on: + push: + branches: + - production + - dev + - preview + paths: + - 'app/**' + - 'public/**' + - 'styles/**' + - 'Dockerfile' + - 'docker-compose.yml' + - '.github/workflows/**' + - 'next.config.ts' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - 'tailwind.config.ts' + pull_request: + branches: + - production + - dev + - preview + paths: + - 'app/**' + - 'public/**' + - 'styles/**' + - 'Dockerfile' + - 'docker-compose.yml' + - '.github/workflows/**' + - 'next.config.ts' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - 'tailwind.config.ts' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'npm' + + - name: Install Dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index c452141..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,146 +0,0 @@ -name: CI and Deploy to Raspberry Pi - -on: - push: - branches: - - production - - dev - - preview - paths: - - 'app/**' - - 'public/**' - - 'styles/**' - - 'Dockerfile' - - 'docker-compose.yml' - - '.github/workflows/main.yml' - - 'next.config.ts' - - 'package.json' - - 'package-lock.json' - - 'tsconfig.json' - - 'tailwind.config.ts' - -jobs: - test_and_build: - runs-on: ubuntu-latest - steps: - - name: Check Out Code - uses: actions/checkout@v4 - - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '22' - - - name: Cache Node.js modules - uses: actions/cache@v4 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Create env file - run: | - touch .env - echo "NEXT_PUBLIC_BASE_URL=${{ vars.NEXT_PUBLIC_BASE_URL }}" >> .env - echo "NEXT_PUBLIC_GHOST_API_URL=${{ vars.NEXT_PUBLIC_GHOST_API_URL }}" >> .env - echo "NEXT_PUBLIC_GHOST_API_KEY=${{ secrets.NEXT_PUBLIC_GHOST_API_KEY }}" >> .env - echo "NEXT_PUBLIC_MY_EMAIL=${{ vars.NEXT_PUBLIC_MY_EMAIL }}" >> .env - echo "NEXT_PUBLIC_MY_PASSWORD=${{ secrets.NEXT_PUBLIC_MY_PASSWORD }}" >> .env - cat .env - - - name: Show folder structure - run: | - ls -la - - - name: Install Dependencies - run: npm install - - - name: Run Tests - run: npm run test - - - name: Log in to GHCR - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin - - - name: Build and Push Multi-Arch Docker Image - run: | - IMAGE_NAME="ghcr.io/${{ github.repository_owner }}/my-nextjs-app:${{ github.ref_name }}" - docker buildx create --use - docker buildx build \ - --platform linux/arm64 \ - -t "$IMAGE_NAME" \ - --push \ - . - deploy: - runs-on: self-hosted - needs: test_and_build - steps: - - name: Check Out Code - uses: actions/checkout@v4 - - - name: Set Environment Variables - run: | - if [[ "${{ github.ref_name }}" == "production" ]]; then - echo "DEPLOY_ENV=production" >> $GITHUB_ENV - echo "PORT=4000" >> $GITHUB_ENV - elif [[ "${{ github.ref_name }}" == "dev" ]]; then - echo "DEPLOY_ENV=dev" >> $GITHUB_ENV - echo "PORT=4001" >> $GITHUB_ENV - elif [[ "${{ github.ref_name }}" == "preview" ]]; then - echo "DEPLOY_ENV=preview" >> $GITHUB_ENV - echo "PORT=4002" >> $GITHUB_ENV - fi - - - name: Log in to GHCR - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin - - - name: Pull Docker Image - run: | - IMAGE_NAME="ghcr.io/${{ github.repository_owner }}/my-nextjs-app:${{ github.ref_name }}" - IMAGE_NAME=$(echo "$IMAGE_NAME" | tr '[:upper:]' '[:lower:]') - docker pull "$IMAGE_NAME" - - - name: Deploy on Raspberry Pi (Zero-Downtime) - run: | - IMAGE_NAME="ghcr.io/${{ github.repository_owner }}/my-nextjs-app:${{ github.ref_name }}" - IMAGE_NAME=$(echo "$IMAGE_NAME" | tr '[:upper:]' '[:lower:]') - CONTAINER_NAME="nextjs-$DEPLOY_ENV" - NEW_CONTAINER_NAME="$CONTAINER_NAME-new" - - # Remove existing temporary container, if any - if [ "$(docker ps -aq -f name=$NEW_CONTAINER_NAME)" ]; then - docker rm -f "$NEW_CONTAINER_NAME" || true - fi - - echo "Deploying $CONTAINER_NAME with $IMAGE_NAME" - - # Start new container on a temporary internal port - docker run -d --name "$NEW_CONTAINER_NAME" --network big-bear-ghost_ghost-network -p 40000:3000 \ - "$IMAGE_NAME" - - # Wait for the new container to start - sleep 10 - - # Debugging: Check if the environment variables are set correctly - docker exec "$NEW_CONTAINER_NAME" printenv - - if [ "$(docker inspect --format='{{.State.Running}}' "$NEW_CONTAINER_NAME")" = "true" ]; then - # Stop/remove the old container - if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then - docker stop "$CONTAINER_NAME" || true - docker rm "$CONTAINER_NAME" || true - fi - - # Replace the new container with final name/port - docker stop "$NEW_CONTAINER_NAME" || true - docker rm "$NEW_CONTAINER_NAME" || true - - docker run -d --name "$CONTAINER_NAME" --network big-bear-ghost_ghost-network -p $PORT:3000 \ - "$IMAGE_NAME" - else - echo "New container failed to start." - docker logs "$NEW_CONTAINER_NAME" - exit 1 - fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..6598daa --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,67 @@ +name: Test Code Base + +on: + push: + branches: + - production + - dev + - preview + paths: + - 'app/**' + - 'public/**' + - 'styles/**' + - 'Dockerfile' + - 'docker-compose.yml' + - '.github/workflows/**' + - 'next.config.ts' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - 'tailwind.config.ts' + pull_request: + branches: + - production + - dev + - preview + paths: + - 'app/**' + - 'public/**' + - 'styles/**' + - 'Dockerfile' + - 'docker-compose.yml' + - '.github/workflows/**' + - 'next.config.ts' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - 'tailwind.config.ts' + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'npm' + + - name: Install Dependencies + run: npm ci + + - name: Create .env File + run: | + cat > .env <