শেল ব্যর্থ হলে জেনকিনস বিল্ড ব্যর্থ হবে না


132

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


প্রতিশ্রুতিবদ্ধ কিছু আছে কিনা তা পরীক্ষা করে দেখুন, এবং কেবল সেই ক্ষেত্রে প্রতিশ্রুতিবদ্ধ? stackoverflow.com/questions/5139290/…
Anders Lindahl

উত্তর:


210

কমান্ড ব্যর্থ হলে আরও কার্যকর করা বন্ধ করতে:

command || exit 0

কমান্ড ব্যর্থ হলে কার্যকর করা চালিয়ে যেতে :

command || true


12
আপনি প্রয়োজন হবে না || exit 0যদি, প্রথম ক্ষেত্রে commandআয় মিথ্যা মৃত্যুদন্ড বন্ধ করে দেব। বলেছিল, দ্বিতীয় বিকল্পটি খুব সহায়ক!
নীর আলফাসী 21

20
@ আলফাসিন আপনি সমস্যাটি বুঝতে পারছেন না। ওপি চায় না জেনকিনস বিল্ড ব্যর্থ হোক; অবশ্যই আমাদের অবশ্যই exit 0কারণ কোনও শূন্য-বহির্গমন কোড বিল্ডটিতে ব্যর্থ হবে।
কোলোনেল প্রশ্ন

1
আমি দেখতে পাই, সেক্ষেত্রে আমি এই শব্দটি এই থেকে পরিবর্তন করব: "কমান্ড ব্যর্থ হলে আরও কার্যকরকরণ বন্ধ করা:" থেকে: "কমান্ড ব্যর্থ হলে আরও কার্যকর করা বন্ধ করা এবং জেনকিন্সকে সফল হিসাবে চিহ্নিত করা:"।
নীর আলফাসি

1
@ আলফাসিন যখন আমি সম্মত হই যে কোলোনেল প্রশ্নগুলির তীব্র মন্তব্যটি পেশাদারিত্বহীন ছিল, তবে তিনি যা বলেছিলেন তাতে তিনি সঠিক ছিলেন। "প্রস্থান 0" কাজটিকে সফল চিহ্নিত করবে না। এটি কেবলমাত্র বর্তমান বিল্ড পদক্ষেপকে সফল চিহ্নিত করবে। কাজটি পরবর্তী পরবর্তী পদক্ষেপগুলির একটিতে এখনও ব্যর্থ হতে পারে।
noamik

1
ধন্যবাদ এই কাজ! এটি বিশেষত "ssh ব্যবহার করে দূরবর্তী হোস্টের শেল এক্সিকিউট করুন" প্লাগইন বৈশিষ্ট্যটি থেকে কার্যকর কারণ আপনি ত্রুটিতে ব্যর্থ না হতে / বিন / ব্যাশ + ই ব্যবহার করতে সক্ষম নন। কোন কমান্ডগুলি বিল্ডটি ব্যর্থ হয় না তা চয়ন করতে আমার ধারণাটিও আমি পছন্দ করি।
leeman24

80

জেনকিনস /bin/sh -xeডিফল্টরূপে শেল বিল্ড স্টেপগুলি সম্পাদন করে । -xমানে প্রতিটি কমান্ড কার্যকর করা মুদ্রণ করা। -eস্ক্রিপ্টের কোনও কমান্ড ব্যর্থ হলে ব্যর্থতার সাথে প্রস্থান করার অর্থ।

সুতরাং আমি মনে করি আপনার ক্ষেত্রে যা ঘটেছিল তা হ'ল আপনার গিট কমান্ডটি 1 দিয়ে প্রস্থান করুন এবং ডিফল্ট -eপ্যারামের কারণে শেলটি নন -0 প্রস্থান কোডটি গ্রহণ করে, স্ক্রিপ্টের বাকী অংশটিকে উপেক্ষা করে এবং পদক্ষেপটিকে ব্যর্থতা হিসাবে চিহ্নিত করে। আপনি যদি এখানে আপনার বিল্ড স্টেপ স্ক্রিপ্ট পোস্ট করতে পারেন তবে আমরা এটি নিশ্চিত করতে পারি।

