diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e812a15..2d35a5d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -67,6 +67,65 @@ deploy:staging: echo "πŸš€ Deploy ${CI_ENVIRONMENT_NAME} β†’ ${FTP_HOST}:${TARGET_PATH}" + # ------------------------------------------- + # πŸ”’ Versionierung: versions.php laden/bauen + # ------------------------------------------- + VERSION_WORK_FILE=".ci_versions_${CI_ENVIRONMENT_NAME}.php" + REMOTE_VERSION_PATH="${TARGET_PATH}${CONFIG_BASE_DIR}/versions.php" + + echo "πŸ” Versuche, bestehende Versionsdatei vom Server zu laden: ${REMOTE_VERSION_PATH}" + + if lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " + set ftp:ssl-force true; + set ftp:passive-mode true; + set ftp:ssl-protect-data true; + set ssl:verify-certificate no; + get ${REMOTE_VERSION_PATH} -o ${VERSION_WORK_FILE}; + bye + "; then + echo "βœ… Remote versions.php gefunden und lokal gespeichert in ${VERSION_WORK_FILE}" + else + echo "⚠️ Keine Remote-Versionsdatei gefunden – verwende Repo-Default (wenn vorhanden)." + if [ -f \"${CONFIG_ENV_DIR}/versions.php\" ]; then + cp \"${CONFIG_ENV_DIR}/versions.php\" \"${VERSION_WORK_FILE}\" + echo \"ℹ️ ${CONFIG_ENV_DIR}/versions.php β†’ ${VERSION_WORK_FILE}\" + else + echo \"⚠️ Keine versions.php im Repo gefunden – starte mit 1.0.0\" + cat > \"${VERSION_WORK_FILE}\" </dev/null | tr -cd '0-9') + SUB=$(grep '\$subversion' \"${VERSION_WORK_FILE}\" 2>/dev/null | tr -cd '0-9') + PATCH=$(grep '\$patchversion' \"${VERSION_WORK_FILE}\" 2>/dev/null | tr -cd '0-9') + + [ -z \"$MAIN\" ] && MAIN=1 + [ -z \"$SUB\" ] && SUB=0 + [ -z \"$PATCH\" ] && PATCH=0 + + PATCH=$((PATCH + 1)) + + echo \"πŸ†™ Baue neue STAGING-Version: ${MAIN}.${SUB}.${PATCH}\" + + cat > \"${VERSION_WORK_FILE}\" < public/build_version.txt + + # ------------------------------------------- + # πŸ” Deploy Basisverzeichnisse + # ------------------------------------------- for d in $BASE_DIRS; do echo "πŸ” Sync ${d}/ β†’ ${TARGET_PATH}${d}/" lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " @@ -97,6 +156,10 @@ deploy:staging: cp -R ${CONFIG_ENV_DIR}/. .ci_config_deploy/ fi + # Aktualisierte versions.php in den Config-Deploy-Ordner legen + echo "βž• Aktuelle versions.php in .ci_config_deploy/ ΓΌbernehmen" + cp "${VERSION_WORK_FILE}" .ci_config_deploy/versions.php + echo "πŸ” Sync .ci_config_deploy/ β†’ ${TARGET_PATH}${CONFIG_BASE_DIR}/" lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " set ftp:ssl-force true; @@ -174,6 +237,65 @@ deploy:production: echo "πŸš€ Deploy ${CI_ENVIRONMENT_NAME} β†’ ${FTP_HOST}:${TARGET_PATH}" + # ------------------------------------------- + # πŸ”’ Versionierung: versions.php laden/bauen + # ------------------------------------------- + VERSION_WORK_FILE=".ci_versions_${CI_ENVIRONMENT_NAME}.php" + REMOTE_VERSION_PATH="${TARGET_PATH}${CONFIG_BASE_DIR}/versions.php" + + echo "πŸ” Versuche, bestehende Versionsdatei vom Server zu laden: ${REMOTE_VERSION_PATH}" + + if lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " + set ftp:ssl-force true; + set ftp:passive-mode true; + set ftp:ssl-protect-data true; + set ssl:verify-certificate no; + get ${REMOTE_VERSION_PATH} -o ${VERSION_WORK_FILE}; + bye + "; then + echo "βœ… Remote versions.php gefunden und lokal gespeichert in ${VERSION_WORK_FILE}" + else + echo "⚠️ Keine Remote-Versionsdatei gefunden – verwende Repo-Default (wenn vorhanden)." + if [ -f \"${CONFIG_ENV_DIR}/versions.php\" ]; then + cp \"${CONFIG_ENV_DIR}/versions.php\" \"${VERSION_WORK_FILE}\" + echo \"ℹ️ ${CONFIG_ENV_DIR}/versions.php β†’ ${VERSION_WORK_FILE}\" + else + echo \"⚠️ Keine versions.php im Repo gefunden – starte mit 1.0.0\" + cat > \"${VERSION_WORK_FILE}\" </dev/null | tr -cd '0-9') + SUB=$(grep '\$subversion' \"${VERSION_WORK_FILE}\" 2>/dev/null | tr -cd '0-9') + PATCH=$(grep '\$patchversion' \"${VERSION_WORK_FILE}\" 2>/dev/null | tr -cd '0-9') + + [ -z \"$MAIN\" ] && MAIN=1 + [ -z \"$SUB\" ] && SUB=0 + [ -z \"$PATCH\" ] && PATCH=0 + + PATCH=$((PATCH + 1)) + + echo \"πŸ†™ Baue neue PROD-Version: ${MAIN}.${SUB}.${PATCH}\" + + cat > \"${VERSION_WORK_FILE}\" < public/build_version.txt + + # ------------------------------------------- + # πŸ” Deploy Basisverzeichnisse + # ------------------------------------------- for d in $BASE_DIRS; do echo "πŸ” Sync ${d}/ β†’ ${TARGET_PATH}${d}/" lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " @@ -204,6 +326,10 @@ deploy:production: cp -R ${CONFIG_ENV_DIR}/. .ci_config_deploy/ fi + # Aktualisierte versions.php in den Config-Deploy-Ordner legen + echo "βž• Aktuelle versions.php in .ci_config_deploy/ ΓΌbernehmen" + cp "${VERSION_WORK_FILE}" .ci_config_deploy/versions.php + echo "πŸ” Sync .ci_config_deploy/ β†’ ${TARGET_PATH}${CONFIG_BASE_DIR}/" lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " set ftp:ssl-force true; @@ -224,4 +350,3 @@ deploy:production: only: - main # when: manual - diff --git a/config/fileload.php b/config/fileload.php index 4039184..cc81b57 100644 --- a/config/fileload.php +++ b/config/fileload.php @@ -7,12 +7,12 @@ // ----------------------------------------------------------- // Try to load primary environment bootstrap. $bootstrapCandidates = [__DIR__ . '/config.php']; +$bootstrapCandidates = [__DIR__ . '/versions.php']; + $envHint = getenv('APP_ENV') ?: (getenv('APP_ENV_FILE') ?: null); if ($envHint) { $bootstrapCandidates[] = __DIR__ . '/' . $envHint . '/config.php'; } -$bootstrapCandidates[] = __DIR__ . '/staging/config.php'; -$bootstrapCandidates[] = __DIR__ . '/prod/config.php'; $bootstrapLoaded = false; foreach ($bootstrapCandidates as $bootstrap) { if ($bootstrap && is_file($bootstrap)) { @@ -35,6 +35,50 @@ if (is_file($emailtemplateConfigPath)) { $GLOBALS['app_env'] = APP_ENV; $GLOBALS['app_base_url'] = APP_URL_PRIMARY; $GLOBALS['app_api_base'] = $apiBaseUrl; +$GLOBALS['app_version'] = "{$mainversion}.{$subversion}.{$patchversion}"; + +if (!function_exists('render_app_version_badge')) { + function render_app_version_badge(): void + { + if (php_sapi_name() === 'cli') { + return; + } + + static $badgeRendered = false; + if ($badgeRendered) { + return; + } + $badgeRendered = true; + + $version = $GLOBALS['app_version'] ?? null; + if (!$version) { + return; + } + $versionText = htmlspecialchars((string)$version, ENT_QUOTES, 'UTF-8'); + + echo << +.app-version-badge{position:fixed;right:12px;bottom:12px;z-index:2147483000;font-size:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#0f172a;background:rgba(248,250,252,.85);border:1px solid rgba(148,163,184,.6);border-radius:999px;padding:4px 10px;box-shadow:0 8px 20px rgba(15,23,42,.15);backdrop-filter:blur(6px);} +@media print {.app-version-badge{display:none}} + + +HTML; + } +} + +if (!defined('APP_VERSION_BADGE_REGISTERED')) { + register_shutdown_function('render_app_version_badge'); + define('APP_VERSION_BADGE_REGISTERED', true); +} // ----------------------------------------------------------- // set cookie / session parameters diff --git a/config/prod/versions.php b/config/prod/versions.php new file mode 100644 index 0000000..56e410d --- /dev/null +++ b/config/prod/versions.php @@ -0,0 +1,4 @@ +