Files
emailtemplate.it/.gitlab-ci.yml
2026-02-09 01:38:39 +01:00

479 lines
16 KiB
YAML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
stages:
- deploy
# -----------------------------------------
# Globale Variablen
# -----------------------------------------
variables:
BASE_DIRS: "src public api partials tools inc debug"
CONFIG_BASE_DIR: "config"
# Standard-Image für alle Jobs
default:
image: usbcheck/ci-usbcheck-deploy:latest
# -----------------------------------------
# Deployment auf STAGING
# -----------------------------------------
deploy:staging:
stage: deploy
variables:
TARGET_PATH: "${FTP_PATH_STAGING}"
CONFIG_ENV_DIR: "config/staging"
before_script:
- echo "📂 CI Workspace:"
- pwd
- ls -la
- echo "📁 Prüfe & zeige Projektverzeichnisse:"
- |
for d in $BASE_DIRS $CONFIG_BASE_DIR $CONFIG_ENV_DIR; do
echo "----------------------------------------"
if [ -d "$d" ]; then
echo "📂 Inhalt von $d/:"
ls -la "$d/"
else
echo "⚠️ Verzeichnis '$d' existiert nicht!"
fi
done
script:
- |
echo "📁 Prüfe lokale Basisverzeichnisse..."
MISSING=0
for d in $BASE_DIRS; do
if [ ! -d "$d" ]; then
echo "❌ Verzeichnis '$d/' fehlt im Repo!"
MISSING=1
fi
done
if [ ! -d "$CONFIG_BASE_DIR" ]; then
echo "❌ Basis-Konfig-Verzeichnis '$CONFIG_BASE_DIR/' fehlt!"
MISSING=1
fi
if [ ! -d "$CONFIG_ENV_DIR" ]; then
echo "❌ Env-Konfiguration '$CONFIG_ENV_DIR/' fehlt!"
MISSING=1
fi
if [ "$MISSING" -ne 0 ]; then
echo "⛔ Abbruch wegen fehlender Verzeichnisse."
exit 1
fi
echo "🚀 Deploy ${CI_ENVIRONMENT_NAME} → ${FTP_HOST}:${TARGET_PATH}"
# -------------------------------------------
# 🔢 Versionierung aus Repo-Datei ableiten
# -------------------------------------------
VERSION_WORK_FILE=".ci_versions_${CI_ENVIRONMENT_NAME}.php"
VERSION_SOURCE="${CONFIG_ENV_DIR}/versions.php"
if [ ! -f "${VERSION_SOURCE}" ]; then
VERSION_SOURCE="${CONFIG_BASE_DIR}/versions.php"
fi
if [ -f "${VERSION_SOURCE}" ]; then
echo "📄 Verwende lokale versions.php: ${VERSION_SOURCE}"
cp "${VERSION_SOURCE}" "${VERSION_WORK_FILE}"
else
echo "⚠️ Keine versions.php gefunden nutze Defaults 1.0.0"
printf '%s\n' '<?php' '$mainversion = 1;' '$subversion = 0;' '$patchversion = 0;' > "${VERSION_WORK_FILE}"
fi
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_FILE="${CONFIG_ENV_DIR}/versionsnummer.txt"
if [ ! -f "${PATCH_FILE}" ]; then
echo "0" > "${PATCH_FILE}"
fi
PATCH=$(tr -cd '0-9' < "${PATCH_FILE}")
if [ -z "$PATCH" ]; then
PATCH=$(grep '\$patchversion' "${VERSION_WORK_FILE}" 2>/dev/null | tr -cd '0-9')
fi
REMOTE_PATCH_TMP=".ci_remote_patch_${CI_ENVIRONMENT_NAME}.txt"
REMOTE_PATCH_TARGET="${TARGET_PATH}${CONFIG_BASE_DIR}/versionsnummer.txt"
echo "📥 Prüfe entfernte Versionsnummer (${REMOTE_PATCH_TARGET})..."
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;
set cmd:fail-exit false;
get ${REMOTE_PATCH_TARGET} ${REMOTE_PATCH_TMP};
bye
" >/dev/null 2>&1 || true
if [ -f "${REMOTE_PATCH_TMP}" ]; then
REMOTE_PATCH=$(tr -cd '0-9' < "${REMOTE_PATCH_TMP}")
if [ -n "${REMOTE_PATCH}" ] && [ "${REMOTE_PATCH}" -gt "${PATCH:-0}" ]; then
echo "🔄 Entfernte Versionsnummer (${REMOTE_PATCH}) ist höher als lokal (${PATCH:-0})."
PATCH=${REMOTE_PATCH}
fi
rm -f "${REMOTE_PATCH_TMP}"
fi
[ -z "$MAIN" ] && MAIN=1
[ -z "$SUB" ] && SUB=0
[ -z "$PATCH" ] && PATCH=0
FORCED=0
if [ -n "${CI_VERSION_FORCE:-}" ]; then
if expr "${CI_VERSION_FORCE}" : '^[0-9]\+\.[0-9]\+\.[0-9]\+$' >/dev/null; then
OLD_IFS=$IFS
IFS='.'
set -- ${CI_VERSION_FORCE}
IFS=$OLD_IFS
MAIN=$1
SUB=$2
PATCH=$3
FORCED=1
else
echo "⚠️ CI_VERSION_FORCE ungültig (${CI_VERSION_FORCE}). Ignoriere Override."
fi
fi
if [ "$FORCED" -eq 1 ]; then
BUMP_NOTE="force override"
else
BUMP_MODE=$(printf '%s' "${CI_VERSION_BUMP:-patch}" | tr '[:upper:]' '[:lower:]')
case "$BUMP_MODE" in
major)
MAIN=$((MAIN + 1))
SUB=0
PATCH=0
;;
minor)
SUB=$((SUB + 1))
PATCH=0
;;
*)
BUMP_MODE="patch"
PATCH=$((PATCH + 1))
;;
esac
BUMP_NOTE="${BUMP_MODE}-bump"
fi
echo "🆙 Neue ${CI_ENVIRONMENT_NAME} Version (${BUMP_NOTE}): ${MAIN}.${SUB}.${PATCH}"
echo "${PATCH}" > "${PATCH_FILE}"
# Neue versions.php bauen
{
echo '<?php'
echo "\$mainversion = ${MAIN};"
echo "\$subversion = ${SUB};"
echo "\$patchversion = ${PATCH};"
echo "\$patchFile = __DIR__ . '/versionsnummer.txt';"
echo "if (is_file(\$patchFile)) {"
echo " \$rawPatch = trim((string)file_get_contents(\$patchFile));"
echo " if (\$rawPatch !== '' && ctype_digit(\$rawPatch)) {"
echo " \$patchversion = (int)\$rawPatch;"
echo " }"
echo "}"
} > "${VERSION_WORK_FILE}"
# Textdatei für die Webseite
echo "${MAIN}.${SUB}.${PATCH}" > 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 "
set ftp:ssl-force true;
set ftp:passive-mode true;
set ftp:ssl-protect-data true;
set ssl:verify-certificate no;
mkdir -p ${TARGET_PATH}debug;
mirror -R --delete --exclude .gitkeep ${d}/ ${TARGET_PATH}${d}/;
bye
" || { echo "❌ Upload für Verzeichnis '${d}' fehlgeschlagen."; exit 1; }
done
echo "🧩 Baue gemischtes Config-Verzeichnis (config/*.php + ${CONFIG_ENV_DIR})..."
rm -rf .ci_config_deploy
mkdir -p .ci_config_deploy
if [ -d "${CONFIG_BASE_DIR}" ]; then
for f in ${CONFIG_BASE_DIR}/*.php; do
if [ -f "$f" ]; then
echo " Basis-Config-Datei: $f"
cp "$f" .ci_config_deploy/
fi
done
fi
if [ -d "${CONFIG_ENV_DIR}" ]; then
echo " Env-Config aus ${CONFIG_ENV_DIR}/"
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
if [ -f "${CONFIG_BASE_DIR}/current.ver" ]; then
echo " current.ver in .ci_config_deploy/ übernehmen"
cp "${CONFIG_BASE_DIR}/current.ver" .ci_config_deploy/current.ver
fi
echo "🔁 Sync .ci_config_deploy/ → ${TARGET_PATH}${CONFIG_BASE_DIR}/"
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;
lcd .ci_config_deploy;
mirror -R --delete --exclude .gitkeep ./ ${TARGET_PATH}${CONFIG_BASE_DIR}/;
bye
" || { echo "❌ Upload für gemischtes Config-Verzeichnis fehlgeschlagen."; exit 1; }
echo "✅ Deploy ${CI_ENVIRONMENT_NAME} abgeschlossen."
environment:
name: staging
url: https://staging.emailtemplate.it
only:
- develop
- merge_requests
# -----------------------------------------
# Deployment auf PRODUCTION
# -----------------------------------------
deploy:production:
stage: deploy
variables:
TARGET_PATH: "${FTP_PATH_PROD}"
CONFIG_ENV_DIR: "config/prod"
before_script:
- echo "📂 CI Workspace:"
- pwd
- ls -la
- echo "📁 Prüfe & zeige Projektverzeichnisse:"
- |
for d in $BASE_DIRS $CONFIG_BASE_DIR $CONFIG_ENV_DIR; do
echo "----------------------------------------"
if [ -d "$d" ]; then
echo "📂 Inhalt von $d/:"
ls -la "$d/"
else
echo "⚠️ Verzeichnis '$d' existiert nicht!"
fi
done
script:
- |
echo "📁 Prüfe lokale Basisverzeichnisse..."
MISSING=0
for d in $BASE_DIRS; do
if [ ! -d "$d" ]; then
echo "❌ Verzeichnis '$d/' fehlt im Repo!"
MISSING=1
fi
done
if [ ! -d "$CONFIG_BASE_DIR" ]; then
echo "❌ Basis-Konfig-Verzeichnis '$CONFIG_BASE_DIR/' fehlt!"
MISSING=1
fi
if [ ! -d "$CONFIG_ENV_DIR" ]; then
echo "❌ Env-Konfiguration '$CONFIG_ENV_DIR/' fehlt!"
MISSING=1
fi
if [ "$MISSING" -ne 0 ]; then
echo "⛔ Abbruch wegen fehlender Verzeichnisse."
exit 1
fi
echo "🚀 Deploy ${CI_ENVIRONMENT_NAME} → ${FTP_HOST}:${TARGET_PATH}"
# -------------------------------------------
# 🔢 Versionierung aus Repo-Datei ableiten
# -------------------------------------------
VERSION_WORK_FILE=".ci_versions_${CI_ENVIRONMENT_NAME}.php"
VERSION_SOURCE="${CONFIG_ENV_DIR}/versions.php"
if [ ! -f "${VERSION_SOURCE}" ]; then
VERSION_SOURCE="${CONFIG_BASE_DIR}/versions.php"
fi
if [ -f "${VERSION_SOURCE}" ]; then
echo "📄 Verwende lokale versions.php: ${VERSION_SOURCE}"
cp "${VERSION_SOURCE}" "${VERSION_WORK_FILE}"
else
echo "⚠️ Keine versions.php gefunden nutze Defaults 1.0.0"
printf '%s\n' '<?php' '$mainversion = 1;' '$subversion = 0;' '$patchversion = 0;' > "${VERSION_WORK_FILE}"
fi
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_FILE="${CONFIG_ENV_DIR}/versionsnummer.txt"
if [ ! -f "${PATCH_FILE}" ]; then
echo "0" > "${PATCH_FILE}"
fi
PATCH=$(tr -cd '0-9' < "${PATCH_FILE}")
if [ -z "$PATCH" ]; then
PATCH=$(grep '\$patchversion' "${VERSION_WORK_FILE}" 2>/dev/null | tr -cd '0-9')
fi
REMOTE_PATCH_TMP=".ci_remote_patch_${CI_ENVIRONMENT_NAME}.txt"
REMOTE_PATCH_TARGET="${TARGET_PATH}${CONFIG_BASE_DIR}/versionsnummer.txt"
echo "📥 Prüfe entfernte Versionsnummer (${REMOTE_PATCH_TARGET})..."
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;
set cmd:fail-exit false;
get ${REMOTE_PATCH_TARGET} ${REMOTE_PATCH_TMP};
bye
" >/dev/null 2>&1 || true
if [ -f "${REMOTE_PATCH_TMP}" ]; then
REMOTE_PATCH=$(tr -cd '0-9' < "${REMOTE_PATCH_TMP}")
if [ -n "${REMOTE_PATCH}" ] && [ "${REMOTE_PATCH}" -gt "${PATCH:-0}" ]; then
echo "🔄 Entfernte Versionsnummer (${REMOTE_PATCH}) ist höher als lokal (${PATCH:-0})."
PATCH=${REMOTE_PATCH}
fi
rm -f "${REMOTE_PATCH_TMP}"
fi
[ -z "$MAIN" ] && MAIN=1
[ -z "$SUB" ] && SUB=0
[ -z "$PATCH" ] && PATCH=0
FORCED=0
if [ -n "${CI_VERSION_FORCE:-}" ]; then
if expr "${CI_VERSION_FORCE}" : '^[0-9]\+\.[0-9]\+\.[0-9]\+$' >/dev/null; then
OLD_IFS=$IFS
IFS='.'
set -- ${CI_VERSION_FORCE}
IFS=$OLD_IFS
MAIN=$1
SUB=$2
PATCH=$3
FORCED=1
else
echo "⚠️ CI_VERSION_FORCE ungültig (${CI_VERSION_FORCE}). Ignoriere Override."
fi
fi
if [ "$FORCED" -eq 1 ]; then
BUMP_NOTE="force override"
else
BUMP_MODE=$(printf '%s' "${CI_VERSION_BUMP:-patch}" | tr '[:upper:]' '[:lower:]')
case "$BUMP_MODE" in
major)
MAIN=$((MAIN + 1))
SUB=0
PATCH=0
;;
minor)
SUB=$((SUB + 1))
PATCH=0
;;
*)
BUMP_MODE="patch"
PATCH=$((PATCH + 1))
;;
esac
BUMP_NOTE="${BUMP_MODE}-bump"
fi
echo "🆙 Neue ${CI_ENVIRONMENT_NAME} Version (${BUMP_NOTE}): ${MAIN}.${SUB}.${PATCH}"
echo "${PATCH}" > "${PATCH_FILE}"
# Neue versions.php bauen
{
echo '<?php'
echo "\$mainversion = ${MAIN};"
echo "\$subversion = ${SUB};"
echo "\$patchversion = ${PATCH};"
echo "\$patchFile = __DIR__ . '/versionsnummer.txt';"
echo "if (is_file(\$patchFile)) {"
echo " \$rawPatch = trim((string)file_get_contents(\$patchFile));"
echo " if (\$rawPatch !== '' && ctype_digit(\$rawPatch)) {"
echo " \$patchversion = (int)\$rawPatch;"
echo " }"
echo "}"
} > "${VERSION_WORK_FILE}"
# Textdatei für die Webseite
echo "${MAIN}.${SUB}.${PATCH}" > 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 "
set ftp:ssl-force true;
set ftp:passive-mode true;
set ftp:ssl-protect-data true;
set ssl:verify-certificate no;
mkdir -p ${TARGET_PATH}debug;
mirror -R --delete --exclude .gitkeep ${d}/ ${TARGET_PATH}${d}/;
bye
" || { echo "❌ Upload für Verzeichnis '${d}' fehlgeschlagen."; exit 1; }
done
echo "🧩 Baue gemischtes Config-Verzeichnis (config/*.php + ${CONFIG_ENV_DIR})..."
rm -rf .ci_config_deploy
mkdir -p .ci_config_deploy
if [ -d "${CONFIG_BASE_DIR}" ]; then
for f in ${CONFIG_BASE_DIR}/*.php; do
if [ -f "$f" ]; then
echo " Basis-Config-Datei: $f"
cp "$f" .ci_config_deploy/
fi
done
fi
if [ -d "${CONFIG_ENV_DIR}" ]; then
echo " Env-Config aus ${CONFIG_ENV_DIR}/"
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
if [ -f "${CONFIG_BASE_DIR}/current.ver" ]; then
echo " current.ver in .ci_config_deploy/ übernehmen"
cp "${CONFIG_BASE_DIR}/current.ver" .ci_config_deploy/current.ver
fi
echo "🔁 Sync .ci_config_deploy/ → ${TARGET_PATH}${CONFIG_BASE_DIR}/"
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;
lcd .ci_config_deploy;
mirror -R --delete --exclude .gitkeep ./ ${TARGET_PATH}${CONFIG_BASE_DIR}/;
bye
" || { echo "❌ Upload für gemischtes Config-Verzeichnis fehlgeschlagen."; exit 1; }
echo "✅ Deploy ${CI_ENVIRONMENT_NAME} abgeschlossen."
environment:
name: production
url: https://emailtemplate.it
only:
- main
# when: manual