fix(ci): use FTPS client for legacy assets
This commit is contained in:
1 parent
97fe9646b7
commit
498e2df7b9
1 file changed
+19
-18
+19
-18
@@ -48,7 +48,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install tools
|
- name: Install tools
|
||||||
run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl php-cli
|
run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl lftp php-cli
|
||||||
|
|
||||||
# На production runner образ задания не содержит Node.js, поэтому
|
# На production runner образ задания не содержит Node.js, поэтому
|
||||||
# actions/checkout не запускается. Клонируем тот же main напрямую:
|
# actions/checkout не запускается. Клонируем тот же main напрямую:
|
||||||
@@ -91,29 +91,30 @@ jobs:
|
|||||||
dir=$(printf '%s' "$REMOTE_DIR" | sed 's#^/*##; s#/*$##')
|
dir=$(printf '%s' "$REMOTE_DIR" | sed 's#^/*##; s#/*$##')
|
||||||
case "$dir" in *[!A-Za-z0-9._/-]*) echo "недопустимый dir: $dir"; exit 1 ;; esac
|
case "$dir" in *[!A-Za-z0-9._/-]*) echo "недопустимый dir: $dir"; exit 1 ;; esac
|
||||||
umask 077
|
umask 077
|
||||||
netrc=$(mktemp); verify=$(mktemp)
|
script=$(mktemp)
|
||||||
trap 'rm -f "$netrc" "$verify"' EXIT
|
trap 'rm -f "$script"' EXIT
|
||||||
printf 'machine %s login %s password %s\n' "$FTP_HOST" "$FTP_USER" "$FTP_PASS" > "$netrc"
|
|
||||||
git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$)' > files.txt
|
git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$)' > files.txt
|
||||||
# имя уходит в адрес ftp:// как есть — пробелы и прочее экранирование не поддерживаем
|
# имя уходит в адрес ftp:// как есть — пробелы и прочее экранирование не поддерживаем
|
||||||
if grep -q '[^A-Za-z0-9._/-]' files.txt; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' files.txt; exit 1; fi
|
if grep -q '[^A-Za-z0-9._/-]' files.txt; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' files.txt; exit 1; fi
|
||||||
# Legacy FTP разрывает многокомандную сессию кодом 426. Загружаем
|
{
|
||||||
# файлы отдельными FTPS-командами: при ошибке в журнале останется
|
echo 'set cmd:fail-exit yes'
|
||||||
# конкретный путь, а повторная отправка безопасна.
|
echo 'set ftp:ssl-force true'
|
||||||
|
echo 'set ftp:ssl-protect-data true'
|
||||||
|
echo 'set ssl:verify-certificate yes'
|
||||||
|
echo 'set net:max-retries 3'
|
||||||
|
echo 'set net:timeout 30'
|
||||||
|
} > "$script"
|
||||||
|
# Сервер legacy обрывает бинарные загрузки curl с 426. lftp ведёт
|
||||||
|
# каждую передачу отдельной FTPS-командой, не ослабляя TLS.
|
||||||
while read -r f; do
|
while read -r f; do
|
||||||
echo "загрузка: $f"
|
echo "загрузка: $f"
|
||||||
if curl -sS --ssl-reqd --netrc-file "$netrc" --ftp-create-dirs --retry 3 --fail \
|
remote_dir=${f%/*}
|
||||||
-T "$f" "ftp://$FTP_HOST/${dir:+$dir/}$f"; then
|
[ "$remote_dir" = "$f" ] && remote_dir='.'
|
||||||
continue
|
printf 'mkdir -p %s%s\nput -O %s%s %s\n' \
|
||||||
fi
|
"${dir:+$dir/}" "$remote_dir" "${dir:+$dir/}" "$remote_dir" "$f" >> "$script"
|
||||||
# Этот FTP-сервер иногда возвращает 426 уже после успешной записи
|
|
||||||
# бинарного файла. Не считаем передачу успешной вслепую: скачиваем
|
|
||||||
# объект обратно и сверяем байты с исходным файлом.
|
|
||||||
curl -sS --ssl-reqd --netrc-file "$netrc" --fail --retry 3 \
|
|
||||||
"ftp://$FTP_HOST/${dir:+$dir/}$f" -o "$verify"
|
|
||||||
cmp -s "$f" "$verify" || { echo "файл не совпал после FTP-ошибки: $f"; exit 1; }
|
|
||||||
echo "FTP 426 подтверждён сверкой: $f"
|
|
||||||
done < files.txt
|
done < files.txt
|
||||||
|
printf 'bye\n' >> "$script"
|
||||||
|
lftp -u "$FTP_USER","$FTP_PASS" "ftp://$FTP_HOST" -f "$script"
|
||||||
echo "залито файлов: $(wc -l < files.txt)"
|
echo "залито файлов: $(wc -l < files.txt)"
|
||||||
|
|
||||||
- name: Check the page
|
- name: Check the page
|
||||||
|
|||||||
Reference in new issue
Block a user