Я только что искал что-то подобное. В нашем случае Jenkins выполняет слияние, запускает обширный набор тестов и как только они все проходят, нажав объединенный код обратно в репозиторий. Таким образом, требуется ~ 1 час и сбой, если разработчик толкает во время выполнения задания (он не может сделать окончательный толчок).
Я не смог найти готовое решение, так что в итоге написал крючок, который проверяет, строится ли работа (используя API REST), прежде чем разрешить push.
Вам понадобится доступ к удаленному ртутному репозиторию, но кроме этого он не слишком сложный.
Добавьте следующие your-remote-repo/.hg/hgrc
:
[hooks]
pretxnchangegroup.DisablePushDuringJenkinsBuild= python:.hg/disable_push_if_building_hook.py:check_jenkins
[jenkins]
url=http://path-to-jenkins
jobs=jenkins-job-name[,comma-separated, for-multiple, jobs]
И убедитесь, что этот питон скрипт в your-remote-repo/.hg/
import json, urllib2
from mercurial import util
TEN_SECONDS = 10
def check_jenkins(ui, repo, node, **kwargs):
jenkins_url = ui.config('jenkins', 'url', default=None, untrusted=False)
jenkins_jobs = ui.config('jenkins', 'jobs', default=None, untrusted=False)
if not jenkins_url:
raise util.Abort('Jenkins hook has not been configured correctly. Cannot find Jenkins url in .hg/hgrc.')
if not jenkins_jobs:
raise util.Abort('Jenkins hook has not been configured correctly. Cannot find Jenkins jobs in .hg/hgrc.')
jenkins_jobs = [x.strip() for x in jenkins_jobs.split(',')]
for job in jenkins_jobs:
job_url = jenkins_url + '/job/' + job + '/lastBuild/api/json'
ui.write('Checking if job is running at URL: %s\n' % job_url)
try:
job_metadata = json.load(urllib2.urlopen(job_url, timeout = TEN_SECONDS))
if 'building' in job_metadata and job_metadata['building']:
raise util.Abort('Jenkins build "%s" is in progress. Pushing is disabled until it completes.' % job_metadata['fullDisplayName'])
except urllib2.URLError, e:
raise util.Abort('Error while trying to poll Jenkins: "%s"' % e)
return False # Everything is OK, push can be accepted
Привет Ry4an, это отличная идея. Затем я также добавлю 6-й шаг, который затем обновит локальное репо до, чтобы следующая сборка вытащила правильный набор изменений в журнале изменений. Попробуй это и сообщишь, как это происходит. –
Я думаю, это зависит от того, как у вас установлен Jenkins, но у нас есть наши наблюдения за изменениями, и он обновляет обновленную версию в начале сборки, но да, это может произойти после или в начале. –