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

Комментарии (15)


  1. thunderspb
    05.04.2016 17:08
    +1

    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'»

    выглядит лучше и модифицировать удобнее


  1. AlexLeonov
    05.04.2016 17:49

    Какая-то придуманная проблема, имхо.

    Одной из существенных проблем стало отсутствие системы контроля версий.


    А зачем вам на целевом сервере вообще понадобилась VCS?


    1. freem4n
      05.04.2016 20:59

      Контроль целостности приложения, откат до предыдущей версии, быстрое тестирование из бранча, дешевая система деплоя через webhook'и на несколько серверов автоматически.


      1. thunderspb
        05.04.2016 21:44

        а что мешает сделать ssh + HEREDOC? Можно еще в сторону CM тулов посмотреть, тот же ansible отлично работает по ssh и ключам… Иногда когда лень совсем пишу быстро Playbook для него и разворачиваю то, что мне там надо, без рута тоже работает отлично. Плюс дает возможность не хранить конфиги с паролями в VCS, конфиги собираются через темплейты. Стеджинг реализован через симлинки на текущую версию. И не надо там никаких гитов/ртутей и т.п. playbook'и — jinja2 темплейты, питон у вас там стоит… Попробуйте.


      1. AlexLeonov
        05.04.2016 22:31

        Пожалуйста, никогда не делайте деплой через вебхуки. Крайне сложно придумать более неправильное применение VCS.


        1. ktretyak
          07.04.2016 08:36

          Ну если критикуете, то хотя бы минимально упомяните о своих аргументах.


          1. AlexLeonov
            07.04.2016 09:25

            Аргументы?
            Для правила «жи, ши пиши с и» вам тоже надо аргументы приводить?


  1. DuD
    05.04.2016 20:59

    Какой смысл у "-p" если вы создаете директорию в текущем каталоге?


    1. gebvlad
      05.04.2016 21:08

      Чтобы в случае существования данной директории в домашнем каталоге не выводилось сообщение вида

      $ mkdir python
      mkdir: cannot create directory 'python': File exists
      $
      


      1. DuD
        05.04.2016 23:06

        Вот пусть человеку слепо выполняющему ваши указания эта ошибка лучше вывалится чем он перетрет какие либо файлы в уже существующей директории.
        Вы б еще rm -rf python в начало поста добавили.


  1. Fedcomp
    05.04.2016 22:32

    shared хостинг далеко не всегда имеет ssh.


  1. ZoomLS
    06.04.2016 00:54

    Зачем такие извращения с хостингами, когда сервера уже давно стоят копейки?


  1. saboteur_kiev
    06.04.2016 02:58
    +1

    «Так как установка из исходных кодов считается нестандартной»

    Как, уже?


    1. TreyLav
      06.04.2016 12:46
      +2

      Да, мы тут, в 2016ом, используем VDS и пакетные менеджеры.


  1. wiredRequired
    06.04.2016 22:33

    Я извиняюсь, но почему тут
    export PYTHONPATH=~/python/lib64/python3.7/site-packages
    python3.7?
    Это как-то связано с версией мерка? но почему в имени питона?