This commit is contained in:
2025-12-10 00:32:10 +01:00
parent eba2625693
commit fc13c4f5c2
4 changed files with 180 additions and 3 deletions

View File

@@ -67,6 +67,65 @@ deploy:staging:
echo "🚀 Deploy ${CI_ENVIRONMENT_NAME} → ${FTP_HOST}:${TARGET_PATH}" 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}\" <<PHP
<?php
\$mainversion = 1;
\$subversion = 0;
\$patchversion = 0;
PHP
fi
fi
# Werte aus VERSION_WORK_FILE lesen
MAIN=$(grep '\$mainversion' \"${VERSION_WORK_FILE}\" 2>/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}\" <<PHP
<?php
\$mainversion = ${MAIN};
\$subversion = ${SUB};
\$patchversion = ${PATCH};
PHP
# Optional: Textdatei für Ausgabe auf der Webseite
echo \"${MAIN}.${SUB}.${PATCH}\" > public/build_version.txt
# -------------------------------------------
# 🔁 Deploy Basisverzeichnisse
# -------------------------------------------
for d in $BASE_DIRS; do for d in $BASE_DIRS; do
echo "🔁 Sync ${d}/ → ${TARGET_PATH}${d}/" echo "🔁 Sync ${d}/ → ${TARGET_PATH}${d}/"
lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e "
@@ -97,6 +156,10 @@ deploy:staging:
cp -R ${CONFIG_ENV_DIR}/. .ci_config_deploy/ cp -R ${CONFIG_ENV_DIR}/. .ci_config_deploy/
fi 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}/" echo "🔁 Sync .ci_config_deploy/ → ${TARGET_PATH}${CONFIG_BASE_DIR}/"
lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e "
set ftp:ssl-force true; set ftp:ssl-force true;
@@ -174,6 +237,65 @@ deploy:production:
echo "🚀 Deploy ${CI_ENVIRONMENT_NAME} → ${FTP_HOST}:${TARGET_PATH}" 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}\" <<PHP
<?php
\$mainversion = 1;
\$subversion = 0;
\$patchversion = 0;
PHP
fi
fi
# Werte aus VERSION_WORK_FILE lesen
MAIN=$(grep '\$mainversion' \"${VERSION_WORK_FILE}\" 2>/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}\" <<PHP
<?php
\$mainversion = ${MAIN};
\$subversion = ${SUB};
\$patchversion = ${PATCH};
PHP
# Optional: Textdatei für Ausgabe auf der Webseite
echo \"${MAIN}.${SUB}.${PATCH}\" > public/build_version.txt
# -------------------------------------------
# 🔁 Deploy Basisverzeichnisse
# -------------------------------------------
for d in $BASE_DIRS; do for d in $BASE_DIRS; do
echo "🔁 Sync ${d}/ → ${TARGET_PATH}${d}/" echo "🔁 Sync ${d}/ → ${TARGET_PATH}${d}/"
lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e "
@@ -204,6 +326,10 @@ deploy:production:
cp -R ${CONFIG_ENV_DIR}/. .ci_config_deploy/ cp -R ${CONFIG_ENV_DIR}/. .ci_config_deploy/
fi 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}/" echo "🔁 Sync .ci_config_deploy/ → ${TARGET_PATH}${CONFIG_BASE_DIR}/"
lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e " lftp -u "${FTP_USER}","${FTP_PASSWORD}" "${FTP_HOST}" -e "
set ftp:ssl-force true; set ftp:ssl-force true;
@@ -224,4 +350,3 @@ deploy:production:
only: only:
- main - main
# when: manual # when: manual

View File

@@ -7,12 +7,12 @@
// ----------------------------------------------------------- // -----------------------------------------------------------
// Try to load primary environment bootstrap. // Try to load primary environment bootstrap.
$bootstrapCandidates = [__DIR__ . '/config.php']; $bootstrapCandidates = [__DIR__ . '/config.php'];
$bootstrapCandidates = [__DIR__ . '/versions.php'];
$envHint = getenv('APP_ENV') ?: (getenv('APP_ENV_FILE') ?: null); $envHint = getenv('APP_ENV') ?: (getenv('APP_ENV_FILE') ?: null);
if ($envHint) { if ($envHint) {
$bootstrapCandidates[] = __DIR__ . '/' . $envHint . '/config.php'; $bootstrapCandidates[] = __DIR__ . '/' . $envHint . '/config.php';
} }
$bootstrapCandidates[] = __DIR__ . '/staging/config.php';
$bootstrapCandidates[] = __DIR__ . '/prod/config.php';
$bootstrapLoaded = false; $bootstrapLoaded = false;
foreach ($bootstrapCandidates as $bootstrap) { foreach ($bootstrapCandidates as $bootstrap) {
if ($bootstrap && is_file($bootstrap)) { if ($bootstrap && is_file($bootstrap)) {
@@ -35,6 +35,50 @@ if (is_file($emailtemplateConfigPath)) {
$GLOBALS['app_env'] = APP_ENV; $GLOBALS['app_env'] = APP_ENV;
$GLOBALS['app_base_url'] = APP_URL_PRIMARY; $GLOBALS['app_base_url'] = APP_URL_PRIMARY;
$GLOBALS['app_api_base'] = $apiBaseUrl; $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 <<<HTML
<style>
.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}}
</style>
<script>
(function(){
var prev=document.querySelector('.app-version-badge');
if(prev){prev.remove();}
var badge=document.createElement('div');
badge.className='app-version-badge';
badge.textContent='v {$versionText}';
(window.requestAnimationFrame?requestAnimationFrame(function(){document.body?document.body.appendChild(badge):document.addEventListener('DOMContentLoaded',function(){document.body.appendChild(badge);});}):document.addEventListener('DOMContentLoaded',function(){document.body.appendChild(badge);}));
})();
</script>
HTML;
}
}
if (!defined('APP_VERSION_BADGE_REGISTERED')) {
register_shutdown_function('render_app_version_badge');
define('APP_VERSION_BADGE_REGISTERED', true);
}
// ----------------------------------------------------------- // -----------------------------------------------------------
// set cookie / session parameters // set cookie / session parameters

4
config/prod/versions.php Normal file
View File

@@ -0,0 +1,4 @@
<?php
$mainversion = 1;
$subversion = 0;
$patchversion = 1;

View File

@@ -0,0 +1,4 @@
<?php
$mainversion = 1;
$subversion = 0;
$patchversion = 1;