仅当特定文件集发生更改时,如何触发构建

git hudson jenkins

77459 观看

7回复

6477 作者的声誉

我如何告诉Jenkins / Hudson仅针对我的Git树中特定项目的更改触发构建?

作者: xavier.seignard 的来源 发布者: 2011 年 3 月 9 日

回应 (7)


2

2468 作者的声誉

如果选择文件的逻辑不是很简单,我会在每次更改时触发脚本执行,然后编写一个脚本来检查是否确实需要构建,然后触发构建(如果是)。

作者: Uri Cohen 发布者: 09.03.2011 12:39

32

3145 作者的声誉

基本上,你需要两份工作。一个用于检查文件是否已更改,另一个用于执行实际构建:

工作#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,以确保您正在构建第一个作业选择构建的修订版本。

参数化构建字符串参数 参数化构建Git结帐

作者: peritus 发布者: 20.03.2011 08:22

61

726 作者的声誉

决定

Git插件有一个选项(排除区域),使用正则表达式来确定是否根据提交中的文件是否与排除的区域正则表达式匹配来跳过构建。

不幸的是,股票Git插件目前没有“包含区域”功能(1.15)。但是,有人在GitHub上发布了一些补丁,这些补丁可以在Jenkins和Hudson上运行,实现你想要的功能。

构建它是一项小工作,但它的工作方式与广告一样,并且非常有用,因为我的一个Git树有多个独立项目。

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

更新:Git插件(1.16)现在具有“包含”区域功能。

作者: Aaron Kushner 发布者: 10.02.2012 09:04

1

171 作者的声誉

我在另一篇文章中回答了这个问题:

自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 shell的顶部,exit 0如果没有检测到任何更改,它将会发生...因此,您始终可以轮询最高级别的签入以触发构建。

作者: hhony 发布者: 04.10.2016 10:09

6

18633 作者的声誉

虽然这不会影响单个作业,但如果最新提交不包含任何更改,则可以使用此脚本忽略某些步骤:

/*
 * 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
}
作者: FrankerZ 发布者: 16.11.2017 03:01

1

1757 作者的声誉

您可以使用Generic Webhook Trigger Plugin

使用变量like changed_files和表达式$.commits[*].['modified','added','removed'][*]

你可以有一个过滤文本像$changed_files和过滤的正则表达式一样"folder/subfolder/[^"]+?",如果folder/subfolder是,应触发建立的文件夹。

作者: Tomas Bjerre 发布者: 01.04.2018 06:40

0

17 作者的声誉

如果使用Jenkinsfile的声明性语法来描述构建管道,则可以使用changeset条件将阶段执行仅限于特定文件更改时的情况。这是Jenkins的标准功能,不需要任何其他配置/软件。

stages {
    stage('Nginx') {
        when { changeset "nginx/*"}
        steps {
            sh "make build-nginx"
            sh "make start-nginx"
        }
    }
作者: Anton Golubev 发布者: 06.09.2019 02:13
32x32