Как запустить сборку, только если изменения происходят в определенном наборе файлов - PullRequest
76 голосов
/ 09 марта 2011

Как я могу сказать Jenkins / Hudson запускать сборку только для изменений конкретного проекта в моем дереве Git?

Ответы [ 6 ]

60 голосов
/ 11 февраля 2012

Плагин Git имеет опцию (исключенный регион) для использования регулярных выражений, чтобы определить, следует ли пропустить сборку на основе того, соответствуют ли файлы в коммите регулярному выражению исключенного региона.

К сожалению, стандартный плагин Git не имеет функции «включенного региона» в настоящее время (1.15). Однако кто-то опубликовал исправления на GitHub, которые работают на Jenkins и Hudson и реализуют нужную вам функцию.

Это небольшая работа по сборке, но она работает так, как рекламировалось, и была чрезвычайно полезна, поскольку у одного из моих деревьев Git есть несколько независимых проектов.

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

Обновление: плагин Git (1.16) теперь имеет функцию «включенного» региона.

30 голосов
/ 20 марта 2011

В принципе, вам нужно две работы. Один, чтобы проверить, изменились ли файлы, и один, чтобы сделать фактическую сборку:

Работа № 1

Это должно срабатывать при изменениях в вашем Git-репозитории. Затем он проверяет, изменился ли указанный вами путь (здесь «src»), и затем использует Jenkins 'CLI для запуска второго задания.

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

Работа № 2

Настройте это задание так, чтобы оно принимало параметр GIT_REVISION, например, чтобы убедиться, что вы создаете именно ту ревизию, которую выбрало первое задание.

Parameterized build string parameter Parameterized build Git checkout

5 голосов
/ 16 ноября 2017

Хотя это не влияет на отдельные задания, вы можете использовать этот сценарий для игнорирования определенных шагов, если последний коммит не содержал никаких изменений:

/*
 * 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
}
2 голосов
/ 09 марта 2011

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

1 голос
/ 01 апреля 2018

Для этого вы можете использовать Generic Webhook Trigger Plugin .

С переменной типа changed_files и выражением $.commits[*].['modified','added','removed'][*].

Вы можете использовать фильтр текста, например $changed_files, и регулярное выражение фильтра, например "folder/subfolder/[^"]+?", если folder/subfolder - это папка, которая должна запускать сборки.

1 голос
/ 05 октября 2016

Я ответил на этот вопрос в другом сообщении:

Как получить список измененных файлов с момента последней сборки в 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;

Вы можете добавить проверку непосредственно в верхнюю часть оболочки exec задания, и она будет exit 0, если не обнаружено никаких изменений ... Следовательно, вы всегда можете опрашивать верхний уровень для регистрации, чтобы вызвать сборку.

...