কোনও ফাইলের নির্দিষ্ট সেটে পরিবর্তনগুলি ঘটে তবে কীভাবে কোনও বিল্ডকে ট্রিগার করা যায়


87

আমি কীভাবে জিনকিন্স / হাডসনকে বলতে পারি যে কেবলমাত্র আমার গিট ট্রিতে কোনও নির্দিষ্ট প্রকল্পের পরিবর্তনের জন্য একটি বিল্ড ট্রিগার করতে পারেন?

উত্তর:


65

গিট প্লাগইনটিতে কমিটের ফাইলগুলি বাদ দেওয়া অঞ্চলের রেজেক্সের সাথে মিল রয়েছে কিনা তার উপর ভিত্তি করে বিল্ডিং এড়িয়ে যেতে হবে কিনা তা নির্ধারণ করতে রেজিগ্সগুলি ব্যবহার করার জন্য একটি বিকল্প (বাদ অঞ্চল) রয়েছে।

দুর্ভাগ্যক্রমে, স্টক গিট প্লাগইনটিতে এই মুহুর্তে "অন্তর্ভুক্ত অঞ্চল" বৈশিষ্ট্য নেই (1.15)। তবে, কেউ গিটহাবে প্যাচ পোস্ট করেছেন যা জেনকিনস এবং হাডসনের উপর কাজ করে যা আপনার পছন্দের বৈশিষ্ট্যটি কার্যকর করে।

এটি নির্মাণ করা সামান্য কাজ, তবে এটি বিজ্ঞাপন হিসাবে কাজ করে এবং আমার গিট গাছে একাধিক স্বতন্ত্র প্রকল্প রয়েছে বলে এটি অত্যন্ত কার্যকর।

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

আপডেট: গিট প্লাগইন (1.16) এ এখন 'অন্তর্ভুক্ত' অঞ্চল বৈশিষ্ট্য রয়েছে।


4
1.1.16 অন্তর্ভুক্ত বৈশিষ্ট্যের জন্য সঠিক সংস্করণ নম্বর। (কোনও 1.16 নেই)
ড্যান কার্টার

আমি এটি কাজ করতে পারি না, আমার একাধিক মডিউল (ডোমেন, সাধারণ, এপিআই, ডেস্কটপ_অ্যাপ, ...) সহ একটি সংগ্রহস্থল রয়েছে আমি উদাহরণস্বরূপ, "অন্তর্ভুক্ত অঞ্চলগুলি" প্রোডাকশন_এপ / *, আমি। / ডেস্কটপ_অ্যাপ এমনকি পরম পাথের মতো বেশ কয়েকটি সংমিশ্রণের চেষ্টা করেছি। আমি সবসময় পেয়েছি Ignored commit c6e2b1dca0d1885: No paths matched included region whitelist। কোন সুত্র? এখানে আরো বিস্তারিত: stackoverflow.com/questions/47439042/...
FranAguiar

38

মূলত, আপনার দুটি কাজ দরকার। ফাইল পরিবর্তন হয়েছে কিনা তা যাচাই করতে হবে এবং একটি প্রকৃত বিল্ড করতে হবে:

চাকরি # 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 এর মতো প্যারামিটার নিতে এই কাজটি কনফিগার করুন, আপনি যে কাজটি প্রথম কাজটি বেছে নেওয়ার জন্য বেছে নিয়েছিলেন ঠিক সেগুলি তৈরি করছেন তা নিশ্চিত করতে।

প্যারামিটারাইজড বিল্ড স্ট্রিং প্যারামিটার প্যারামিটারাইজড বিল্ড গিট চেকআউট


7
শেষ বিল্ডের পরে যদি দু'বার বা আরও কমিট ঘটে থাকে? আমি মনে করি আপনি এসআরসি-র পরিবর্তনগুলি মিস করতে পারেন যেহেতু আপনি কেবলমাত্র হেড প্রতিশ্রুতি পরীক্ষা করছেন।
অ্যাডাম মনসেন

পুনঃটুইট তবে আপনি যে পরিস্থিতি / শর্তের বিরুদ্ধে পরীক্ষা করতে চান তা উপরের স্ক্রিপ্টটি সহজেই খাপ খাইয়ে নিতে পারেন .. উদাহরণস্বরূপ হেডের বিরুদ্ধে নয় বরং শেষ বার স্ক্রিপ্টটি দৌড়ানোর পরে যা হয়েছিল তার বিপরীতে।
পেরিটাস

এখানে কিছু অনুপস্থিত $? || exit 0... test $? -eq 0 || exit 0সম্ভবত?
এন্টাক

34

