Come triggersre una build solo se le modifiche si verificano su un particolare set di file

Come faccio a dire a Jenkins / Hudson di triggersre una build solo per le modifiche su un particolare progetto nella mia struttura Git?

Il plug-in Git ha un’opzione (area esclusa) da usare regex per determinare se saltare l’edificio in base al fatto che i file nel commit corrispondano alla regex della regione esclusa.

Sfortunatamente, il plugin Git originale non ha una funzione “regione inclusa” in questo momento (1.15). Tuttavia, qualcuno ha pubblicato patch su GitHub che funzionano su Jenkins e Hudson che implementano la funzionalità desiderata.

È un po ‘di lavoro da build, ma funziona come pubblicizzato ed è stato estremamente utile poiché uno dei miei alberi Git ha più progetti indipendenti.

https://github.com/jenkinsci/git-plugin/pull/49

Aggiornamento: il plug-in Git (1.16) ora ha la funzione regione “inclusa”.

Fondamentalmente, hai bisogno di due lavori. Uno per verificare se i file sono cambiati e uno per eseguire la build effettiva:

Lavoro n. 1

Questo dovrebbe essere triggersto sulle modifiche nel tuo repository Git. Quindi verifica se il percorso specificato (“src” qui) ha delle modifiche e quindi usa la CLI di Jenkins per triggersre un secondo lavoro.

 export JENKINS_CLI="java -jar /var/run/jenkins/war/WEB-INF/jenkins-cli.jar" export JENKINS_URL=http://localhost:8080/ export GIT_REVISION=`git rev-parse HEAD` export STATUSFILE=$WORKSPACE/status_$BUILD_ID.txt # Figure out, whether "src" has changed in the last commit git diff-tree --name-only HEAD | grep src # Exit with success if it didn't $? || exit 0 # Trigger second job $JENKINS_CLI build job2 -p GIT_REVISION=$GIT_REVISION -s 

Job # 2

Configura questo lavoro per prendere un parametro GIT_REVISION in questo modo, per assicurarti di build esattamente la revisione che il primo lavoro ha scelto di build.

Parametro di stringa di configurazione parametrizzataConfigurazione Git check-out parametrizzata

Sebbene ciò non influenzi i singoli lavori, è ansible utilizzare questo script per ignorare determinati passaggi se l’ultimo commit non ha apportato alcuna modifica:

 /* * Check a folder if changed in the latest commit. * Returns true if changed, or false if no changes. */ def checkFolderForDiffs(path) { try { // git diff will return 1 for changes (failure) which is caught in catch, or // 0 meaning no changes sh "git diff --quiet --exit-code HEAD~1..HEAD ${path}" return false } catch (err) { return true } } if ( checkFolderForDiffs('api/') ) { //API folder changed, run steps here } 

Se la logica per la scelta dei file non è banale, vorrei triggersre l’esecuzione di script su ogni modifica e quindi scrivere uno script per verificare se effettivamente è richiesta una build, quindi triggersre una build se lo è.

Ho risposto a questa domanda in un altro post:

Come ottenere l’elenco dei file modificati dall’ultima build in Jenkins / Hudson

 #!/bin/bash set -e job_name="whatever" JOB_URL="http://myserver:8080/job/${job_name}/" FILTER_PATH="path/to/folder/to/monitor" python_func="import json, sys obj = json.loads(sys.stdin.read()) ch_list = obj['changeSet']['items'] _list = [ j['affectedPaths'] for j in ch_list ] for outer in _list: for inner in outer: print inner " _affected_files=`curl --silent ${JOB_URL}${BUILD_NUMBER}'/api/json' | python -c "$python_func"` if [ -z "`echo \"$_affected_files\" | grep \"${FILTER_PATH}\"`" ]; then echo "[INFO] no changes detected in ${FILTER_PATH}" exit 0 else echo "[INFO] changed files detected: " for a_file in `echo "$_affected_files" | grep "${FILTER_PATH}"`; do echo " $a_file" done; fi; 

È ansible aggiungere il controllo direttamente nella parte superiore della shell exec del lavoro e uscirà exit 0 se non vengono rilevate modifiche … Quindi, è sempre ansible eseguire il polling del livello superiore per il check-in per triggersre una build.

Puoi usare Generic Webhook Trigger Plugin per questo.

Con una variabile come changed_files ed espressione $.commits[*].['modified','added','removed'][*] .

Puoi avere un testo di filtro come $changed_files e filter regexp come "folder/subfolder/[^"]+?" Se folder/subfolder è la cartella che dovrebbe triggersre build.