Files
emailtemplate.it/.gitlab-ci.yml
2025-12-10 01:58:51 +01:00

387 lines
12 KiB
YAML
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"
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=$(grep '\$patchversion' "${VERSION_WORK_FILE}" 2>/dev/null | tr -cd '0-9')
[ -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
IFS='.' read -r FORCE_MAIN FORCE_SUB FORCE_PATCH <<< "${CI_VERSION_FORCE}"
MAIN=$FORCE_MAIN
SUB=$FORCE_SUB
PATCH=$FORCE_PATCH
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}"
# Neue versions.php bauen
{
echo '<?php'
echo "\$mainversion = ${MAIN};"
echo "\$subversion = ${SUB};"
echo "\$patchversion = ${PATCH};"
} > "${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;
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
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=$(grep '\$patchversion' "${VERSION_WORK_FILE}" 2>/dev/null | tr -cd '0-9')
[ -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
IFS='.' read -r FORCE_MAIN FORCE_SUB FORCE_PATCH <<< "${CI_VERSION_FORCE}"
MAIN=$FORCE_MAIN
SUB=$FORCE_SUB
PATCH=$FORCE_PATCH
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}"
# Neue versions.php bauen
{
echo '<?php'
echo "\$mainversion = ${MAIN};"
echo "\$subversion = ${SUB};"
echo "\$patchversion = ${PATCH};"
} > "${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;
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
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