70 lines
2.5 KiB
YAML
70 lines
2.5 KiB
YAML
name: Deploy Next.js to Raspberry Pi
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- production
|
|
- dev
|
|
- preview
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: self-hosted # Der Runner sollte auf dem Raspberry Pi laufen
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Set Environment Variables
|
|
run: |
|
|
if [[ "${{ github.ref_name }}" == "production" ]]; then
|
|
echo "DEPLOY_ENV=production" >> $GITHUB_ENV
|
|
echo "PORT=3000" >> $GITHUB_ENV
|
|
elif [[ "${{ github.ref_name }}" == "dev" ]]; then
|
|
echo "DEPLOY_ENV=dev" >> $GITHUB_ENV
|
|
echo "PORT=3001" >> $GITHUB_ENV
|
|
elif [[ "${{ github.ref_name }}" == "preview" ]]; then
|
|
echo "DEPLOY_ENV=preview" >> $GITHUB_ENV
|
|
echo "PORT=3002" >> $GITHUB_ENV
|
|
fi
|
|
|
|
- name: Build Docker Image
|
|
run: |
|
|
IMAGE_NAME="my-nextjs-app:$DEPLOY_ENV"
|
|
docker build -t $IMAGE_NAME .
|
|
|
|
- name: Deploy on Raspberry Pi (Zero-Downtime)
|
|
run: |
|
|
CONTAINER_NAME="nextjs-$DEPLOY_ENV"
|
|
IMAGE_NAME="my-nextjs-app:$DEPLOY_ENV"
|
|
NEW_CONTAINER_NAME="$CONTAINER_NAME-new"
|
|
|
|
# Prüft, ob der alte Container existiert und entfernt ihn
|
|
if [ $(docker ps -aq -f name=$NEW_CONTAINER_NAME) ]; then
|
|
echo "Removing existing new container ($NEW_CONTAINER_NAME)..."
|
|
docker rm -f "$NEW_CONTAINER_NAME" || true
|
|
fi
|
|
|
|
# Führt den neuen Container auf einem temporären internen Port aus
|
|
docker run -d --name "$NEW_CONTAINER_NAME" -p 30000:3000 $IMAGE_NAME
|
|
|
|
# Warten, um sicherzustellen, dass der neue Container läuft
|
|
sleep 10
|
|
|
|
# Prüfen, ob der neue Container erfolgreich läuft
|
|
if [ $(docker inspect --format='{{.State.Running}}' $NEW_CONTAINER_NAME) == "true" ]; then
|
|
# Stoppt und entfernt den alten Container, falls vorhanden
|
|
if [ $(docker ps -aq -f name=$CONTAINER_NAME) ]; then
|
|
docker stop "$CONTAINER_NAME" || true
|
|
docker rm "$CONTAINER_NAME" || true
|
|
fi
|
|
|
|
# Benennt den neuen Container zum alten Namen um und weist den gewünschten Port zu
|
|
docker rename "$NEW_CONTAINER_NAME" "$CONTAINER_NAME"
|
|
docker run -d --name "$CONTAINER_NAME" -p $PORT:3000 $IMAGE_NAME
|
|
else
|
|
echo "New container failed to start."
|
|
docker logs $NEW_CONTAINER_NAME
|
|
exit 1
|
|
fi
|