Содержание
Автоматическое обновление пропатченной версии Joomla
По мотивам ручного обновления пропатченной Joomla создаем скрипты для автоматизации этого процесса.
Перед проведением всех работ необходимо сделать резервные копии и/или поставить git, и сделать дамп базы данных
Создание патчей
Создаем патчи на основе разницы между оригинальными файлами и пропатченными, все настройки находятся в скрипте, который кладем выше дерева веб-документов:
- patch-make.sh
#!/bin/bash # # Создание патчей на основе разницы между оригинальными файлами и пропатченными # Новые файлы игнорируются, только уже существующие # ORIGIN_DIR=tmp/3.4.5-origin # каталог с исходными файлами INSTANCE_DIR=public_html # каталог с измененными (пропатченными) файлами PATCH_DIR=tmp/patches # каталог, куда будут складываться патчи PATCHES_INDEX_FILE=files.txt # индексный файл с именами файлов EXCLUDE_FILE_EXTENSIONS='jpg png gif doc pdf' # расширения для исключения из поиска патчей GREP_REGEXP='^Files (.*?) and (.*?) differ$' # регулярка для поиска измененных файлов DIFF_REGEXP='s/^Files (.*?) and (.*?) differ$/\1 \2/g' # регулярка для разбиения результатов diff на два файла for EXT in `echo "${EXCLUDE_FILE_EXTENSIONS}"` do EXCLUDE_CHUNK="${EXCLUDE_CHUNK} -x '*.${EXT}'" done diff -qr $EXCLUDE_CHUNK $ORIGIN_DIR $INSTANCE_DIR | grep -P "$GREP_REGEXP" | sed -r "$DIFF_REGEXP" > $PATCH_DIR/$PATCHES_INDEX_FILE COUNTER=0 while read FILES; do for FILE in $FILES do let COUNTER+=1 BASE_NAME=`basename "$FILE"` PATCH_NAME=`printf '%04d_%s' "$COUNTER" "$BASE_NAME"` echo $FILES | xargs -n 2 diff -up > $PATCH_DIR/$PATCH_NAME # echo $PATCH_NAME break done done < $PATCH_DIR/$PATCHES_INDEX_FILE echo Done: $PATCH_DIR
Даем разрешение на выполнение и запускаем создание патчей:
chmod +x patch-make.sh ./patch-make.sh
В итоге у нас получается набор патчей, каждый патч - в отдельном файле, и индексный файл files.txt
:
-rw-rw-r-- 1 apache apache 586 Mar 7 11:46 0001_config.xml -rw-rw-r-- 1 apache apache 528 Mar 7 11:46 0002_router.php -rw-rw-r-- 1 apache apache 852 Mar 7 11:46 0003_email.php -rw-rw-r-- 1 apache apache 1391 Mar 7 11:46 files.txt
Возможно исключить отдельные патчи из этого набора путем удаления файлов. Например, можно перенести какие-то правки ядра в шаблон, и удалить соотвествующие патчи.
Обновление Joomla
Обновляем Joomla штатными средствами. Можно закоммитить изменения.
Вклеиваем патчи обратно
- patch-apply.sh
#!/bin/bash # # Применение патчей, созданных patch-make.sh # INSTANCE_DIR=public_html # каталог с измененными (пропатченными) файлами PATCH_DIR=tmp/patches # каталог, куда будут складываться патчи PATCHES_INDEX_FILE=files.txt # индексный файл с именами файлов find $PATCH_DIR -type f -print0 | while read -d $'\0' FILE do if [[ "$FILE" != "$PATCH_DIR/$PATCHES_INDEX_FILE" ]]; then # исключаем индексный файл echo --------------------- Pathing file $FILE --------------------- patch -i $FILE -p0 -l fi done
Разрешаем выполнение и запускаем:
chmod +x patch-apply.sh ./patch-apply.sh
В интерактивном режиме нам предложат решить конфликты (если они есть), связанные с:
- файл не изменился, и зачем его повторно патчить
- не нашлось место, куда можно вклеить патч