Files
ddadmin 1edda33f87 ci(site): добавлена публикация через Gitea Actions
- Зачем:
  - основной сайт не должен зависеть от заблокированной учётной записи GitHub.
- Что:
  - добавлены строгая сборка и атомарная публикация через repository-scoped runner.
  - добавлены воспроизводимые конфигурации systemd, nginx и эксплуатационный runbook.
  - проектная документация и ссылки на репозиторий обновлены для Gitea.
- Проверка:
  - выполнены mkdocs build --strict, Bash/YAML-проверки и локальный HTTP smoke-check.
  - runner зарегистрирован, ограничен средствами systemd и виден в Gitea как online.
2026-08-04 15:16:33 -04:00

76 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
readonly deploy_root="/srv/de-roadmap"
readonly releases_root="${deploy_root}/releases"
readonly keep_releases=3
if [[ $# -ne 2 ]]; then
echo "Usage: $0 SITE_DIR COMMIT_SHA-RUN_ID" >&2
exit 2
fi
source_dir=$(realpath "$1")
release_id=$2
if [[ ! $release_id =~ ^[0-9a-f]{40}-[0-9]+$ ]]; then
echo "Invalid release id: ${release_id}" >&2
exit 2
fi
if [[ ! -f "${source_dir}/index.html" ]]; then
echo "Built site has no index.html: ${source_dir}" >&2
exit 2
fi
if [[ ! -d $releases_root || ! -w $releases_root || ! -w $deploy_root ]]; then
echo "Deployment directories are missing or not writable" >&2
exit 1
fi
readonly release_dir="${releases_root}/${release_id}"
readonly staging_dir="${releases_root}/.${release_id}.tmp"
readonly next_link="${deploy_root}/.current.${release_id}.tmp"
if [[ -e $release_dir || -e $staging_dir || -e $next_link ]]; then
echo "Release path already exists: ${release_id}" >&2
exit 1
fi
cleanup() {
rm -rf -- "$staging_dir"
rm -f -- "$next_link"
}
trap cleanup EXIT
umask 0022
mkdir "$staging_dir"
cp -a "${source_dir}/." "$staging_dir/"
chmod -R u=rwX,go=rX "$staging_dir"
mv "$staging_dir" "$release_dir"
ln -s "releases/${release_id}" "$next_link"
mv -Tf "$next_link" "${deploy_root}/current"
mapfile -t old_releases < <(
find "$releases_root" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-regextype posix-extended \
-regex '.*/[0-9a-f]{40}-[0-9]+' \
-printf '%T@ %f\n' \
| sort -nr \
| awk -v keep="$keep_releases" 'NR > keep { print $2 }'
)
for old_release in "${old_releases[@]}"; do
if [[ $old_release =~ ^[0-9a-f]{40}-[0-9]+$ && $old_release != "$release_id" ]]; then
rm -rf -- "${releases_root:?}/${old_release}"
fi
done
trap - EXIT
echo "Published release ${release_id}"