Я предпочитаю развертывания, которые автоматизированы и повторяемы. Вы определенно хотели бы начать с тега управления исходным кодом, чтобы точно знать, что вы развернули, и можете повторно развернуть его в любое время. Затем используйте сценарии, чтобы передать это на сервер, что-то вроде Capistrano, или просто самодельный сценарий bash или что-то в этом роде.
Для сайтов, которые используют скомпилированный код, если тестирующие серверы соответствуют производственным серверам, вероятно, лучше всего скомпилировать код один раз и отправить ту же скомпилированную версию в производство после того, как она будет протестирована.