আমি কীভাবে জিনকিন্স / হাডসনকে বলতে পারি যে কেবলমাত্র আমার গিট ট্রিতে কোনও নির্দিষ্ট প্রকল্পের পরিবর্তনের জন্য একটি বিল্ড ট্রিগার করতে পারেন?
আমি কীভাবে জিনকিন্স / হাডসনকে বলতে পারি যে কেবলমাত্র আমার গিট ট্রিতে কোনও নির্দিষ্ট প্রকল্পের পরিবর্তনের জন্য একটি বিল্ড ট্রিগার করতে পারেন?
উত্তর:
গিট প্লাগইনটিতে কমিটের ফাইলগুলি বাদ দেওয়া অঞ্চলের রেজেক্সের সাথে মিল রয়েছে কিনা তার উপর ভিত্তি করে বিল্ডিং এড়িয়ে যেতে হবে কিনা তা নির্ধারণ করতে রেজিগ্সগুলি ব্যবহার করার জন্য একটি বিকল্প (বাদ অঞ্চল) রয়েছে।
দুর্ভাগ্যক্রমে, স্টক গিট প্লাগইনটিতে এই মুহুর্তে "অন্তর্ভুক্ত অঞ্চল" বৈশিষ্ট্য নেই (1.15)। তবে, কেউ গিটহাবে প্যাচ পোস্ট করেছেন যা জেনকিনস এবং হাডসনের উপর কাজ করে যা আপনার পছন্দের বৈশিষ্ট্যটি কার্যকর করে।
এটি নির্মাণ করা সামান্য কাজ, তবে এটি বিজ্ঞাপন হিসাবে কাজ করে এবং আমার গিট গাছে একাধিক স্বতন্ত্র প্রকল্প রয়েছে বলে এটি অত্যন্ত কার্যকর।
https://github.com/jenkinsci/git-plugin/pull/49
আপডেট: গিট প্লাগইন (1.16) এ এখন 'অন্তর্ভুক্ত' অঞ্চল বৈশিষ্ট্য রয়েছে।
Ignored commit c6e2b1dca0d1885: No paths matched included region whitelist
। কোন সুত্র? এখানে আরো বিস্তারিত: stackoverflow.com/questions/47439042/...
মূলত, আপনার দুটি কাজ দরকার। ফাইল পরিবর্তন হয়েছে কিনা তা যাচাই করতে হবে এবং একটি প্রকৃত বিল্ড করতে হবে:
চাকরি # 1
এটি আপনার গিট সংগ্রহস্থলের পরিবর্তনের ক্ষেত্রে ট্রিগার করা উচিত। এরপরে এটি পরীক্ষা করে যে আপনি নির্দিষ্ট করেছেন ("এসসিআর" এখানে) পরিবর্তন হয়েছে কিনা এবং তারপরে জেনকিন্সের সিএলআই ব্যবহার করে দ্বিতীয় কাজ শুরু করতে।
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 এর মতো প্যারামিটার নিতে এই কাজটি কনফিগার করুন, আপনি যে কাজটি প্রথম কাজটি বেছে নেওয়ার জন্য বেছে নিয়েছিলেন ঠিক সেগুলি তৈরি করছেন তা নিশ্চিত করতে।
$? || exit 0
... test $? -eq 0 || exit 0
সম্ভবত?
আপনি যদি আপনার বিল্ডিং পাইপলাইন বর্ণনা করতে জেনকিনসফিলের একটি ঘোষণামূলক বাক্য গঠন ব্যবহার করে থাকেন তবে নির্দিষ্ট ফাইলগুলি পরিবর্তিত হলে আপনি কেবলমাত্র পর্যায়ে সম্পাদনকে সীমাবদ্ধ করার জন্য চেঞ্জসেট শর্তটি ব্যবহার করতে পারেন । এটি এখন জেনকিনসের একটি আদর্শ বৈশিষ্ট্য এবং এটির জন্য কোনও অতিরিক্ত কনফিগারেশন / সফ্টওয়্যার প্রয়োজন হয় না।
stages {
stage('Nginx') {
when { changeset "nginx/*"}
steps {
sh "make build-nginx"
sh "make start-nginx"
}
}
}
আপনি একাধিক শর্ত ব্যবহার একত্রিত করতে পারেন anyOf
বা allOf
জন্য এখানে বা বা ও আচরণ তদনুসারে:
when {
anyOf {
changeset "nginx/**"
changeset "fluent-bit/**"
}
}
steps {
sh "make build-nginx"
sh "make start-nginx"
}
যদিও এটি একক জবগুলিকে প্রভাবিত করে না, আপনি সর্বশেষ প্রতিশ্রুতিতে কোনও পরিবর্তন না থাকলে নির্দিষ্ট পদক্ষেপগুলি উপেক্ষা করতে আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন:
/*
* 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
}
api/
ফোল্ডারটিও পরিবর্তন না করে )) আপনি যদি এটি ঠিক করতে পারেন তবে আমি একটি প্রস্তাবিত পরিবর্তন পছন্দ করব !
আপনি জেনেরিক ওয়েবহুক ট্রিগার প্লাগইন ব্যবহার করতে পারেন ।
একটি ভেরিয়েবল লাইক changed_files
এবং এক্সপ্রেশন সহ$.commits[*].['modified','added','removed'][*]
।
তোমার মত ফিল্টার টেক্সট থাকতে পারে $changed_files
মত এবং ফিল্টার regexp "folder/subfolder/[^"]+?"
যদি folder/subfolder
ফোল্ডারে তৈরী করে আরম্ভ হবে।
আমি এই প্রশ্নটির উত্তর অন্য পোস্টে দিয়েছি:
জেনকিন্স / হাডসনে সর্বশেষ নির্মাণের পরে পরিবর্তিত ফাইলগুলির তালিকা কীভাবে পাবেন
#!/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;
আপনি চাকরীর এক্সিকিউটি শেলের শীর্ষে চেকটি সরাসরি যুক্ত করতে পারেন এবং exit 0
কোনও পরিবর্তন সনাক্ত না হলে এটি ঘটবে ... সুতরাং, আপনি সর্বদা চেক-ইনগুলির জন্য একটি বিল্ড ট্রিগার করতে শীর্ষ স্তরের পোল করতে পারেন।
আমি এই স্ক্রিপ্টটি লিখে পরীক্ষাগুলি এড়িয়ে যেতে বা সম্পাদন করতে লিখলাম যদি সেখানে পরিবর্তন হয়:
#!/bin/bash
set -e -o pipefail -u
paths=()
while [ "$1" != "--" ]; do
paths+=( "$1" ); shift
done
shift
if git diff --quiet --exit-code "${BASE_BRANCH:-origin/master}"..HEAD ${paths[@]}; then
echo "No changes in ${paths[@]}, skipping $@..." 1>&2
exit 0
fi
echo "Changes found in ${paths[@]}, running $@..." 1>&2
exec "$@"
সুতরাং আপনি যেমন কিছু করতে পারেন:
./scripts/git-run-if-changed.sh cmd vendor go.mod go.sum fixtures/ tools/ -- go test