9

Я знаю, что есть много подобных сообщений, но я не нашел решения, и рекомендации и решения, представленные в других сообщениях, не совсем смущают то, что я вижу ,Post-Commit Крюк для запуска автоматической Jenkins Build

Сценарий довольно прост: у меня есть проект в Eclipse, и когда я регистрирую изменения с этого проекта на нашем сервере Subversion (например, VisualSVN Server 2.5.3), я хочу, чтобы наш непрерывный сервер интеграции Jenkins (т.е. Jenkins 1.546), чтобы поднять это изменение и начать новую сборку. Я не хочу опросить Дженкинса.

Я в основном выполнял шаги в this article. Вот мой пост фиксации крюка сценарий:

repos = WScript.Arguments.Item(0) 
rev  = WScript.Arguments.Item(1) 
svnlook = WScript.Arguments.Item(2) 
jenkins = WScript.Arguments.Item(3) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.CreateTextFile("C:\Program Files (x86)\VisualSVN Server\log.txt") 

objFile.Writeline "repos=" & repos 
objFile.Writeline "rev=" & rev 
objFile.Writeline "svnlook=" & svnlook 
objFile.Writeline "jenkins=" & jenkins 

Set shell = WScript.CreateObject("WScript.Shell") 

Set uuidExec = shell.Exec(svnlook & " uuid " & repos) 
Do Until uuidExec.StdOut.AtEndOfStream 
    uuid = uuidExec.StdOut.ReadLine() 
Loop 

objFile.Writeline "uuid=" & uuid 

Set changedExec = shell.Exec(svnlook & " changed --revision " & rev & " " & repos) 
Do Until changedExec.StdOut.AtEndOfStream 
    changed = changed + changedExec.StdOut.ReadLine() + Chr(10) 
Loop 
objFile.Writeline "changed=" & changed 

url = jenkins + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,"":"",//crumb)" 
Set http = CreateObject("Microsoft.XMLHTTP") 
http.open "GET", url, False 
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8" 
http.send 
crumb = null 

objFile.Writeline "rev url=" & url 
objFile.Writeline "http.status=" & http.status 
objFile.Writeline "http.responseText=" & http.responseText 

if http.status = 200 then 
    crumb = split(http.responseText,":") 
end if 

url = jenkins + "subversion/" + uuid + "/notifyCommit?rev=" + rev + "&token=pinkfloyd65" 
objFile.Writeline "url=" & url 

if not isnull(crumb) then 
    objFile.Writeline "crumb(0)=" & crumb(0) 
    objFile.Writeline "crumb(1)=" & crumb(1) 
end if 

if isnull(crumb) then 
    objFile.Writeline "crumb=null" 
end if 

Set http = CreateObject("Microsoft.XMLHTTP") 
http.open "POST", url, False 
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8" 
if not isnull(crumb) then 
    http.setRequestHeader crumb(0),crumb(1) 
    http.send changed 
    if http.status <> 200 then 
    objFile.Writeline "Error. HTTP Status: " & http.status & ". Body: " & http.responseText 
    end if 

    if http.status = 200 then 
    objFile.Writeline "HTTP Status: " & http.status & ".\n Body: " & http.responseText 
    end if 
end if 

Вопрос заключается в том, что, хотя выше команда POST заканчивает получение 200 ответа назад, работа никогда не пинает. Ничего не происходит. Хорошо, давайте проверим настройку работы Jenkins; может быть, мне не хватает настройки или чего-то еще. Ну, в разделе Build Triggers я проверил вариант «Триггерные сборки удаленно (например, из скриптов)», и я также предоставил токен аутентификации. Но, направление под этим раздел отличаться от того, что я делал:

Используйте следующий URL для запуска построить удаленно: JENKINS_URL/job/<job-name>/build?token=TOKEN_NAME или /buildWithParameters?token=TOKEN_NAME Необязательно добавлять &cause=Cause+Text предоставить текст, который будет включен в записанных сборках причина.

