Compare commits
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
components/theme-client.php text eol=lf
|
||||||
|
components/theme-switch.php text eol=lf
|
||||||
|
components/theme-style.php text eol=lf
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
name: deploy-preland
|
||||||
|
|
||||||
|
# Решение владельца 19.10.2026, preland#4: только stage.
|
||||||
|
# Production выкаты временно отключены; Барбариска больше не используется.
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- staging
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy-zoomstage:
|
||||||
|
name: deploy zoomstage.online
|
||||||
|
if: github.ref == 'refs/heads/staging'
|
||||||
|
runs-on: zoomzilla-production
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: sh
|
||||||
|
env:
|
||||||
|
PRELAND_URL: https://zoomstage.online
|
||||||
|
REMOTE_DIR: domains/zoomstage.online
|
||||||
|
steps:
|
||||||
|
- name: Install tools
|
||||||
|
run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl openssh-client sshpass php-cli php-imagick
|
||||||
|
|
||||||
|
- name: Checkout staging branch
|
||||||
|
env:
|
||||||
|
RELEASE_SHA: ${{ github.sha }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
git clone --depth 1 --branch staging http://git.dira89kv.beget.tech:3000/anton/preland.git .
|
||||||
|
git fetch --depth 1 origin "$RELEASE_SHA"
|
||||||
|
git checkout --detach "$RELEASE_SHA"
|
||||||
|
[ "$(git rev-parse HEAD)" = "$RELEASE_SHA" ]
|
||||||
|
|
||||||
|
- name: Validate release and current stage sets before upload
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
php bin/release-assets.php --check
|
||||||
|
for test in tests/check-*.php; do php "$test"; done
|
||||||
|
php bin/release-assets.php --primary
|
||||||
|
# preland#22: /N/ — runtime. Проверяем config и декодируем все 90
|
||||||
|
# обязательных изображений используемых наборов, не сверяем с Git SHA.
|
||||||
|
php bin/release-assets.php --stage-sets "$PRELAND_URL"
|
||||||
|
|
||||||
|
- name: Apply approved domain brand only if needed
|
||||||
|
env:
|
||||||
|
SFTP_HOST: ${{ secrets.ZOOMPIXEL_SFTP_HOST }}
|
||||||
|
SFTP_USER: ${{ secrets.ZOOMPIXEL_SFTP_USER }}
|
||||||
|
SFTP_PASS: ${{ secrets.ZOOMPIXEL_SFTP_PASS }}
|
||||||
|
SFTP_KNOWN_HOSTS: ${{ secrets.ZOOMPIXEL_SFTP_KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
status=0
|
||||||
|
php bin/release-brand.php --status "$PRELAND_URL" || status=$?
|
||||||
|
case "$status" in 0) exit 0 ;; 10) ;; *) exit "$status" ;; esac
|
||||||
|
# Только точная ранее согласованная пара заменяется по preland#12.
|
||||||
|
# Обычные выпуски с правильным брендом сюда не доходят.
|
||||||
|
umask 077
|
||||||
|
known_hosts=$(mktemp); batch=$(mktemp); files=$(mktemp)
|
||||||
|
trap 'rm -f "$known_hosts" "$batch" "$files"' EXIT
|
||||||
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
|
php bin/release-brand.php --files "$PRELAND_URL" > "$files"
|
||||||
|
revision=$(git rev-parse HEAD)
|
||||||
|
while read -r source target; do
|
||||||
|
# Оборванный put не должен оставлять усечённый действующий SVG.
|
||||||
|
printf '%s\n' "put -p $source $REMOTE_DIR/$target.upload-$revision" >> "$batch"
|
||||||
|
printf '%s\n' "rename $REMOTE_DIR/$target.upload-$revision $REMOTE_DIR/$target" >> "$batch"
|
||||||
|
done < "$files"
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
|
php bin/release-brand.php --status "$PRELAND_URL"
|
||||||
|
- name: Upload over SFTP
|
||||||
|
env:
|
||||||
|
SFTP_HOST: ${{ secrets.ZOOMPIXEL_SFTP_HOST }}
|
||||||
|
SFTP_USER: ${{ secrets.ZOOMPIXEL_SFTP_USER }}
|
||||||
|
SFTP_PASS: ${{ secrets.ZOOMPIXEL_SFTP_PASS }}
|
||||||
|
SFTP_KNOWN_HOSTS: ${{ secrets.ZOOMPIXEL_SFTP_KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
[ -n "$SFTP_HOST" ] && [ -n "$SFTP_USER" ] && [ -n "$SFTP_PASS" ] && [ -n "$SFTP_KNOWN_HOSTS" ] || { echo "не заданы секреты ZOOMPIXEL_SFTP_*"; exit 1; }
|
||||||
|
umask 077
|
||||||
|
known_hosts=$(mktemp)
|
||||||
|
batch=$(mktemp)
|
||||||
|
files=$(mktemp)
|
||||||
|
dirs=$(mktemp)
|
||||||
|
trap 'rm -f "$known_hosts" "$batch" "$files" "$dirs"' EXIT
|
||||||
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
|
# Наборы `/N/` на stage — редактируемый контент. Кодовая доставка их
|
||||||
|
# намеренно не перезаписывает. Обновление набора через админку не требует Git.
|
||||||
|
# Положительный список: admin/tests/bin/планы/секреты не публикуются.
|
||||||
|
php bin/release-assets.php --files | grep -vE '^(config\.json$|[0-9]+/)' > "$files"
|
||||||
|
if grep -q '[^A-Za-z0-9._/-]' "$files"; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' "$files"; exit 1; fi
|
||||||
|
printf '%s\n' "-mkdir $REMOTE_DIR" > "$batch"
|
||||||
|
while read -r file; do
|
||||||
|
case "$file" in
|
||||||
|
*/*) dir=${file%/*} ;;
|
||||||
|
*) continue ;;
|
||||||
|
esac
|
||||||
|
while [ -n "$dir" ]; do
|
||||||
|
printf '%s\n' "$dir" >> "$dirs"
|
||||||
|
case "$dir" in */*) dir=${dir%/*} ;; *) break ;; esac
|
||||||
|
done
|
||||||
|
done < "$files"
|
||||||
|
sort -u "$dirs" | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done
|
||||||
|
while read -r file; do printf '%s\n' "put -p $file $REMOTE_DIR/$file" >> "$batch"; done < "$files"
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
|
echo "залито файлов: $(wc -l < "$files")"
|
||||||
|
|
||||||
|
# api#326/#327: сначала совместимый PHP-код, затем точечная миграция UTM.
|
||||||
|
# chob→banch меняет только токен имени; веса/default владельца сохраняются.
|
||||||
|
# Остальные поля владельца и их JSON-типы сохраняются.
|
||||||
|
- name: Migrate numeric UTM in preserved host config
|
||||||
|
env:
|
||||||
|
SFTP_HOST: ${{ secrets.ZOOMPIXEL_SFTP_HOST }}
|
||||||
|
SFTP_USER: ${{ secrets.ZOOMPIXEL_SFTP_USER }}
|
||||||
|
SFTP_PASS: ${{ secrets.ZOOMPIXEL_SFTP_PASS }}
|
||||||
|
SFTP_KNOWN_HOSTS: ${{ secrets.ZOOMPIXEL_SFTP_KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
umask 077
|
||||||
|
known_hosts=$(mktemp); batch=$(mktemp); config=$(mktemp)
|
||||||
|
trap 'rm -f "$known_hosts" "$batch" "$config"' EXIT
|
||||||
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
|
printf '%s\n' "get -p $REMOTE_DIR/config.json $config" > "$batch"
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
|
changed=0
|
||||||
|
php bin/ensure-utm-config.php "$config" || changed=$?
|
||||||
|
case "$changed" in
|
||||||
|
0) ;;
|
||||||
|
10) revision=$(git rev-parse HEAD)
|
||||||
|
printf '%s\n' "put -p $config $REMOTE_DIR/config.json.upload-$revision" "rename $REMOTE_DIR/config.json.upload-$revision $REMOTE_DIR/config.json" > "$batch"
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST" ;;
|
||||||
|
*) exit "$changed" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
- name: Check the page
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
page=$(curl -fsS --max-time 30 "$PRELAND_URL/?nc=$(date +%s)")
|
||||||
|
api=$(printf '%s' "$page" | grep -o 'const createApiUrl = "[^"]*"' || true)
|
||||||
|
echo "$api"
|
||||||
|
case "$api" in *'zoomzilla.ru\/api\/images\/public\/create'*) ;; *) echo "на странице нет адреса загрузки Zoomzilla"; exit 1 ;; esac
|
||||||
|
printf '%s' "$page" | grep -q 'claim?key=' || { echo "переход не на claim"; exit 1; }
|
||||||
|
# Список наборов берётся из runtime config, а не фиксируется как /1/ и /2/.
|
||||||
|
# Полная проверка изображений ниже; одиночный HTTP200 недостаточен.
|
||||||
|
php bin/release-assets.php --remote "$PRELAND_URL"
|
||||||
|
php bin/release-brand.php --status "$PRELAND_URL"
|
||||||
|
|
||||||
|
- name: Remove previously published internal files
|
||||||
|
env:
|
||||||
|
SFTP_HOST: ${{ secrets.ZOOMPIXEL_SFTP_HOST }}
|
||||||
|
SFTP_USER: ${{ secrets.ZOOMPIXEL_SFTP_USER }}
|
||||||
|
SFTP_PASS: ${{ secrets.ZOOMPIXEL_SFTP_PASS }}
|
||||||
|
SFTP_KNOWN_HOSTS: ${{ secrets.ZOOMPIXEL_SFTP_KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
umask 077
|
||||||
|
known_hosts=$(mktemp); batch=$(mktemp)
|
||||||
|
trap 'rm -f "$known_hosts" "$batch"' EXIT
|
||||||
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
|
# Только точно известные служебные файлы прежнего deploy, без рекурсии.
|
||||||
|
printf '%s\n' "-rm $REMOTE_DIR/requisites.html" > "$batch"
|
||||||
|
git ls-files tests bin docs/superpowers | while read -r file; do
|
||||||
|
printf '%s\n' "-rm $REMOTE_DIR/$file" >> "$batch"
|
||||||
|
done
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
|
|
||||||
|
- name: Remove obsolete demo directories
|
||||||
|
env:
|
||||||
|
SFTP_HOST: ${{ secrets.ZOOMPIXEL_SFTP_HOST }}
|
||||||
|
SFTP_USER: ${{ secrets.ZOOMPIXEL_SFTP_USER }}
|
||||||
|
SFTP_PASS: ${{ secrets.ZOOMPIXEL_SFTP_PASS }}
|
||||||
|
SFTP_KNOWN_HOSTS: ${{ secrets.ZOOMPIXEL_SFTP_KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
umask 077
|
||||||
|
known_hosts=$(mktemp)
|
||||||
|
batch=$(mktemp)
|
||||||
|
trap 'rm -f "$known_hosts" "$batch"' EXIT
|
||||||
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
|
for set in demo demo-2; do
|
||||||
|
for example in 1 2 3 4 5; do
|
||||||
|
for file in source.avif source.jpg source.webp result.avif result.jpg result.webp thumb.avif thumb.jpg thumb.webp source_mob.avif result_mob.avif thumb_mob.avif; do
|
||||||
|
printf '%s\n' "-rm $REMOTE_DIR/images/$set/$example/$file" >> "$batch"
|
||||||
|
done
|
||||||
|
printf '%s\n' "-rmdir $REMOTE_DIR/images/$set/$example" >> "$batch"
|
||||||
|
done
|
||||||
|
printf '%s\n' "-rmdir $REMOTE_DIR/images/$set" >> "$batch"
|
||||||
|
done
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
@@ -1 +0,0 @@
|
|||||||
config.json
|
|
||||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 170 KiB After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 303 KiB After Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 523 KiB After Width: | Height: | Size: 523 KiB |
|
Before Width: | Height: | Size: 719 KiB After Width: | Height: | Size: 719 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 325 KiB After Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 533 KiB After Width: | Height: | Size: 533 KiB |
|
After Width: | Height: | Size: 432 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 5.7 KiB |