Решил в начале Нового Года, что надо разгрести каталог с полезными скриптами, которые используются годами “в хозяйстве” едва ли не на рефлексах, документировать их и закинуть в блог, а лишние снести к чертям. И начну, пожалуй, со скрипта, которым собираю тяжелый софт на “большом” сервере, где много памяти, быстрый SSD и прочие радости жизни. (О том, как я выбирал и настраивал для этого железо, пожалуй, я напишу в другом посте).
Итак, у нас есть такая система:
- Ноутбук, на котором обычно работаю,
- Домашний сервер с Intel Xeon, быстрым SSD, кучей оперативной памяти и контейнером с нужным окружением
Хотим работая на ноутбуке (Уж точно не через VNC!), собирать софт удаленно. Каталог сборки я монтирую по NFS. Можно, конечно, извратиться и с SSH, но в домашней сети NFS банально быстрее. Постоянно держать смонтированным каталог сборки не хочется. Так вот и родился вот такой вот костыль:
#!/bin/bash NFSPATH=192.168.143.2:/srv/sanctuary/build LOCALPATH=/srv/build REMOTEPATH=/srv SSHCMD="ssh buildblade.home -t" checkmount() { MCL=`mount | grep "$LOCALPATH" | wc -l` if [ "$MCL" -lt "1" ]; then echo "[W] Staging area not mounted, mounting" sudo mount -t nfs -o vers=3 $NFSPATH $LOCALPATH else echo "[I] Staging area already mounted, skipping" fi } unmount() { sudo umount -l $LOCALPATH } cmd() { checkmount CMD="$*" CMD=${CMD/${LOCALPATH}/${REMOTEPATH}} PWD="`pwd`" PWD=${PWD/${LOCALPATH}/${REMOTEPATH}} echo "[I] Executing transformed cmd: ${CMD} in ${PWD}" $SSHCMD "cd ${PWD} && ${CMD}" } case "$1" in "--mount") checkmount ;; "--unmount") unmount ;; "--help") echo "Usage: bb [--mount | --unmount]" echo "Usage: bb cmd" ;; *) cmd $* ;; esac
Этот скрипт кладется в какой-нибудь каталог, который есть в PATH. (У меня он называется bb). Использовать его предельно просто:
- bb –mount – подмонтировать каталог сборки
- bb –unmount – размонтировать каталог сборки
- bb command – выполнить команду в этом же каталоге, но на сервере.
Особенность этой штуки в том, что он сам динамически меняет пути. Каталог сборки может быть примонтирован по одному пути на сервере, и по другому на пользовательской машине. Именно поэтому перед выполнением команды происходит подмена путей.
Для чего-то простого оно годится, а более сложное проще закинуть в скрипт, и вызывать через bb его. Таким вот замысловатым образом я периодически собираю LibreElec, OpenIPC, OpenWRT, crosstool-ng и другие опенсорсные проекты, которые требуют много процессорного времени.