যদি এটি হয় তবে আপনি চেষ্টা করার চেষ্টা করতে পারেন #!/bin/shযাতে স্ক্রিপ্টটি বিকল্প ছাড়াই কার্যকর করা হবে; বা set +eএই আচরণটিকে ওভাররাইড করতে বিল্ড স্টেপের উপরে একটি বা অনুরূপ কিছু করুন।


সম্পাদিত: অন্য একটি বিষয় লক্ষ্যণীয় তা হ'ল, যদি আপনার শেল স্ক্রিপ্টের শেষ কমান্ডটি নন -0 কোডটি ফেরত দেয় তবে পুরো বিল্ড স্টেপটি এখনও এই সেটআপটির সাথে ব্যর্থ হিসাবে চিহ্নিত হবে। এই ক্ষেত্রে, echoএটি এড়াতে আপনি কেবল শেষে একটি কমান্ড রাখতে পারেন।

আরও একটি সম্পর্কিত প্রশ্ন


41

গিট রিটার্নের প্রস্থান স্থিতির দিকে ধাক্কা দেওয়ার মতো কিছু না থাকলে ১। চালানো শেল বিল্ড স্টেপ যথাক্রমে ব্যর্থ হিসাবে চিহ্নিত হয়েছে। আপনি OR বিবৃতি ব্যবহার করতে পারেন || (ডাবল পাইপ)

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

এর অর্থ, প্রথম ব্যর্থ হলে দ্বিতীয় যুক্তি সম্পাদন করুন (প্রস্থান প্রস্থান স্থিতি> 0)। দ্বিতীয় কমান্ড সর্বদা 0. ফিরে আসে (যখন প্রস্থান করার মতো অবস্থা 1 -> দ্বিতীয় কমান্ড কার্যকর করা হবে) প্রতিধ্বনি 0 আসবে এবং বিল্ড স্টেপ অবিরত থাকবে।

বিল্ডটিকে অস্থির হিসাবে চিহ্নিত করতে আপনি পোস্ট-বিল্ড স্টেপ জেনকিন্স টেক্সট ফাইন্ডার ব্যবহার করতে পারেন। এটি কনসোল আউটপুট, ম্যাচ প্যাটার্ন (আপনার প্রতিধ্বনি) এবং অস্থির হিসাবে বিল্ড চিহ্নিত করতে পারে।


27

জেনকিন্সকে ব্যর্থ না হতে বলার আরও একটি সহজ উপায় রয়েছে। আপনি নিজের প্রতিশ্রুতিটি বিল্ড স্টেপে আলাদা করতে পারেন এবং শেলটি ব্যর্থ না হয়ে সেট করতে পারেন:

set +e
git commit -m "Bla."
set -e

2
set -eপ্রস্থান কোড নির্বিশেষে আপনি যে কমান্ডটি চালাতে চান তা যুক্ত করার পরে নিশ্চিত হন । অন্যথায়, আপনি যে আদেশগুলি করতে চান তা সম্পাদন করতে পারে। আমি নিজেই ত্রুটিটি পরিচালনা করতে চেয়েছিলাম, তাই আমি এরকম কিছু করেছি: `set + e কমপ্লেট -m" বেল "EXIT_CODE =" $ {?} "সেট -e # হ্যান্ডেল প্রস্থান কোড
লজিক`

8

জেনকিনস পদক্ষেপের ফেরতের মান দ্বারা একটি পদক্ষেপের সাফল্য / ব্যর্থতা নির্ধারণ করে। শেলটির ক্ষেত্রে এটি সর্বশেষ মানের ফেরত হওয়া উচিত। উইন্ডোজ সিএমডি এবং (পসিক্স) ব্যাশ শেল উভয়ের জন্যই আপনি exit 0সর্বশেষ কমান্ড হিসাবে ব্যবহার করে নিজেই রিটার্ন মান সেট করতে সক্ষম হবেন ।


এটি "এক্সিকিউট উইন্ডোজ ব্যাট" এর পক্ষে কাজ করছে বলে মনে হচ্ছে না যার 2 টি লাইন রয়েছে: git কমিট-এম "বার্তা" প্রস্থান 0
বেন

