2

У меня есть работа jenkins, которая запускает некоторые тесты на ртутном репо, и, если удастся, теги локального репо с «стабильным» тегом, а затем отталкивают его обратно к основному репо. Проблема, с которой я сталкиваюсь, заключается в том, что если кто-то подталкивает ревизии во время сборки, то я не могу нажать «стабильный» тег.Предотвращение меркуриального толчка во время сборки jenkins

Мне было интересно, есть ли способ установить дистанционное репо на чтение только при сборке, а затем сделать его «push-able» после завершения сборки?

Спасибо, Vackar

ответ

1

Предотвращение толчок, вероятно, не то, что вы хотите (и это почти почти невозможно). Обещание DVCS, как Mercurial или git, заключается в том, что нет блокировки - это шаг вперед.

Считаете ли вы, что Дженкинс просто тянет и обновляет, прежде чем сливается? Вы можете пометить правильную ревизию. Что-то вроде этого:

  1. Дженкинс проверяет код и отмечает идентификатор версии он строит
  2. Дженкинс делает сборку, проходит испытания, и т.д., и все идет хорошо
  3. Дженкинс делает hg pull, чтобы получить последние с сервера
  4. Дженкинс делает hg tag -m "build number $BUILD_NUMBER" --revision X --force stable
  5. Дженкинс делает hg push

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

+0

Привет Ry4an, это отличная идея. Затем я также добавлю 6-й шаг, который затем обновит локальное репо до , чтобы следующая сборка вытащила правильный набор изменений в журнале изменений. Попробуй это и сообщишь, как это происходит. –

+0

Я думаю, это зависит от того, как у вас установлен Jenkins, но у нас есть наши наблюдения за изменениями, и он обновляет обновленную версию в начале сборки, но да, это может произойти после или в начале. –

0

Я только что искал что-то подобное. В нашем случае 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 
Смежные вопросы