Установка Mercurial на shared-хостинг

в 13:36, , рубрики: Mercurial, tutorial, Разработка веб-сайтов, Системы управления версиями

За все время опыта веб-разработки приходилось сталкиваться с различными хостингами на которых работали сайты: от тех, на которых поддерживаются только текстовые форматы (а-ля 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:

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

Ссылки на использованные материалы:

  1. Installing Mercurial on a Shared Web Server without Root Access
  2. Installing Python Modules
  3. Python Windows Install (Описание для Windows, но Windows тут не использовался)
  4. Mercurial — CommonProblems
  5. Configuration files for Mercurial
  6. Linux man page — bash

Автор: gebvlad

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js