Итак, похоже, что между наборами инструкций, которые я вижу, есть дельта, и я не уверен, как свести этот пробел. Кажется довольно очевидным следовать инструкциям на странице конфигурации задания Jenkins, за исключением того, что я не знаю, как получить имя задания, а не UUID.

Еще одна вещь, которую следует отметить, - это настройка моего хранилища. Поскольку CI-сервер используется многими группами и отделами, я думал, что буду всем умным и создаю репозиторий верхнего уровня для размещения проектов моего отдела. Итак, у меня есть что-то вроде настройки:

VisualSVN Server 
    -- Repositories 
    -- Project_A 
    -- Project_B 
    -- <my-department> 
     -- DepartmentProject_A 
     -- DepartmentProject_B 

Я интересно, если структура хранилища является добавлением к моим проблемам, но я чувствую, что я должен быть в состоянии выяснить, какие конкретные хранилища любых изменений пришли. Если бы это было так, то я мог бы настроить мой сценарий на использование имени задания, а не на UUID, а затем следовать явным инструкциям, отображаемым на странице конфигурации моего сервера CI. Когда я регистрирую входящую переменную repos в моем сценарии vbs, она указывает на репозиторий отдела верхнего уровня, а не на дочерний репозиторий проекта (т. Е. D:\<visual-svn-repos>\<my-department>, а не D:\<visual-svn-repos>\<my-department>\DepartmentProject_B).

Любая помощь будет принята с благодарностью, спасибо, ребята.

ответ

9

В статье вы связаны говорит

Работа на Дженкинс должны быть настроены с возможностью опроса SCM на выгоду от такого поведения. Это значит, что у вас могут быть некоторые задания , которые никогда не запускаются крюком после фиксации (в каталоге $ REPOSITORY/hooks), например заданиями, связанными с выпуском, на , исключая параметр опроса SCM. Конфигурированный опрос может иметь любой график (возможно, нечастый, как ежемесячно или ежегодно). Чистый эффект выглядит так, как будто опрос происходит из их обычных циклов.

и

Для этого, чтобы работать, ваш Дженкинс должен разрешить анонимный доступ для чтения (в частности, "Работа> Read" доступ) к системе. Если управление доступом к вашим Jenkins более ограничительное, вам может потребоваться указать имя пользователя и пароль , в зависимости от того, как настроена ваша аутентификация .

Этот сервер соответствует этим ограничениям?

+0

Первым был: мне нужно было также conf настроить задание на опрос scm, не предусматривая расписания. Я не уверен, как я пропустил эту рекламу, я думаю, я был менее тщательным, чем я думал. в любом случае, спасибо, scaytrase! – liltitus27

1

Я попытался заставить примеры плагина svn работать, но не повезло. Вместо этого я использовал плагин с плагинами для создания плагинов, и это работает без опроса.

https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

Сложение Триггеры> Trigger создает удаленный вариант> дать ему маркер

На сервере VisualSVN добавить это к сообщению фиксации крюка:

SET CSCRIPT=%windir%\system32\cscript.exe 
SET VBSCRIPT=C:\Repositories\post-commit-hook-jenkins.vbs 
"%CSCRIPT%" "%VBSCRIPT%" "MyJobName" "MyTokenFromBuildTrigger" 

для пост-фиксации крюка -jenkins.vbs:

Set args = WScript.Arguments 
JobName = args.Item(0) 
Token = args.Item(1) 

'URL to open.... 
sUrl = "http://MyJenkinsServer.MyCompany.com/buildByToken/build?job=" + JobName + "&token=" + Token 
'POST Request to send. 
sRequest = "" 

HTTPPost sUrl, sRequest 

Function HTTPPost(sUrl, sRequest) 
    set oHTTP = CreateObject("Microsoft.XMLHTTP") 
    oHTTP.open "POST", sUrl,false 
    oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
    oHTTP.setRequestHeader "Content-Length", Len(sRequest) 
    oHTTP.send sRequest 
    HTTPPost = oHTTP.responseText 
End Function