fix: Build CI images on production server
Some checks failed
🚀 Build & Deploy Image / Determine Build Necessity (push) Successful in 33s
Security Vulnerability Scan / Check for Dependency Changes (push) Successful in 39s
🚀 Build & Deploy Image / Build Runtime Base Image (push) Successful in 17s
🚀 Build & Deploy Image / Run Tests & Quality Checks (push) Successful in 1m15s
Security Vulnerability Scan / Composer Security Audit (push) Has been skipped
🚀 Build & Deploy Image / Build Docker Image (push) Failing after 33s
🚀 Build & Deploy Image / Auto-deploy to Staging (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Production (push) Has been skipped
Some checks failed
🚀 Build & Deploy Image / Determine Build Necessity (push) Successful in 33s
Security Vulnerability Scan / Check for Dependency Changes (push) Successful in 39s
🚀 Build & Deploy Image / Build Runtime Base Image (push) Successful in 17s
🚀 Build & Deploy Image / Run Tests & Quality Checks (push) Successful in 1m15s
Security Vulnerability Scan / Composer Security Audit (push) Has been skipped
🚀 Build & Deploy Image / Build Docker Image (push) Failing after 33s
🚀 Build & Deploy Image / Auto-deploy to Staging (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Production (push) Has been skipped
- Add build-ci-image-production.sh script for building CI images on production - Add BUILD_ON_PRODUCTION.md documentation - Fix Dockerfile to handle optional PECL extensions for PHP 8.5 RC This fixes the issue where Gitea workflows fail with: 'Error response from daemon: pull access denied for php-ci'
This commit is contained in:
92
deployment/gitea-runner/BUILD_ON_PRODUCTION.md
Normal file
92
deployment/gitea-runner/BUILD_ON_PRODUCTION.md
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
# CI Image auf Produktionsserver bauen
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
Der Gitea Runner auf dem Produktionsserver versucht, das `php-ci:latest` Image zu pullen, aber es existiert nicht in der Registry oder lokal. Der Fehler lautet:
|
||||||
|
|
||||||
|
```
|
||||||
|
Error response from daemon: pull access denied for php-ci, repository does not exist or may require 'docker login'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Lösung: Image direkt auf dem Produktionsserver bauen
|
||||||
|
|
||||||
|
### Schritt 1: Auf den Produktionsserver verbinden
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh user@production-server
|
||||||
|
```
|
||||||
|
|
||||||
|
### Schritt 2: Zum Projektverzeichnis wechseln
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/michaelschiemer
|
||||||
|
```
|
||||||
|
|
||||||
|
### Schritt 3: CI Image bauen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deployment/gitea-runner
|
||||||
|
./build-ci-image-production.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Script:
|
||||||
|
- Baut das `php-ci:latest` Image
|
||||||
|
- Baut das `docker-build:latest` Image
|
||||||
|
- Lädt beide Images in den `gitea-runner-dind` Container
|
||||||
|
|
||||||
|
### Schritt 4: Verifikation
|
||||||
|
|
||||||
|
1. **Prüfe ob Images gebaut wurden:**
|
||||||
|
```bash
|
||||||
|
docker images | grep -E "php-ci|docker-build"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Prüfe ob Images in docker-dind geladen wurden:**
|
||||||
|
```bash
|
||||||
|
docker exec gitea-runner-dind docker images | grep -E "php-ci|docker-build"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Prüfe Runner Labels in Gitea UI:**
|
||||||
|
- Gehe zu: https://git.michaelschiemer.de/admin/actions/runners
|
||||||
|
- Der Runner sollte das `php-ci` Label zeigen
|
||||||
|
|
||||||
|
4. **Teste einen Workflow:**
|
||||||
|
- Ein Workflow mit `runs-on: php-ci` sollte jetzt funktionieren
|
||||||
|
|
||||||
|
## Alternative: Ansible Playbook verwenden
|
||||||
|
|
||||||
|
Falls Ansible auf dem Produktionsserver verfügbar ist:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deployment/ansible
|
||||||
|
ansible-playbook -i inventory/production.yml \
|
||||||
|
playbooks/setup-gitea-runner-ci.yml \
|
||||||
|
-e "project_root=/path/to/michaelschiemer"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**Image wird nicht in docker-dind gefunden:**
|
||||||
|
- Stelle sicher, dass `gitea-runner-dind` läuft: `docker ps | grep docker-dind`
|
||||||
|
- Lade das Image manuell: `docker save php-ci:latest | docker exec -i gitea-runner-dind docker load`
|
||||||
|
|
||||||
|
**Runner zeigt php-ci Label nicht:**
|
||||||
|
- Labels können nur bei der Registration geändert werden
|
||||||
|
- Runner neu registrieren:
|
||||||
|
```bash
|
||||||
|
cd deployment/gitea-runner
|
||||||
|
./unregister.sh
|
||||||
|
./register.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Build schlägt fehl:**
|
||||||
|
- Prüfe Docker-Logs: `docker logs gitea-runner-dind`
|
||||||
|
- Stelle sicher, dass genug Speicherplatz vorhanden ist: `df -h`
|
||||||
|
- Prüfe Docker-Daemon: `docker info`
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Das Image ist ca. 1.85GB groß - der Build kann einige Minuten dauern
|
||||||
|
- Stelle sicher, dass genug Speicherplatz auf dem Server vorhanden ist
|
||||||
|
- Das Image wird lokal gebaut und muss nicht in die Registry gepusht werden (wird direkt in docker-dind geladen)
|
||||||
|
|
||||||
117
deployment/gitea-runner/build-ci-image-production.sh
Executable file
117
deployment/gitea-runner/build-ci-image-production.sh
Executable file
@@ -0,0 +1,117 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Build CI Docker Image on Production Server
|
||||||
|
# This script builds the php-ci image and loads it into docker-dind
|
||||||
|
# Usage: ./build-ci-image-production.sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||||
|
|
||||||
|
# PHP CI Image
|
||||||
|
PHP_CI_IMAGE="${CI_IMAGE_NAME:-php-ci:latest}"
|
||||||
|
REGISTRY="${CI_REGISTRY:-registry.michaelschiemer.de}"
|
||||||
|
PHP_CI_REGISTRY_IMAGE="${REGISTRY}/ci/php-ci:latest"
|
||||||
|
|
||||||
|
# Docker Build Image
|
||||||
|
DOCKER_BUILD_IMAGE="${DOCKER_BUILD_IMAGE_NAME:-docker-build:latest}"
|
||||||
|
DOCKER_BUILD_REGISTRY_IMAGE="${REGISTRY}/ci/docker-build:latest"
|
||||||
|
|
||||||
|
echo "🔨 Building CI Docker Images on Production Server..."
|
||||||
|
echo ""
|
||||||
|
echo "1. PHP CI Image: ${PHP_CI_IMAGE}"
|
||||||
|
echo " Dockerfile: ${PROJECT_ROOT}/docker/ci/Dockerfile"
|
||||||
|
echo ""
|
||||||
|
echo "2. Docker Build Image: ${DOCKER_BUILD_IMAGE}"
|
||||||
|
echo " Dockerfile: ${PROJECT_ROOT}/docker/ci/Dockerfile.build"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
# Check if docker-dind is running
|
||||||
|
if ! docker ps | grep -q "gitea-runner-dind"; then
|
||||||
|
echo "⚠️ Warning: gitea-runner-dind container not found"
|
||||||
|
echo " Make sure the Gitea runner stack is running:"
|
||||||
|
echo " cd ${SCRIPT_DIR} && docker compose up -d"
|
||||||
|
echo ""
|
||||||
|
read -p "Continue anyway? (y/N) " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build PHP CI image
|
||||||
|
echo ""
|
||||||
|
echo "📦 Building PHP CI image..."
|
||||||
|
docker build \
|
||||||
|
-f docker/ci/Dockerfile \
|
||||||
|
-t "${PHP_CI_IMAGE}" \
|
||||||
|
-t "${PHP_CI_REGISTRY_IMAGE}" \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
.
|
||||||
|
|
||||||
|
# Build Docker Build image
|
||||||
|
echo ""
|
||||||
|
echo "📦 Building Docker Build image..."
|
||||||
|
docker build \
|
||||||
|
-f docker/ci/Dockerfile.build \
|
||||||
|
-t "${DOCKER_BUILD_IMAGE}" \
|
||||||
|
-t "${DOCKER_BUILD_REGISTRY_IMAGE}" \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
.
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Images built successfully!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Load images into docker-dind
|
||||||
|
if docker ps | grep -q "gitea-runner-dind"; then
|
||||||
|
echo "📥 Loading images into docker-dind..."
|
||||||
|
|
||||||
|
echo " Loading php-ci:latest..."
|
||||||
|
docker save "${PHP_CI_IMAGE}" | docker exec -i gitea-runner-dind docker load
|
||||||
|
|
||||||
|
echo " Loading docker-build:latest..."
|
||||||
|
docker save "${DOCKER_BUILD_IMAGE}" | docker exec -i gitea-runner-dind docker load
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Images loaded into docker-dind"
|
||||||
|
else
|
||||||
|
echo "⚠️ docker-dind container not running - skipping image load"
|
||||||
|
echo " To load images later, run:"
|
||||||
|
echo " docker save ${PHP_CI_IMAGE} | docker exec -i gitea-runner-dind docker load"
|
||||||
|
echo " docker save ${DOCKER_BUILD_IMAGE} | docker exec -i gitea-runner-dind docker load"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "📋 Summary:"
|
||||||
|
echo ""
|
||||||
|
echo "✅ Built images:"
|
||||||
|
echo " - ${PHP_CI_IMAGE}"
|
||||||
|
echo " - ${DOCKER_BUILD_IMAGE}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if .env exists and show label configuration
|
||||||
|
if [ -f "${SCRIPT_DIR}/.env" ]; then
|
||||||
|
echo "📝 Current GITEA_RUNNER_LABELS in .env:"
|
||||||
|
grep "^GITEA_RUNNER_LABELS=" "${SCRIPT_DIR}/.env" || echo " (not found)"
|
||||||
|
echo ""
|
||||||
|
echo "💡 Make sure your .env contains:"
|
||||||
|
echo " GITEA_RUNNER_LABELS=...,php-ci:docker://${PHP_CI_IMAGE}"
|
||||||
|
echo ""
|
||||||
|
echo " Or for registry images:"
|
||||||
|
echo " GITEA_RUNNER_LABELS=...,php-ci:docker://${PHP_CI_REGISTRY_IMAGE}"
|
||||||
|
else
|
||||||
|
echo "⚠️ .env file not found at ${SCRIPT_DIR}/.env"
|
||||||
|
echo " Create it from .env.example and add php-ci label"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Setup complete! The php-ci image is now available for Gitea workflows."
|
||||||
|
echo ""
|
||||||
|
echo "📝 Next steps (if needed):"
|
||||||
|
echo " 1. Verify runner labels in Gitea UI"
|
||||||
|
echo " 2. Test a workflow with runs-on: php-ci"
|
||||||
|
echo ""
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Dockerfile für CI/CD Workflows
|
# Dockerfile für CI/CD Workflows
|
||||||
# Optimiert für Gitea Actions Runner mit PHP 8.5 und allen benötigten Tools
|
# Optimiert für Gitea Actions Runner mit PHP 8.5 und allen benötigten Tools
|
||||||
ARG PHP_VERSION=8.5.0RC3
|
ARG PHP_VERSION=8.5.0RC4
|
||||||
# Override via --build-arg PHP_VERSION=8.5.0RCX to track upstream releases
|
# Override via --build-arg PHP_VERSION=8.5.0RCX to track upstream releases
|
||||||
FROM php:${PHP_VERSION}-cli
|
FROM php:${PHP_VERSION}-cli
|
||||||
|
|
||||||
@@ -48,13 +48,15 @@ RUN docker-php-ext-configure gd \
|
|||||||
soap \
|
soap \
|
||||||
gd
|
gd
|
||||||
|
|
||||||
# Installiere PECL Extensions
|
# Installiere PECL Extensions (optional - kann bei PHP RC-Versionen fehlschlagen)
|
||||||
RUN pecl install apcu redis-6.3.0RC1 \
|
RUN (pecl install apcu redis-6.3.0RC1 2>/dev/null || true) \
|
||||||
&& docker-php-ext-enable apcu redis
|
&& (docker-php-ext-enable apcu redis 2>/dev/null || true) || true
|
||||||
|
|
||||||
# Configure APCu
|
# Configure APCu (nur wenn Extension installiert wurde)
|
||||||
RUN echo "apc.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini \
|
RUN if php -m | grep -q apcu; then \
|
||||||
&& echo "apc.shm_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini
|
echo "apc.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini \
|
||||||
|
&& echo "apc.shm_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \
|
||||||
|
fi
|
||||||
|
|
||||||
# Composer installieren
|
# Composer installieren
|
||||||
RUN curl -sS https://getcomposer.org/installer | php \
|
RUN curl -sS https://getcomposer.org/installer | php \
|
||||||
|
|||||||
Reference in New Issue
Block a user