Как запустить сборку только в том случае, если изменения происходят в определенном наборе файлов


Как мне сказать Дженкинсу / Хадсону, чтобы он запускал сборку только для изменений в конкретном проекте в моем дереве Git?

6 55

6 ответов:

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

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

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

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

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

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

Задание #1

Это должно быть вызвано изменениями в вашем репозитории Git. Затем он проверяет, имеет ли указанный путь ("src" здесь) изменения, а затем использует Дженкинса командной строки для запуска второго задания.

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 parameterParameterized build Git checkout

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

/*
 * 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
}

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

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

как получить список измененных файлов с момента последней сборки в 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 если никаких изменений не обнаружено... Следовательно, вы всегда можете опросить верхний уровень для регистрации, чтобы вызвать сборку.

можно использовать Универсальный Веб-Перехватчик Вызвать Плагин для этого.

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

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