আপনি যদি আপনার বিল্ডিং পাইপলাইন বর্ণনা করতে জেনকিনসফিলের একটি ঘোষণামূলক বাক্য গঠন ব্যবহার করে থাকেন তবে নির্দিষ্ট ফাইলগুলি পরিবর্তিত হলে আপনি কেবলমাত্র পর্যায়ে সম্পাদনকে সীমাবদ্ধ করার জন্য চেঞ্জসেট শর্তটি ব্যবহার করতে পারেন । এটি এখন জেনকিনসের একটি আদর্শ বৈশিষ্ট্য এবং এটির জন্য কোনও অতিরিক্ত কনফিগারেশন / সফ্টওয়্যার প্রয়োজন হয় না।

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"
}

4
মনে রাখবেন এটি কিছু ক্ষেত্রে কার্যকর হয় না। আরও বিশদ জানতে ইস্যু.জেনকিনস-ci.org/ ব্রাউজ / জেনকিনস ২635৩৪৪ দেখুন।
tamerlaha

7

যদিও এটি একক জবগুলিকে প্রভাবিত করে না, আপনি সর্বশেষ প্রতিশ্রুতিতে কোনও পরিবর্তন না থাকলে নির্দিষ্ট পদক্ষেপগুলি উপেক্ষা করতে আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন:

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

4
@ কার্ল কোডটি যদি আপনার পক্ষে কাজ করে তবে তা নির্ধারণ করতে দ্বিধা বোধ করবেন না। এই কোডটি প্রয়োগ করার সময় আমার একটাই সমস্যা ছিল (বিল্ড ব্যর্থতা অবলম্বনে, এটি এই প্রতিশ্রুতি পুনরায় চেষ্টা করবে না, যদি সর্বশেষতম প্রতিশ্রুতি api/ফোল্ডারটিও পরিবর্তন না করে )) আপনি যদি এটি ঠিক করতে পারেন তবে আমি একটি প্রস্তাবিত পরিবর্তন পছন্দ করব !
বিদায় স্ট্যাকএক্সচেঞ্জ

2

যদি ফাইলগুলি বেছে নেওয়ার পক্ষে যুক্তি তুচ্ছ না হয় তবে আমি প্রতিটি পরিবর্তনের উপর স্ক্রিপ্ট এক্সিকিউশনটি ট্রিগার করব এবং তারপরে সত্যই কোনও বিল্ড প্রয়োজন কিনা তা পরীক্ষা করার জন্য একটি স্ক্রিপ্ট লিখব, তবে এটি যদি বিল্ডকে ট্রিগার করে।


1

আপনি জেনেরিক ওয়েবহুক ট্রিগার প্লাগইন ব্যবহার করতে পারেন

একটি ভেরিয়েবল লাইক changed_filesএবং এক্সপ্রেশন সহ$.commits[*].['modified','added','removed'][*]

তোমার মত ফিল্টার টেক্সট থাকতে পারে $changed_filesমত এবং ফিল্টার regexp "folder/subfolder/[^"]+?"যদি folder/subfolderফোল্ডারে তৈরী করে আরম্ভ হবে।


আমি এটি করার চেষ্টা করছি তবে আমি কিছুটা হারিয়েছি। জেনকিন্সে পরিবর্তিত ফাইলের পথ কীভাবে প্রেরণ করবেন? আপনি কিছুটা আরও ব্যাখ্যা করতে পারেন দয়া করে? পরিবর্তনশীল ফাইলগুলি কোথায় রাখবেন?
সৌদ

আপনি যে গিট পরিষেবাটি ব্যবহার করছেন তাতে আপনাকে একটি ওয়েব হুক কনফিগার করতে হবে। এটি যদি গিটহাব হয় তবে এখানে একটি উদাহরণ রয়েছে: github.com/jenkinsci/generic-webhook-trigger-plugin/blob/master/…
টমাস

বস্তুত হিসাবে আমি Bitbucket ব্যবহার করছি, আমি বুঝলাম যে Changed_files এন্ট্রি bibucket মধ্যে ধাক্কা ঘটনার পে লোড উপলব্ধ নয় (সূত্র: confluence.atlassian.com/bitbucket/... ) যাতে আমি নিশ্চিত আমি এটা করতে পারেন না। আমি মনে করি যে প্রতিশ্রুতিবদ্ধ বার্তার উপর নির্ভর করব। ধন্যবাদ
সৌদ

1

আমি এই প্রশ্নটির উত্তর অন্য পোস্টে দিয়েছি:

জেনকিন্স / হাডসনে সর্বশেষ নির্মাণের পরে পরিবর্তিত ফাইলগুলির তালিকা কীভাবে পাবেন

#!/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কোনও পরিবর্তন সনাক্ত না হলে এটি ঘটবে ... সুতরাং, আপনি সর্বদা চেক-ইনগুলির জন্য একটি বিল্ড ট্রিগার করতে শীর্ষ স্তরের পোল করতে পারেন।


1

আমি এই স্ক্রিপ্টটি লিখে পরীক্ষাগুলি এড়িয়ে যেতে বা সম্পাদন করতে লিখলাম যদি সেখানে পরিবর্তন হয়:

#!/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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.