Решено: redmine + gitlab

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
BigBrother
Сообщения: 436
Статус: ¯\_(ツ)_/¯
ОС: linux based

Решено: redmine + gitlab

Сообщение BigBrother »

Всем привет.
На двух серверах запущены 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
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20792
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: redmine + gitlab

Сообщение Bizdelnick »

BigBrother писал(а):
29.04.2013 20:35
Если подсунуть склонировые коды с git`а, в хранилище редмайна, то все работает. Но тогда получается, что напрашивается костыль - по крону постоянно делать git clone и заменять папку с кодами.

У нас народ так и делал. По-другому с git не получится, у него большая часть функционала работает исключительно локально.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
BigBrother
Сообщения: 436
Статус: ¯\_(ツ)_/¯
ОС: linux based

Re: Решено: redmine + gitlab

Сообщение BigBrother »

Спасибо.
Написал костыль-скрипт. Тупо-просто, зато работает :)
Если кому надо скрипт, могу поделится.
Спасибо сказали:
Alken
Сообщения: 1
ОС: Ubuntu Server 12.04

Re: Решено: redmine + gitlab

Сообщение Alken »

BigBrother писал(а):
14.08.2013 11:39
Спасибо.
Написал костыль-скрипт. Тупо-просто, зато работает :)
Если кому надо скрипт, могу поделится.


Буду очень благодарен за скрипт-костыль. У самого такая ситуация.
Спасибо сказали:
BigBrother
Сообщения: 436
Статус: ¯\_(ツ)_/¯
ОС: linux based

Re: Решено: redmine + gitlab

Сообщение BigBrother »

Alken писал(а):
01.11.2013 12:25
Буду очень благодарен за скрипт-костыль. У самого такая ситуация.


Код далеко не идеальный, но работает. Что бы скрипт работал, необходимо чтобы во всех проектах был добавлен один и тот же юзер, на роль 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 минут. Но это, если репозиториев десяток.
Спасибо сказали:
Ответить