Запуск нескольких команд ssh

У меня есть команда в битбакете, которая запускает несколько команд 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 ответ
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 и загрузите весь свой частный исходный код.)

Например:

  1. Клонируйте свое репо в ~/git/example.com однажды

  2. Для развертывания запустите:

    ssh user@host 'cd ~/git/example.com &&
                   git pull --ff-only &&
                   GIT_WORK_TREE=/<dir>/example.com git checkout -f'
    

Методы в связанной статье также позаботятся о переименованных / удаленных файлах, в то время как ваши старые файлы будут храниться навсегда.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *