Относительно недавно столкнулся с проблемой: велась разработка сайта на shared хостинге, имеющем достаточный набор технологий для обычного сайта для контента вроде новостей. Одной из существенных проблем стало отсутствие системы контроля версий. Установить ее традиционным способом не представлялось возможным. Были начаты поиски пути для решения этой проблемы.
Задача была выполнена, и как она была решена — пошагово описано ниже.
1. Доступ к shared хостингу должен выполнятся по ssh. Подключаемся к хостингу:
$ ssh user@host
2. Зайти в домашнюю директорию. Все действия будут выполнятся относительно неё:
$ cd ~
2. Проверяем, что на shared хостинге установлен python:
$ python --version
Python 2.6.6
$
4. Создаем директорию python, для того чтобы там разместить модули, которые потребуются для работы mercurial, но которых нет на shared хостинге:
$ mkdir -p python
5. Скачать исходный код Mercurial:
www.mercurial-scm.org/release
$ wget https://www.mercurial-scm.org/release/mercurial-3.7.tar.gz
6. Извлечь содержимое архива в текущую директорию:
$ tar xvf mercurial-3.7.tar.gz
7. Переименовываем папку в mercurial:
$ mv mercurial-3.7 mercurial -v
8. Перейти в папку mercurial:
$ cd mercurial
9. Устанавливаем mercurial из исходных кодов:
$ python setup.py --pure build_py -c -d . build_ext -i build_mo --force
10. Так как установка из исходных кодов считается нестандартной то необходимо проделать следующее для установки модулей:
$ python setup.py --pure install --prefix ../../python --force
11. Если установка прошла корректно, то в директории ~/python/lib{type}/python{version}/site-packages/ будет следующий список файлов:
$ ls -l ~/python/lib64/python3.7/site-packages/
total 12
drwxr-xr-x 5 user group 4096 Oct 2 2014 hgext
drwxr-xr-x 6 user group 4096 Oct 2 2014 mercurial
-rw-r--r-- 1 user group 238 Oct 2 2014 mercurial-3.7-py3.7.egg-info
$
А в директории ~/python/bin/ будет содержатся скомпилированный hg:
$ ls ~/python/bin/ -l
total 4
-rwxr-xr-x 1 user group 770 Oct 1 2014 hg
$
12. Создаем файл .profile или .bash_profile (зависит от настроек shared-хостинга), если такового нет:
$ touch ~/.profile
13. В файл записываем следующее:
export PATH=~/python/bin:$PATH
export PYTHONPATH=~/python/lib64/python3.7/site-packages
Первая строка добавляет в переменную окружения PATH путь к папке с Mercurial. Вторая строка добавляет путь к модулям python. Добавление этих строк позволяет работать с Mercurial в интерактивном режиме.
14. Для проверки, что все сделано корректно необходимо создать новое подключение ssh и проверить работоспособность Mercurial:
$ hg --version
Если все сделано верно, то будет показано сообщение вида:
Mercurial Distributed SCM (version 3.7)
Copyright (C) 2005-2016 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15. Для работы Mercurial в не интерактивном режиме необходимо добавить файл .bashrc:
export PATH=~/python/bin:$PATH
export PYTHONPATH=~/python/lib64/python3.7/site-packages
После сохранения изменений необходимо попробовать выполнить команду в не интерактивном режиме:
$ ssh user@host hg --version
Если будет показано сообщение вида:
Mercurial Distributed SCM (version 3.7)
Copyright (C) 2005-2016 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
, то настройка завершена.
Если будет сообщение вида:
sh: hg: command not found
Это говорит о том, что shared-хостинг не позволяет пользователю переопределять .bashrc.
Можно передать нужные переменные окружения непосредственно при выполнении команды в не интерактивном режиме:
$ssh user@host "export PATH=~/python/bin:$PATH;declare -x PYTHONPATH=~/python/lib64/python3.7/site-packages;hg --version"
Должно быть показано сообщение вида:
Mercurial Distributed SCM (version 3.7)
Copyright (C) 2005-2016 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
При работе с удаленным репозиторием размещенном на shared-хостинге наличие переменных окружения требуется для команд выполняющих подключение к удаленному репозиторию:
- clone
- outgoing
- incoming
- pull
- push
Для подключения необходимых переменных окружения необходимо воспользоваться опцией --config, добавив путь к hg:
$ hg --config ui.remotecmd='export "PATH=~/python/bin:$PATH";export "PYTHONPATH=~/python/lib64/python3.7/site-packages";~/python/bin/hg' inc
Либо указать эту настройку в .hg/hgrc в секции [ui]:
[ui]
config ui.remotecmd = export "PATH=~/python/bin:$PATH";export "PYTHONPATH=~/python/lib64/python3.7/site-packages";~/python/bin/hg
При таких настройках удаленная команда может не выполнится, из-за наличия кавычек.
В этом случаем можно создать алиас в .bash_profile на машине, подключающейся к shared-хостингу, для команды hg с этим параметром:
alias hg="hg --config ui.remotecmd='export "PATH=~/python/bin:$PATH";export "PYTHONPATH=~/python/lib64/python2.6/site-packages";~/python/bin/hg'"
После этого можно выполнять команды в привычном виде:
$ hg inc
Ссылки на использованные материалы:
- Installing Mercurial on a Shared Web Server without Root Access
- Installing Python Modules
- Python Windows Install (Описание для Windows, но Windows тут не использовался)
- Mercurial — CommonProblems
- Configuration files for Mercurial
- Linux man page — bash
Комментарии (15)
AlexLeonov
05.04.2016 17:49Какая-то придуманная проблема, имхо.
Одной из существенных проблем стало отсутствие системы контроля версий.
А зачем вам на целевом сервере вообще понадобилась VCS?freem4n
05.04.2016 20:59Контроль целостности приложения, откат до предыдущей версии, быстрое тестирование из бранча, дешевая система деплоя через webhook'и на несколько серверов автоматически.
thunderspb
05.04.2016 21:44а что мешает сделать ssh + HEREDOC? Можно еще в сторону CM тулов посмотреть, тот же ansible отлично работает по ssh и ключам… Иногда когда лень совсем пишу быстро Playbook для него и разворачиваю то, что мне там надо, без рута тоже работает отлично. Плюс дает возможность не хранить конфиги с паролями в VCS, конфиги собираются через темплейты. Стеджинг реализован через симлинки на текущую версию. И не надо там никаких гитов/ртутей и т.п. playbook'и — jinja2 темплейты, питон у вас там стоит… Попробуйте.
AlexLeonov
05.04.2016 22:31Пожалуйста, никогда не делайте деплой через вебхуки. Крайне сложно придумать более неправильное применение VCS.
ktretyak
07.04.2016 08:36Ну если критикуете, то хотя бы минимально упомяните о своих аргументах.
AlexLeonov
07.04.2016 09:25Аргументы?
Для правила «жи, ши пиши с и» вам тоже надо аргументы приводить?
DuD
05.04.2016 20:59Какой смысл у "-p" если вы создаете директорию в текущем каталоге?
gebvlad
05.04.2016 21:08Чтобы в случае существования данной директории в домашнем каталоге не выводилось сообщение вида
$ mkdir python mkdir: cannot create directory 'python': File exists $
DuD
05.04.2016 23:06Вот пусть человеку слепо выполняющему ваши указания эта ошибка лучше вывалится чем он перетрет какие либо файлы в уже существующей директории.
Вы б еще rm -rf python в начало поста добавили.
saboteur_kiev
06.04.2016 02:58+1«Так как установка из исходных кодов считается нестандартной»
Как, уже?
wiredRequired
06.04.2016 22:33Я извиняюсь, но почему тут
export PYTHONPATH=~/python/lib64/python3.7/site-packages
python3.7?
Это как-то связано с версией мерка? но почему в имени питона?
thunderspb
touch ~/my_env
echo «export PATH=~/python/bin:${PATH}» >> ~/my_env
echo «export PYTHONPATH=~/python/lib64/python2.6/site-packages» >> ~/my_env
alias hg=«hg --config ui.remotecmd='source ~/my_env;hg'»
выглядит лучше и модифицировать удобнее