Всем привет.
На двух серверах запущены redmine и gitlab 5.1. Кто знает "красивый" способ подружить репозитори git`a (gitlab) и redmine? Дело в том, что redmine при работе с svn, умеет работать с авторизацией изначально -> при добавлении svn хранилища, можно ввести логин и пароль, а вот в случае с git, только адрес, при чем локальный адрес.
Если подсунуть склонировые коды с git`а, в хранилище редмайна, то все работает. Но тогда получается, что напрашивается костыль - по крону постоянно делать git clone и заменять папку с кодами.
Может есть решение, более элегантное?
https://github.com/ivyl/redmine-gitolite и https://github.com/theWeird/redmine-gitolite не предлогать, т.к. в gitlab 5.1 gitolite заменили на gitlab-shell.
Нашел http://www.redmine.org/projects/redmine/wi...git_integration но если честно, до конца понятно о чем там идет речь и подходит ли оно для gitlab`а.
ЗЫ Нашел такую штуку https://github.com/koppen/redmine_github_hook но она все равно работает через cron http://www.redmine.org/projects/redmine/wi...ory_for_redmine
Решено: redmine + gitlab
Модератор: SLEDopit
-
- Сообщения: 436
- Статус: ¯\_(ツ)_/¯
- ОС: linux based
- Bizdelnick
- Модератор
- Сообщения: 20792
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Решено: redmine + gitlab
BigBrother писал(а): ↑29.04.2013 20:35Если подсунуть склонировые коды с git`а, в хранилище редмайна, то все работает. Но тогда получается, что напрашивается костыль - по крону постоянно делать git clone и заменять папку с кодами.
У нас народ так и делал. По-другому с git не получится, у него большая часть функционала работает исключительно локально.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 436
- Статус: ¯\_(ツ)_/¯
- ОС: linux based
Re: Решено: redmine + gitlab
Спасибо.
Написал костыль-скрипт. Тупо-просто, зато работает
Если кому надо скрипт, могу поделится.
Написал костыль-скрипт. Тупо-просто, зато работает
Если кому надо скрипт, могу поделится.
Re: Решено: redmine + gitlab
BigBrother писал(а): ↑14.08.2013 11:39Спасибо.
Написал костыль-скрипт. Тупо-просто, зато работает
Если кому надо скрипт, могу поделится.
Буду очень благодарен за скрипт-костыль. У самого такая ситуация.
-
- Сообщения: 436
- Статус: ¯\_(ツ)_/¯
- ОС: linux based
Re: Решено: redmine + gitlab
Код далеко не идеальный, но работает. Что бы скрипт работал, необходимо чтобы во всех проектах был добавлен один и тот же юзер, на роль Reporter, ключ которого будет использоваться для клонирования. Во время запуска, скрипт создает файлик, с которым будем работать при следующем запуске, чтобы сравнить текущий ID коммита с тем что на сервере и решить, удалить репу и с клонировать заново или ничего не делать (изменением коммитов в бренчах одной репы - учитываются)
В скрипте заполните переменные srv, gitupdateUserPrivateToken, projects.
Так же, дополнительно, необходима python библиотека python-gitlab версии 0.1 (на других версиях может не работать).
В редмайне, при добавлении хранилища git, указываем папку с клонированной репой, например /var/www/git_repo/namespace/repo_name
Файлик прикрепить не смог, форум сказал что мне запрещено загружать такие файлы, по этому через тег, надеюсь проблем с табами не будет.
Код: Выделить всё
#/usr/bin/env python
import urllib2
import json
import os
import subprocess as sb
import gitlab
File = "check_repo_git"
def toFile(result):
_file = open(File, 'w')
_file.writelines(result)
_file.close()
def doit(page=1):
srv = "http://IP"
gitupdateUserPrivateToken = ""
git = gitlab.Gitlab(srv, token=gitupdateUserPrivateToken)
projects = git.getProjects()
projects = "http://IP/api/v3/projects?per_page=100&page=" + str(page)
_projects = urllib2.Request(projects)
_projects.add_header('PRIVATE-TOKEN', gitupdateUserPrivateToken)
_projects = urllib2.urlopen(_projects).read()
_projects = json.loads(_projects)
repoID = []
for i in range(len(_projects)):
repoID.append(_projects[i]['id'])
curLastCommitOnGitSrv = []
for i in repoID:
for i2 in git.listBranches(i):
tmp1 = i2['commit']['id'] + " "
tmp2 = git.getProject(i)['path_with_namespace'] + " "
tmp3 = git.getProject(i)['ssh_url_to_repo'] + " "
tmp4 = i2['name'] + "\n"
tmp = tmp1 + tmp2 + tmp3 + tmp4
curLastCommitOnGitSrv.append(tmp)
if not os.path.isfile(File):
toFile(curLastCommitOnGitSrv)
lastCheckCommit = []
for line in open(File, 'r').read().split('\n'):
lastCheckCommit.append(line.split(' ')[0])
del lastCheckCommit[-1]
#zapominaem yje sklonirovanue repo, 4tobu eshe raz ih ne klonirovat, esli v odnoy repo izmenenu neskolko branchey
isSame = []
for i in range(len(curLastCommitOnGitSrv)):
cLC = curLastCommitOnGitSrv[i]
try:
if cLC.split(' ')[0] != lastCheckCommit[i] and cLC.split(' ')[1] not in isSame:
dirSpace = cLC.split(' ')[1]
sb.call('echo "del local repo "' + dirSpace, shell=True)
sb.call('rm -rf ' + dirSpace, shell=True)
sb.call('git clone --bare ' + cLC.split(' ')[-2] + ' ' + dirSpace, shell=True)
isSame.append(cLC.split(' ')[1])
else:
dirSpace = cLC.split(' ')[1]
if not os.path.exists(dirSpace):
sb.call('git clone --bare ' + cLC.split(' ')[-2] + ' ' + dirSpace, shell=True)
except IndexError:
pass
if len(repoID) == 100:
print "check next http api page: ", page + 1
doit(page=page + 1)
toFile(curLastCommitOnGitSrv)
doit(page=1)
А вообще, можно не выделываться с скриптом, и просто через крон удалять старые репы и клонировать новые, например каждые 15 минут. Но это, если репозиториев десяток.