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 Jenkins
→ Configure 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"
Чтобы узнать больше о коммитах, перейдите к документации.