@ exit 0আমার উইন্ডোজ জেনকিনস ইনস্টলটিতে আমি একাধিক বিল্ডে "উইন্ডোজ ব্যাচ কমান্ড" প্রয়োগ করি এবং এটি প্রত্যাশার সাথে কাজ করে। অন্য কিছু অবশ্যই চলছে। আপনি কনসোল লগ সম্পর্কিত অংশ পোস্ট করতে পারেন?
jwernerny

আপনি কি এটি আপনার প্রথম পদক্ষেপে গিট কমিট-এম "ব্লাহ" দিয়ে ব্যবহার করছেন? আমি মেশিনে ম্যানুয়ালি একটি ব্যাট স্ক্রিপ্ট তৈরি করার চেষ্টা করেছি এবং গিট কমান্ডের পরে একটি প্রতিধ্বনি এবং একটি প্রস্থান 0 রেখেছি। যখন কোনও কিছু করার থাকে না তখন অন্য কমান্ডের কোনওটিই চালিত হয় না ...
বেন

@Xiawei এর উত্তর দেখুন। জেনকিন্সের শেলটি কার্যকর করতে এটির ডিফল্ট আচরণ #!/bin/sh -xvযা এর ফলে কোনও ত্রুটি দেখা দিলে স্ক্রিপ্টটি থামিয়ে দেয়।
স্টিভেন 8:48

8

আমি এখানে পাওয়া উত্তর ব্যবহার করে এই কাজ করতে সক্ষম হয়েছি:

গিট কীভাবে কোনও ত্রুটি ছাড়াই কমিট করবেন?

git diff --quiet --exit-code --cached || git commit -m 'bla'

1
উপরেরটি যা করে তা হ'ল: " git diffকমান্ড করুন, এবং যদি এটি ব্যর্থ হয়, git commitকমান্ড করুন git diffBas মূলত, এটি কেবল প্রতিশ্রুতি দেয়, যদি পাওয়া যায় যে কিছু করার জন্য কিছু পাওয়া যায় However তবে @ জর্জ্নার্নি উত্তরটি সঠিক ছিল যে আপনি exit 0শেষ বিবৃতি হিসাবে যুক্ত করতে সক্ষম হবেন জেনকিন্সকে এটিকে সাফল্য হিসাবে গণ্য করার জন্য যে কোনও স্ক্রিপ্টের জন্য। আমি এমন একটি দৃশ্যের কথা ভাবতে পারি যেখানে আপনি লিনাক্স শেল স্টেপটি করতে পারলে এটি ব্যর্থ হবে তবে ব্যাচে এটি সর্বদা কাজ করা উচিত
স্লাভ

@ বেন জেনকিনস এখানে/bin/sh -xe বর্ণিত (মাঝখানে) হিসাবে ডিফল্টরূপে শেল বিল্ড স্টেপগুলি সম্পাদন করছে । সুতরাং আপনি এই আচরণকে ওভাররাইড করতে বিল্ড স্টেপের শীর্ষে রেখে দিতে বা করতে চেষ্টা করতে পারেন , যা অ -0 কোড সহ প্রস্থানের অভ্যন্তরে একটি পদক্ষেপের বাকী পদক্ষেপটি অবিরত রাখবে#!/bin/bashset +e
জিয়াওয়ে জাং

8

শিরোনামে (আরও সাধারণ) প্রশ্নে - জেনকিন্সকে ব্যর্থ হওয়া থেকে রোধ করতে আপনি এটিকে প্রস্থান কোডটি দেখতে থেকে রোধ করতে পারেন। পিংয়ের উদাহরণ:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

এবং এখন আপনি উদাহরণস্বরূপ পিং আউটপুট পেতে পারেন:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

অবশ্যই এর পরিবর্তে ping ...আপনি কোনও কমান্ড (গুলি) ব্যবহার করতে পারেন - সহ git commit



6

আপনি পাঠ্য-সন্ধানকারী প্লাগইন ব্যবহার করতে পারেন । এটি আপনাকে আপনার পছন্দ হিসাবে প্রকাশের জন্য আউটপুট কনসোলটি পরীক্ষা করতে দেয় এবং তারপরে বিল্ডটি চিহ্নিত করে Unstable


