SVN: как напсиать php-скрипт для вызыва update'a через браузер

Как написать скрипт на PHP (который можно вызывать через браузер). Так чтобы он корректно вызывал команду SVN Update, для обновления проекта на сервере до текущей версии репозитария?

Пробные реализации вызывают проблемы с правами и в итоге неуспешны.
В сети много информации по подобной проблеме, но решения найти так и не удалось.
  • Вопрос задан
  • 3277 просмотров
Пригласить эксперта
Ответы на вопрос 4
Dmarck
@Dmarck
web-developer
Для обновления использую следующий код, только требуется наличие функции ssh_connect

update.php

if(!($con = ssh2_connect("127.0.0.1", 22))){
$data = "fail: unable to establish connection\n";
} else {
$cc = ssh2_auth_password($con, "svn-user", "svn-user-password");
if(!$cc) {
$data = "fail: unable to authenticate\n";
} else {
if (!($stream = ssh2_exec($con, "/var/www/.update.sh"))) {
$data = "fail: unable to execute command\n";
} else {
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
stream_set_blocking($stream, true);
$data = stream_get_contents($stream);
$data2 = stream_get_contents($errorStream);
fclose($stream);
}
}
}
echo @$data;


.update.sh

#!/bin/sh
cd /var/www/site
svn update --username="svn-u" --password="svn-p" --non-interactive


Ну а дальше просто вызываем update.php
Ответ написан
Наше решение на сервере проектов быстрое и наколенное — в репозитарии настраивается post-commit hook, который создает пустой файл-флаг с именем проекта (имя проекта и папка, где лежит сам сайт одинаковы). По крону запускается скрипт, который считывает файлы-флаги из папки, детает cd /data/folder-with-sites/<project-name> и запускает svn update. Возможно данная система при большом количестве разработчиков потребует какой-либо блокировки, чтобы если предыдущий процесс апдейта затянется, то новый процесс не стартовал.

post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
echo $1 $2 $3 $4 $5 > `echo $1 | sed 's/repos/repos\/.need-to-update/'`

(каталог svn-репозитария /data/svn/repos/<project-name>)

cron-script.sh
#!/bin/sh
dir=/data/svn/repos/.need-to-update/

for rep in `find $dir -type f`
do
    web=`echo $rep | sed 's/svn\/repos\/.need-to-update/web/'`
    subj=`echo $web | sed 's/\/data\/web\///'`
    echo `date '+%Y-%m-%d %H:%M'` - $subj  >>/root/scripts/post-commit-cron.log
    cd $web
    /usr/local/bin/svn --username <svn-user> --password <svn-user-passwd> --no-auth-cache update >>/root/scrip
    /usr/local/bin/svn info >>rev.log
    echo >>rev.log
    /bin/chmod -R a+rwX ./
    /usr/sbin/chown -R www:www ./
    rm $rep
#    echo ' ' | mail -s "U $subj" root
    echo >>/root/scripts/post-commit-cron.log
done

(каталог с сайтом /data/web/<project-name>)
Ответ написан
@Longer
Ещё вариант, написать простого демона, использующего локальные сокеты и запущенного под правами того, от кого нужно сделать svn update.
Я как-то так сделал для решения похожей задачи. Но там надо было на 2х серваках одновременно делать svn up. На втором поднял своего демона слушающего какой-то там порт и если на него приконнектится, то делается svn up и сразу разрыв. Тут как вариант можно применить аналогичное решение, но т.к. нужно внутри одного сервака это делать, заюзать локальные сокеты.
Ответ написан
anycolor
@anycolor
Можно при каждом коммите делать через пост-коммит svn up. Или такой вариант не подходит/не нравится?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Digital Clouds Новосибирск
от 60 000 руб.
АКМЭ сервис Санкт-Петербург
от 100 000 руб.
UGOL Санкт-Петербург
от 150 000 руб.
14 дек. 2019, в 11:44
500 руб./за проект
14 дек. 2019, в 11:23
2000 руб./за проект