Я пытаюсь написать простой сценарий непрерывного развертывания, который связан с нашим локальным Git сервером и развертывает изменения нашего кода на каждом sh pu *, в зависимости от ветки.
Сервер использует cPanel (в случае, если это имеет значение), и мы используем Gitolite для детального контроля доступа к репозиториям Git. Все это находится на одном сервере.
Вот код, который я пытался собрать. Должен признать, что у меня почти нет опыта Linux администрирования или Bash, но теоретически код должен быть работоспособным:
#!/bin/bash
deploy() {
[[ $1 =~ /home/([^/]+)/ ]] && USERNAME=${BASH_REMATCH[1]}
if sudo test -d "$1/.git"
then
sudo git --work-tree $1 clean -fd
sudo git --work-tree $1 reset --hard $2
sudo git --work-tree $1 pull origin $2
else
sudo git clone -b $2 --no-local --no-hardlinks . $1
fi
sudo composer update --no-plugins --no-scripts -d $1
sudo chown -R -h $USERNAME:$USERNAME $1
sudo find $1 -type d -exec chmod 711 {} \;
sudo find $1 -type f -exec chmod 644 {} \;
}
if [ ! -z "$GL_OPTION_STAGING_PATH" ]
then
deploy "$GL_OPTION_STAGING_PATH" "staging" #&>/dev/null
fi
if [ ! -z "$GL_OPTION_PRODUCTION_PATH" ]
then
deploy "$GL_OPTION_PRODUCTION_PATH" "master" #&>/dev/null
fi
Пользователь, запускающий этот код (с именем «git»), должен имеют разрешения sudo, потому что после команды pull ему необходимо изменить права доступа к файлам и владельца файлов, чтобы они соответствовали пользователю cPanel, которому файлы выводятся.
Проблема с этим кодом в том, что он выглядит как Git создает какие-то ссылки (жесткие ссылки или символические ссылки, не знаю), и когда я выполняю команду chown, она портит исходные (голые) файлы репо.
Я отладил его до уровня, когда Выяснил, что эти ссылки делает команда "сбросить". Когда я вызываю перезагрузку и делаю "чавн", получается беспорядок. Так что в основном я думаю, что мне нужен параметр или другой способ избежать создания таких ссылок между файлами. Я хочу, чтобы голое репо и рабочие копии были полностью разделены. Есть идеи?