IT TIP

특정 파일 세트에서 변경이 발생하는 경우에만 빌드를 트리거하는 방법

itqueen 2020. 10. 14. 21:33
반응형

특정 파일 세트에서 변경이 발생하는 경우에만 빌드를 트리거하는 방법


Jenkins / Hudson에게 내 Git 트리의 특정 프로젝트에 대한 변경 사항에 대해서만 빌드를 트리거하도록 지시하는 방법은 무엇입니까?


Git 플러그인에는 커밋의 파일이 제외 된 영역 정규식과 일치하는지 여부에 따라 빌드를 건너 뛸지 여부를 결정하는 정규식을 사용하는 옵션 (제외 된 영역)이 있습니다.

안타깝게도 현재 Git 플러그인에는 "포함 된 지역"기능이 없습니다 (1.15). 그러나 누군가가 원하는 기능을 구현하는 Jenkins 및 Hudson에서 작동하는 GitHub에 패치를 게시했습니다.

빌드하는 것은 약간의 작업이지만 광고 된대로 작동하고 내 Git 트리 중 하나에 여러 개의 독립적 인 프로젝트가 있기 때문에 매우 유용했습니다.

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

업데이트 : 이제 Git 플러그인 (1.16)에 '포함 된'지역 기능이 있습니다.


기본적으로 두 가지 직업이 필요합니다. 하나는 파일이 변경되었는지 확인하고 다른 하나는 실제 빌드를 수행합니다.

직업 # 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 체크 아웃


단일 작업에는 영향을 미치지 않지만 최신 커밋에 변경 사항이 포함되지 않은 경우이 스크립트를 사용하여 특정 단계를 무시할 수 있습니다.

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

If you are using a declarative syntax of Jenkinsfile to describe your building pipeline, you can use changeset condition to limit stage execution only to the case when specific files are changed. This is now a standard feature of Jenkins and does not require any additional configruation/software.

stages {
    stage('Nginx') {
        when { changeset "nginx/*"}
        steps {
            sh "make build-nginx"
            sh "make start-nginx"
        }
    }

If the logic for choosing the files is not trivial, I would trigger script execution on each change and then write a script to check if indeed a build is required, then triggering a build if it is.


You can use Generic Webhook Trigger Plugin for this.

With a variable like changed_files and expression $.commits[*].['modified','added','removed'][*].

빌드를 트리거해야하는 폴더 인 경우 $changed_files같은 필터 텍스트 와 필터 정규식을 가질 수 있습니다 ."folder/subfolder/[^"]+?"folder/subfolder


다른 게시물에서이 질문에 답했습니다.

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변경 사항이 감지되지 않으면 자동으로 수행됩니다. 따라서 항상 빌드를 트리거하기 위해 체크인의 최상위 수준을 폴링 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/5243593/how-to-trigger-a-build-only-if-changes-happen-on-particular-set-of-files

반응형