Evite el empuje mercurial durante una construcción de jenkins

Tengo un trabajo de jenkins que ejecuta algunas testings en un repository mercurial, y si tiene éxito label al repository local con una label 'estable' y luego lo envía de vuelta al repository principal. El problema que estoy teniendo es que si alguien empuja los sets de cambios mientras se está ejecutando la construcción, entonces no puedo presionar la label 'estable'.

Me preguntaba si había una forma de configurar el repository remoto para que solo sea de lectura mientras se está ejecutando la compilation, y luego hacerlo 'push-able' una vez que la compilation termine.

Gracias, Vackar

Evitar el empuje probablemente no sea lo que quieres (y es casi imposible). La promise de un DVCS como Mercurial o git es que no hay locking, es un paso adelante.

¿Has considerado hacer que Jenkins simplemente tire y actualice antes de que se fusione? Aún puede labelr la revisión adecuada. Algo como esto:

  1. jenkins revisa el código y toma nota del ID de revisión que está creando
  2. Jenkins hace la construcción, ejecuta las testings, etc. y todo va bien
  3. jenkins hace una hg pull para get lo último del server
  4. jenkins hace una hg tag -m "build number $BUILD_NUMBER" --revision X --force stable
  5. Jenkins hace un hg push

Luego, (casi) no hay time entre esa extracción final, label y empuje, pero la label sigue en la revisión que en realidad fue compilation, porque guardó esa ID de hash de revisión desde la primera vez que lo sacó.

Solo he estado buscando algo similar. En nuestro caso, Jenkins está realizando una fusión, ejecutando un set extenso de testings y una vez que todas pasan, empujando el código fusionado de nuevo al repository. Entonces toma ~ 1 hora y falla si un desarrollador empuja mientras el trabajo se está ejecutando (no puede hacer el último empujón).

No pude encontrar una solución preparada, así que terminé escribiendo un gancho mercurial que verifica si el trabajo está en construcción (usando la API REST) ​​antes de permitir el empuje.

Necesitará acceder a su repository mercurial remoto, pero aparte de eso, no es demasiado complejo.


Agregue lo siguiente a 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] 

Y asegúrese de que este script python esté en 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 configunetworking correctly. Cannot find Jenkins url in .hg/hgrc.') if not jenkins_jobs: raise util.Abort('Jenkins hook has not been configunetworking 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 
    Intereting Posts