এটি আশাব্যঞ্জক লাগছিল, তবে কোনও কারণে এটি বিল্ডটি ব্যর্থ করে চলেছে।
বেন

4

একাধিক শেল কমান্ডের জন্য, আমি যুক্ত করে ব্যর্থতা উপেক্ষা করি:

set +e commands true

এখানে চিত্র বর্ণনা লিখুন


আমি সাধারণভাবে আনসেটিংকে নিরুৎসাহিত করি। আপনি যদি কিছু নির্দিষ্ট আদেশের রিটার্ন মানটিকে অগ্রাহ্য করতে চান তবে আপনি "|| সত্য" বা আরও কিছু অর্থবহ সত্য যুক্ত করতে পারেন, যেমন: স্টপ-সার্ভিস.শ || প্রতিধ্বনি পরিষেবাটি ইতিমধ্যে ডাউন ছিল
রাউল সালিনাস-

3

যদি আপনি এই আদেশগুলি শেল ব্লকে রাখেন:

false
true

আপনার বিল্ডটি ব্যর্থ হিসাবে চিহ্নিত করা হবে (কমপক্ষে 1 টি শূন্যের বহির্গমন কোড), যাতে আপনি এড়াতে (সেট + ই) যুক্ত করতে পারেন:

set +e
false
true

ব্যর্থ হবে না। তবে এটি স্থানে (সেট + ই) দিয়েও ব্যর্থ হবে:

set +e
false

কারণ শেষ শেল কমান্ডটি 0 দিয়ে প্রস্থান করা আবশ্যক।


2

নিম্নলিখিত পরিবর্তনগুলি থাকলে কেবল প্রতিশ্রুতিবদ্ধ হয়ে মুরারিটির জন্য কাজ করে। সুতরাং বিল্ডটি কেবল ব্যর্থ হয় যদি প্রতিশ্রুতি ব্যর্থ হয়।

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"

0

কিছু টিপস সহ আরও একটি উত্তর, কারও পক্ষে সহায়ক হতে পারে:

নিম্নলিখিত আদেশের সাথে আপনার আদেশগুলি পৃথক করতে মনে রাখবেন :

command1 && command2 - মানে, যে command2 মৃত্যুদন্ড কার্যকর করা হবে, শুধুমাত্র command1 সাফল্য যদি

কমান্ড 1 ; কমান্ড 2 - এর অর্থ, কমান্ড 1-এর ফলাফল থাকা সত্ত্বেও এই কমান্ড 2 কার্যকর করা হবে

উদাহরণ স্বরূপ:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests 

নিম্নলিখিত কোডটি ছিন্ন করার সময়, ব্যর্থ হলে ( সফলভাবে আপনার পরীক্ষাগুলি ব্যর্থ হয়েছে) set -eএবং echo 0কমান্ড সহ সফলভাবে কার্যকর করা হবে gmake test:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests 

একটু ভুল ও কমান্ড set -eএবং echo 0&& gmake test && set -e && echo 0সঙ্গে, এড়ানো হবে println run_testsবিবৃতি ব্যর্থ gmake testJenkins বিল্ড বাতিল করে দেবে। কর্মপরিকল্পনা হিসাবে আপনি স্যুইচ করতে পারেন returnStatus:true, তবে তারপরে আপনি আপনার কমান্ড থেকে আউটপুটটি মিস করবেন।


0

এই উত্তরটি সঠিক, কিন্তু এটা নির্দিষ্ট করে না || exit 0বা || trueযায় শেল কমান্ড ভিতরে । এখানে আরও একটি সম্পূর্ণ উদাহরণ:

sh "adb uninstall com.example.app || true"

উপরেরগুলি কাজ করবে তবে নিম্নলিখিতটি ব্যর্থ হবে:

sh "adb uninstall com.example.app" || true

সম্ভবত এটি অন্যের কাছে সুস্পষ্ট, তবে আমি এটি উপলব্ধি করার আগে অনেক সময় নষ্ট করেছি।

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