2014-09-26 6 views
6

Ho un lavoro in Jenkins per un progetto su GitHub, che vorrei essere attivato ogni volta che viene creato un nuovo ramo o è stato rimosso un ramo esistente. È possibile?Generazione di trigger in Jenkins quando vengono create o eliminate filiali git

Avviso: il server Jenkins si trova all'interno di un'azienda, quindi non è possibile utilizzare ganci Web da GitHub.

+0

Come si può collegare (protocollo) per GitHub da Jenkins? – Technext

+0

Non dovrebbe essere troppo difficile scrivere uno script per questo. Basato sul comando ls http://stackoverflow.com/questions/10911923/get-list-of-git-branches-for-a-repo-hosted-on-github –

+0

@Technext via SSH, perché è un repository privato. – Tobias

risposta

3

Posso pensare a un approccio, è possibile utilizzare.

Utilizzo di Job DSL Il plugin consente di creare o eliminare progetti utilizzando Groovy. Non è difficile includere la scansione di github e creare lavori da questo. La cosa buona è che riconosce anche i lavori cancellati.

I.e. Installare DSL lavoro plug-in, creare un processo di semi (stile libero), con un grilletto regolare, e incollare qualcosa di simile al di sotto nello script ..

def project = 'nbn/griffon-maven-plugin' 
def branchApi = new URL("https://api.github.com/repos/${project}/branches") 
def branches = new groovy.json.JsonSlurper().parse(branchApi.newReader()) 


branches.each { 
    def branchName = it.name 
    job { 
     name "${project}-${branchName}".replaceAll('/','-') 
     scm { 
      git("git://github.com/${project}.git", branchName) 
     } 
     steps { 
      maven("test -Dproject.name=${project}/${branchName} ") 
     } 
    } 
} 
+0

Heh, in realtà è il lavoro DSL dei lavori che voglio eseguire ogni volta che i rami vengono creati o distrutti. In questo momento funziona solo su intervalli, e funziona anche bene. Mi chiedevo solo se potessi farlo funzionare solo quando c'era un motivo per farlo. – Tobias

+0

Dovresti comunque effettuare il polling in entrambi i modi. Job DSL non dovrebbe avere troppo overhead di analizzare l'intera configurazione, e dovrebbe eseguire un dirty-check correttamente, quindi anche se la spiegazione di Technext è buona, probabilmente è solo un overhead che deve essere mantenuto in qualche modo. Se hai suggerimenti per Job DSL, non esitare a lasciare un commento o due. –

2

Si può provare questo approccio se si guarda bene a voi. :)

Programmi una cron sul sistema di compilazione per eseguire la seguente operazione:

  1. Fetch elenco di ramo dal repository Git e conservarla in un file, ad esempio branch_list

    Noi utilizzare Gitolite e accedere ai nomi dei rami utilizzando il comando git ls-remote.

    git ls-remote [email protected]:repository_name

    Per esempio,

    [[email protected] ~]$ git ls-remote [email protected]:repository_name 
    08a119f0aec5d4286708d2e16275fcd7d80d2c25  HEAD 
    a91ef29f1be5bfe373598f6bb20d772dcc65b8ca  refs/heads/dev-mob 
    d138356cf752a46fd8c626229809c9eaae63a719  refs/heads/dev-ssorel 
    e7d7e2c617c4a42b299b29c0119283813800f1bb  refs/heads/dev-omni 
    3193b36d678f1af2dcc3a291c6313f28ede97149  refs/heads/dev-pay 
    72fd9d8586708011c763cd7bc4f7bd2a3513a12f  refs/heads/dev-sell 
    39455fc2672039a7f325e9cafe3777ed563368ef  refs/heads/dev-apis 
    a22eb000ffa1ac0fbbf51b6bc8aea31b040567a3  refs/heads/dev-front 
    78a63105ec754d7ba758af97d542e749ceb9c533  refs/heads/dev-tpsp 
    82d99796690b6c562872ea68655c74ebc3f0abfb  refs/heads/mainline 
    fd82522f9999cedb11e245b515d480187c2e9cc6  refs/heads/master 
    

    per filtrare solo i nomi di filiale, è possibile utilizzare:

    [[email protected] ~]$ git ls-remote [email protected]:repository_name | grep -v HEAD | cut -d/ -f3 | sort > branch_list_latest 
    
  2. fare un diff con l'ultima recuperato file ie, branch_list. Se c'è una differenza, quindi attivare la build. È possibile utilizzare il comando diff o cmp.

    git ls-remote [email protected]:repository_name | grep -v HEAD | cut -d/ -f3 | sort > branch_list_latest 
    
    if ! cmp -s branch_list branch_list_latest; then 
        mv branch_list_latest branch_list 
        echo "Files differ which means branch created or removed. Triggering build..." 
        # Trigger build command 
    fi 
    

Cron manterrà il recupero dell'elenco dei rami dopo un certo intervallo. È possibile definire l'intervallo secondo le proprie necessità.

0

Dove mi trovo ora abbiamo due rami di lunga durata, e il resto è quasi esclusivamente rami di funzionalità di breve durata.

Abbiamo già posti di lavoro per le filiali di lunga durata.

per la funzione di rami Ho guardato

https://pythonhosted.org/jenkins-autojobs/

e

http://entagen.github.io/jenkins-build-per-branch/

e ha scoperto che entrambi sono un po 'troppo complicato per il nostro uso.

Invece ho impostato un lavoro con l'identificatore di ramo "* _build" per la convenzione che se si preme un ramo che termina con "_build" sarà costruito da Jenkins. Il passo successivo è ricordare che, quando si esamina la richiesta di pull meglio essere denominato "xyz ..._ costruire" :)

migliore, Anders