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@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: 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" # Entferne vorhandenen temporären Container, falls vorhanden 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 # Starte den neuen Container auf einem temporären internen Port docker run -d --name "$NEW_CONTAINER_NAME" -p 40000:3000 $IMAGE_NAME # Warte, um sicherzustellen, dass der neue Container läuft sleep 10 # Prüfe, ob der neue Container erfolgreich läuft if [ "$(docker inspect --format='{{.State.Running}}' $NEW_CONTAINER_NAME)" == "true" ]; then # Stoppe und entferne 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 # Stoppe und entferne den temporären Container docker stop "$NEW_CONTAINER_NAME" || true docker rm "$NEW_CONTAINER_NAME" || true # Starte den Container mit dem gewünschten Namen und Port 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