*  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
This commit is contained in:
denshooter
2025-02-18 14:02:39 +01:00
committed by GitHub
parent 0cbec0bb19
commit 3c26e00d9b
5 changed files with 233 additions and 146 deletions

40
.github/workflows/build.yml vendored Normal file
View File

@@ -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 <<EOF
NEXT_PUBLIC_BASE_URL=${{ vars.NEXT_PUBLIC_BASE_URL }}
NEXT_PUBLIC_GHOST_API_URL=${{ vars.NEXT_PUBLIC_GHOST_API_URL }}
NEXT_PUBLIC_GHOST_API_KEY=${{ secrets.NEXT_PUBLIC_GHOST_API_KEY }}
NEXT_PUBLIC_MY_EMAIL=${{ vars.NEXT_PUBLIC_MY_EMAIL }}
NEXT_PUBLIC_MY_PASSWORD=${{ secrets.NEXT_PUBLIC_MY_PASSWORD }}
EOF
echo "Created .env file:" && cat .env
- name: Build & Push Docker Image
run: |
# Nutzt den Branch-Namen aus dem auslösenden Workflow
IMAGE_NAME="ghcr.io/${{ github.repository_owner }}/my-nextjs-app:${{ github.event.workflow_run.head_branch }}"
docker buildx create --use
docker buildx build --platform linux/arm64 -t "$IMAGE_NAME" --push .

70
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,70 @@
name: Deploy to Raspberry Pi
on:
workflow_run:
workflows: ["Build and Push Docker Image"]
types:
- completed
branches:
- production
- dev
- preview
jobs:
deploy:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: self-hosted
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set Deployment Variables
run: |
if [[ "${{ github.event.workflow_run.head_branch }}" == "production" ]]; then
echo "DEPLOY_ENV=production" >> $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

56
.github/workflows/lint.yml vendored Normal file
View File

@@ -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

View File

@@ -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

67
.github/workflows/test.yml vendored Normal file
View File

@@ -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 <<EOF
NEXT_PUBLIC_BASE_URL=${{ vars.NEXT_PUBLIC_BASE_URL }}
NEXT_PUBLIC_GHOST_API_URL=${{ vars.NEXT_PUBLIC_GHOST_API_URL }}
NEXT_PUBLIC_GHOST_API_KEY=${{ secrets.NEXT_PUBLIC_GHOST_API_KEY }}
NEXT_PUBLIC_MY_EMAIL=${{ vars.NEXT_PUBLIC_MY_EMAIL }}
NEXT_PUBLIC_MY_PASSWORD=${{ secrets.NEXT_PUBLIC_MY_PASSWORD }}
EOF
echo ".env file created:" && cat .env
- name: Run Tests
run: npm run test