특정 파일 세트에서 변경이 발생하는 경우에만 빌드를 트리거하는 방법
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 매개 변수를 취하도록이 작업을 구성하여 첫 번째 작업이 빌드하기로 선택한 개정을 정확히 빌드하는지 확인하십시오.
단일 작업에는 영향을 미치지 않지만 최신 커밋에 변경 사항이 포함되지 않은 경우이 스크립트를 사용하여 특정 단계를 무시할 수 있습니다.
/*
* 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
변경 사항이 감지되지 않으면 자동으로 수행됩니다. 따라서 항상 빌드를 트리거하기 위해 체크인의 최상위 수준을 폴링 할 수 있습니다.
'IT TIP' 카테고리의 다른 글
Python 3에서 사용자 지정 비교 함수를 사용하는 방법은 무엇입니까? (0) | 2020.10.14 |
---|---|
튜플과 KeyValuePair를 사용하는 것이 언제 더 낫습니까? (0) | 2020.10.14 |
String.Format-작동 방식 및 사용자 지정 형식 문자열 구현 방법 (0) | 2020.10.14 |
jQuery 대 자바 스크립트? (0) | 2020.10.14 |
IE6 (IE7)의 JSON (0) | 2020.10.14 |