За все время опыта веб-разработки приходилось сталкиваться с различными хостингами на которых работали сайты: от тех, на которых поддерживаются только текстовые форматы (а-ля narod.ru) до виртуальных машин, на которых есть root доступ.
Относительно недавно столкнулся с проблемой: велась разработка сайта на 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:
$ 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
ссылка на оригинал статьи https://habrahabr.ru/post/281000/
Добавить комментарий