У меня есть команда в битбакете, которая запускает несколько команд ssh, есть ли способ запустить каждую команду после завершения предыдущей?
ssh <user>@<host> 'cd /<dir>/example.com; git clone https://<user>:<password>@bitbucket.org/<bucket>/examplegit.git -b develop; mv examplegit/* mv examplegit/.* .; rmdir examplegit;'
Cloning into 'examplegit'...
mv: cannot stat 'mv': No such file or directory
mv: cannot move 'examplegit/.' to './.': Device or resource busy
mv: cannot move 'examplegit/..' to './..': Device or resource busy
mv: cannot move 'examplegit/.git' to './.git': Directory not empty
rmdir: failed to remove 'examplegit': Directory not empty
Я могу запустить одну и ту же команду несколько раз и получить разное количество и порядок ошибок. В этом есть смысл: все они выполняются сразу, но не всегда готовы к выполнению.
Возможность бегать один за другим решит все это.
1 ответ
есть ли способ запустить каждую команду после завершения предыдущей?
Это буквально так, как это уже работает.
Если бы вы использовали &
как разделитель, что позволит командам выполняться одновременно, но ;
разделитель всегда ждет для выхода из предыдущей команды.
Я могу запустить одну и ту же команду несколько раз и получить разное количество и порядок ошибок.
Проблема в том, что вам не хватает половины своей команды. В частности, эта часть:
mv examplegit/* mv examplegit/.* .;
вероятно должно быть:
mv examplegit/* .; mv examplegit/.* .;
Поскольку «mv» выходит из строя на полпути и оставляет непустой каталог, имеет смысл, что следующий «rmdir» не работает, а последующий «git clone» также отказывается клонировать в этот непустой каталог.
В целом вам также следует подумать о замене всех ;
с участием &&
(два & ‘s), который дополнительно проверяет код выхода предыдущей команды и останавливается, если предыдущая команда не удалась.
ssh <user>@<host> 'cd /<dir>/example.com &&
git clone https://<user>:<password>@bitbucket.org/<bucket>/examplegit.git -b develop &&
mv examplegit/* . &&
mv examplegit/.* . &&
rmdir examplegit'
И подумайте о том, чтобы полностью перейти на другой метод развертывания git это не требует создания нового клона.
(Ваш текущий метод также оставляет весь репозиторий Git доступным для всех ваших посетителей — они, вероятно, могут просто git clone https://example.com/.git
и загрузите весь свой частный исходный код.)
Например:
Клонируйте свое репо в
~/git/example.com
однаждыДля развертывания запустите:
ssh user@host 'cd ~/git/example.com && git pull --ff-only && GIT_WORK_TREE=/<dir>/example.com git checkout -f'
Методы в связанной статье также позаботятся о переименованных / удаленных файлах, в то время как ваши старые файлы будут храниться навсегда.