Mój pierwszy pomysł to:
# deploy into public_html_new, and then:
rsync -vaH --delete public_html_new/ public_html/
Dobrym rozwiązaniem było użycie rsync. Zmieniło tylko naprawdę zmienione pliki. Uwaga, ukośniki na końcu ścieżek są tutaj ważne.
Zwykle apache nie wymaga restartu, to nie jest świat Java. Sprawdza zmiany każdego pliku php na żądanie i automatycznie odczytuje (i ponownie tokenizuje) przy zmianie.
Pull Git był podobny, choć nieco trudniejszy do napisania. Oczywiście umożliwiło to szerokie spektrum różnych możliwości wykrywania łączenia / zmiany.
To rozwiązanie będzie bezproblemowo tylko wtedy, gdy nie będzie tak naprawdę poważnych zmian - jeśli są duże zmiany we wdrożeniu, nie można wyeliminować odrobiny zagrożenia, ponieważ nie ma nieistotnego odstępu czasu, kiedy kod zostanie częściowo zmieniony a w szczególności nie.
Jeśli są duże zmiany, moja propozycja była twoim początkowym rozwiązaniem (dwie zmiany nazwy).
Oto trochę hardcorowe, ale w 100% atomowe rozwiązanie:
(1) wykonaj naprzemienne podłączanie niektórych systemów plików, w których odbywa się magento:
mount /dev/sdXY /mnt/tmp
(2) wykonaj --bind
podłączenie swojej public_html_new do public_html:
mount --bind /path/to/public_html_new /path/to/public_html
Od tego momentu apache zobaczy Twoje nowe wdrożenie. Każda zmiana 404 jest niemożliwa.
(3) wykonaj synchronizację z rsync, ale w alternatywnym punkcie montowania):
rsync -vaH --delete /mnt/tmp/path/to/public_html_new/ /mnt/tmp/path/to/public_html/
(4) zdejmij mocowanie bindowania
umount /path/to/public_html