Trigger Hudson основывается на коммите SVN

Я уже настроил систему контроля версий (Subversion), которая будет использоваться разработчиками для фиксации и обновления своего кода (скажем, его адрес - https://server/svn/project). Только авторизованные пользователи смогут иметь доступ к проекту SVN.

С другой стороны, я установил Hudson в качестве сервера непрерывной интеграции проекта (адрес проекта - server:8080/job/project).

Я хотел бы добиться следующего:

  • Сборки Hudson запускаются автоматически при наличии фиксации SVN.
  • Письма отправляются соответствующим разработчикам (тем, кто зафиксировал код), когда их зафиксированный код не создается, а это означает, что когда пользователь А фиксирует код, который не собирается, только пользователь А получает электронное письмо, содержащее уведомление.

Я настроил основанную на матрице авторизацию для пользователей Hudson, потому что я не хочу быть открытым для кого-либо.

Я видел некоторые предложения для хуков post-commit, но ни один из них не работал до сих пор.

Может кто-нибудь подсказать, что делать в отношении обеих проблем? Конкретные шаги будут оценены.

Ответ 1

Согласно Построение программного проекта # Builds by изменения в Subversion/CVS, Хадсон должен опросить ваше репо SVN, чтобы обнаружить изменяет и запускает сборку.

Однако это может быть инициировано при каждой фиксации из SVN, например в этом потоке.
Официальный script находится на странице Subversion Plugin.

REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  http://server/hudson/subversion/${UUID}/notifyCommit?rev=$REV

Но это указано:

Для этого, , ваш Хадсон должен разрешить анонимный доступ для чтения к системе.
Если управление доступом к вашему Hudson более ограничительное, вам может потребоваться указать имя пользователя и пароль, в зависимости от настройки вашей аутентификации.

Ответ 2

Чтобы инициировать сборку, когда в SVN есть фиксация, вы должны (1) установить ваше задание hudson для удаленного создания и (2) сделать SVN-крючок...

первая часть довольно проста..., чтобы заставить hook перейти в /var/lib/svn//hooks и переименовать post-commit.tmpl для пост-фиксации там вы можете сделать что-то вроде

#!/bin/bash
# Este script comprueba si se han hecho cambios en un directorio concreto,
# y en tal caso lanza una build en Jenkins

REPOS="$1"
REV="$2"
JENKINS_JOB="$3"
JENKINS_USER=admin
JENKINS_PASSWORD=****
JENKINS_HOST=<hostname>

if [ -n $(svnlook dirs-changed $REPOS --revision $REV | fgrep "tags\/") ];then
 wget --quiet --auth-no-challenge --no-check-certificate --http-user=$JENKINS_USER --http-password=$JENKINS_PASSWORD http://$JENKINS_HOST/job/$JENKINS_JOB/build?token=TOKEN
fi

exit 0

Посмотрите на эту статью http://blogsyntagma.blogspot.com.ar/2012/04/hook-de-subversion-para-ejecutar-un-job.html (это на испанском языке)

Ответ 3

Вот требуемые шаги:

  • Создайте пользователя SVN, который Хадсон может использовать для доступа к вашему репозиторию только для чтения.
  • Настройка Hudson для использования этого пользователя SVN при доступе к репозиторию
  • Создайте новое задание для использования репозитория по указанному адресу (т.е. к определенной ветке)
  • Настройте свое задание для опроса репозитория не реже одного раза в минуту для любых изменений.
  • Настройте свою работу для создания необходимого
  • Настройте свое задание на отправку электронной почты при сбое сборки

Я бы рекомендовал отправлять по электронной почте всем разработчикам, чтобы они были уведомлены о том, что сборка нестабильна, а не только виновник. Мало того, что это обеспечивает большую наглядность, но это мотивирует виновника немедленно исправить проблему или иным образом принять ругательство от своих коллег-разработчиков. Поверьте мне, это эффективно.

Ответ 4

Вот как я получил Jenkins 2.157, чтобы начать сборку после фиксации в репозитории SVN.

1. Разрешить доступ на чтение в Jenkins

Используя веб-интерфейс Jenkins, перейдите в Manage JenkinsConfigure Global Security и установите флажок " Allow anonymous read access:

allow anonymous read access screenshot

Если вы пропустите этот шаг, вы получите следующий ответ при попытке запустить сборку с использованием HTTP-запроса (описанного в третьем шаге):

Authentication required
<!--
You are authenticated as: anonymous
Groups that you are in:

Permission you need to have (but didn't): hudson.model.Hudson.Read
... which is implied by: hudson.security.Permission.GenericRead
... which is implied by: hudson.model.Hudson.Administer
-->

2. Настройте свой триггер сборки

Находясь в веб-интерфейсе Jenkins, перейдите к заданию на сборку и определите, что вы хотите запустить сборку с помощью скрипта (это будет хук фиксации SVN на следующем шаге):

configure build trigger

3. Создайте хук post-commit

Наконец, перейдите в каталог hooks репозитория и добавьте скрипт оболочки с именем post-commit (имя важно, иначе SVN не выполнит его после коммита):

#!/bin/sh

# Name of the Jenkins build job
yourJob="your_job"

# You defined this in Jenkins' build job
build_token="yourSecretToken"

jenkins_address_with_port="localhost:8090"

curl $jenkins_address_with_port/job/$yourJob/build?token="$build_token"

Сделайте скрипт исполняемым: chmod +x post-commit.


Здесь расширенная версия post-commit которая регистрирует данные о коммите, такие как автор коммита.

#!/bin/sh

# The path to this repository
repo_path="$1"
# The number of the revision just committed
rev="$2"
# The name of the transaction that has become rev
transaction_name="$3"

# See http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.author.html
commit_author="$(svnlook author --revision $rev $repo_path)"
# The UUID of the repository, something like e3b3abdb-82c2-419e-a100-60b1d0727d12
repo_uuid=$(svnlook uuid $repo_path)

# Which files were changed, added, or deleted. For example:
# U   src/main/java/com/bullbytes/MyProgram.java
what_has_changed=$(svnlook changed --revision $rev $repo_path)

log_file=/tmp/post_commit.log

echo "Post-commit hook of revision $rev committed by $commit_author to repo at $repo_path with ID $repo_uuid was run on $(date). Transaction name: $transaction_name. User $(whoami) executed this script. This has changed: $what_has_changed" >> $log_file

# Name of the Jenkins build job
yourJob="your_job"

# You defined this in Jenkins' build job
build_token="yourSecretToken"

jenkins_address_with_port="localhost:8090"

curl $jenkins_address_with_port/job/$yourJob/build?token="$build_token"

Чтобы узнать больше о коммитах, перейдите к документации.