কীভাবে / কখন কার্যকর করা শেল জিনকিনসে ব্যর্থতা হিসাবে চিহ্নিত হয়?


112

এইটির উত্তর খুঁজতে গিয়ে আমি যে হরর গল্প পেয়েছি ...

ঠিক আছে, আমার কাছে একটি .sh স্ক্রিপ্ট রয়েছে যা জেনকিন্সকে যা করার কথা বলেছিল তা হ'ল:

  • এসভিএন থেকে উত্স পরীক্ষা করে
  • প্রকল্প তৈরি
  • প্রকল্প স্থাপন করে
  • নিজেই পরে পরিষ্কার

সুতরাং জেনকিন্সে আমাকে কেবল এক্সিকিউট শেল কমান্ডে স্ক্রিপ্টটি চালিয়ে প্রকল্পটি 'বিল্ড' করতে হবে। স্ক্রিপ্টটি দৌড়েছে (উত্সগুলি ডাউনলোড হয়, প্রকল্পটি বিল্ড / মোতায়েন করা হয়) তবে এটি বিল্ডটিকে ব্যর্থতা হিসাবে চিহ্নিত করে: পদক্ষেপ তৈরি করুন 'শেল এক্সিকিউট করুন' বিল্ডটিকে ব্যর্থতা হিসাবে চিহ্নিত করেছে এমনকি স্ক্রিপ্টটি সফলভাবে চালানো হলেও! আমি স্ক্রিপ্টটি বন্ধ করার চেষ্টা করেছি:

  • প্রস্থান 0 (এখনও এটি ব্যর্থতা হিসাবে চিহ্নিত করে)
  • প্রস্থান 1 (এটি হিসাবে ব্যর্থতা হিসাবে প্রত্যাশা হিসাবে চিহ্নিত)
  • কোনও প্রস্থান নির্দেশ নেই (একে ব্যর্থতা হিসাবে চিহ্নিত করুন)

কখন, কীভাবে এবং কেন কার্যকর শেল আমার বিল্ডটিকে ব্যর্থতা হিসাবে চিহ্নিত করে?

উত্তর:


131

প্রথম জিনিসগুলি, নীচের ধূসর অঞ্চলে মাউসটি ঘোরাও। উত্তরের অংশ নয়, তবে একেবারে বলতে হবে:

আপনার যদি একটি শেল স্ক্রিপ্ট থাকে যা "চেকআউট, বিল্ড, ডিপ্লয় করে" নিজেই করে থাকে, তবে কেন আপনি জেনকিন্স ব্যবহার করছেন? আপনি জেনকিন্সের সমস্ত বৈশিষ্ট্যগুলির পূর্বে যাচ্ছেন যা এটি কী তা তৈরি করে। আপনার পাশাপাশি ক্রোন বা কোনও এসভিএন পোস্ট-কমিট হুক স্ক্রিপ্টটি সরাসরি কল করতে পারে। জেনকিনস নিজেই এসভিএন চেকআউট সম্পাদন করা অত্যন্ত গুরুত্বপূর্ণ। এটি বিল্ডগুলিকে কেবল তখনই পরিবর্তন করতে দেয় যখন পরিবর্তনগুলি (বা টাইমার, বা ম্যানুয়াল অন, আপনি যদি চান) থাকে। এটি বিল্ডগুলির মধ্যে পরিবর্তনের উপর নজর রাখে। এটি সেই পরিবর্তনগুলি দেখায়, যাতে আপনি দেখতে পাচ্ছেন যে কোন সেটটি পরিবর্তনের জন্য সেট ছিল। প্রতিশ্রুতিবদ্ধদের ইমেলগুলি যখন তাদের পরিবর্তনগুলি সফল বা ব্যর্থ বিল্ডের কারণে ঘটে (আবার আপনার পছন্দ মতো কনফিগার করা)। প্রতিশ্রুতিবদ্ধদের যখন তাদের ফিক্সগুলি ব্যর্থতা বিল্ডিং ঠিক করেছে তখন এটি ইমেল করবে। এবং আরও অনেক কিছু। জেনকিনস নিদর্শনগুলি সংরক্ষণাগারও জেনকিন্স থেকে সরাসরি তাদের বিল্ড প্রতি উপলব্ধ করে তোলে। যদিও এসভিএন চেকআউটের মতো গুরুত্বপূর্ণ নয়, এটি আবার জেনকিন্সকে এটির একটি অবিচ্ছেদ্য অঙ্গ। মোতায়েনও একই। আপনার একক পরিবেশ না থাকলে, স্থাপনা সাধারণত একাধিক পরিবেশে ঘটে। প্রচারগুলি ব্যবহারের মাধ্যমে জেনকিন্স কোনও পরিবেশ নির্ধারণ করে (এসভিএন পরিবর্তনের নির্দিষ্ট সেট সহ) কোন পরিবেশ তৈরি করেছে তা ট্র্যাক করতে পারে। আপনি এই সমস্ত পূর্ববর্তী হয়। দেখে মনে হচ্ছে আপনাকে "আপনাকে জেনকিনস ব্যবহার করতে হবে" তবে আপনি সত্যিই চান না, এবং আপনি কেবল আপনার বসকে পিঠ থেকে সরিয়ে দেওয়ার জন্য এটি করছেন, কেবল "হ্যাঁ, আমি জেনকিন্স ব্যবহার করেছি"

সংক্ষিপ্ত উত্তরটি হল: জেনকিনের এক্সিকিউট শেল বিল্ড স্টেপের শেষ কমান্ডের প্রস্থান কোডটিই বিল্ড স্টেপের সাফল্য / ব্যর্থতা নির্ধারণ করে । - সাফল্য, - ব্যর্থতা। দ্রষ্টব্য, এটি পুরো কাজের জন্য নয়, বিল্ড স্টেপের সাফল্য / ব্যর্থতা নির্ধারণ করছে । পুরো কাজ চালানোর সাফল্য / ব্যর্থতা আরও একাধিক বিল্ড পদক্ষেপ এবং পোস্ট-বিল্ড ক্রিয়া এবং প্লাগইনগুলির দ্বারা প্রভাবিত হতে পারে।0anything else

আপনি উল্লেখ করেছেন Build step 'Execute shell' marked build as failure, তাই আমরা কেবলমাত্র একক বিল্ড স্টেপে মনোনিবেশ করব। যদি আপনার এক্সিকিউট শেল বিল্ড স্টেপটিতে কেবল একটি একক লাইন থাকে যা আপনার শেল স্ক্রিপ্টকে কল করে তবে আপনার শেল স্ক্রিপ্টের প্রস্থান কোডটি বিল্ড স্টেপের সাফল্য / ব্যর্থতা নির্ধারণ করবে। আপনার শেল স্ক্রিপ্ট কার্যকর হওয়ার পরে যদি আরও লাইন থাকে তবে সাবধানতার সাথে সেগুলি পর্যালোচনা করুন, কারণ এগুলি হ'ল ব্যর্থতার কারণ হতে পারে।

শেষ পর্যন্ত এখানে পড়ুন জেনকিনস বিল্ড স্ক্রিপ্ট গুগল টেস্ট কার্যকর হওয়ার পরে বেরিয়ে আসে । এটি সরাসরি আপনার প্রশ্নের সাথে সম্পর্কিত নয়, তবে শেল স্ক্রিপ্ট হিসাবে জেনকিনস এক্সিকিউট শেল বিল্ড স্টেপ চালু করার বিষয়ে অংশটি নোট করুন note/bin/sh -xe

এর -eঅর্থ হ'ল শেল স্ক্রিপ্ট ব্যর্থতার সাথে প্রস্থান করবে , এমনকি যদি কেবল 1 কমান্ড ব্যর্থ হয়, এমনকি যদি আপনি সেই কমান্ডটি পরীক্ষা করতে ত্রুটি করেন (কারণ স্ক্রিপ্টটি আপনার ত্রুটি পরীক্ষা করার আগে এটি বেরিয়ে যায়)) এটি শেল স্ক্রিপ্টগুলির সাধারণ সম্পাদনের পরিপন্থী, যা সাধারণত ব্যর্থ কমান্ডের জন্য ত্রুটি বার্তাটি মুদ্রণ করে (বা এটিকে পুনঃনির্দেশিত করে এবং এটি অন্য উপায়ে পরিচালনা করে) এবং চালিয়ে যায়।

এটির set +eজন্য, আপনার শেল স্ক্রিপ্টের শীর্ষে যুক্ত করুন ।

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

দয়া করে কাজের রানের কনসোল আউটপুট পোস্ট করুন, এবং সম্ভবত শেল স্ক্রিপ্টটি নিজেই পোস্ট করুন এবং তারপরে আমরা আপনাকে সঠিকভাবে বলতে পারি কোন লাইনটি ব্যর্থ হচ্ছে।


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

45
জেনকিন্স ব্যবহারের এখনও বেশ কয়েকটি ভাল কারণ রয়েছে: নিরীক্ষণের ট্রেইল, স্থিতির দৃশ্যমানতা ইত্যাদি etc.
aehlke

3
এই উত্তর সার্ভারল্ট লিঙ্কটি সংযুক্ত করুন সার্ভারফল / a / 143576 / 186454 সেট + ই এবং সেট-ই আপনার স্ক্রিপ্টের যে কোনও জায়গায় নির্দিষ্ট করা যেতে পারে। যদি প্রাপ্ত মান 0 না হয় তবে এর মধ্যে যে কোনও
কোডই

2
শেল স্ক্রিপ্ট বনাম
জিনকিনস

আমরা জেনকিনগুলি কাজের জন্য প্রমাণীকৃত অ্যাক্সেস এবং একটি ইউআই সরবরাহ করতে ব্যবহার করি। একটি ক্রোন এটি কাটবে না। জেনকিনস কেবল পঙ্গু চালায় না।
ffghfgh

90

আপনার প্রশ্নের সহজ এবং সংক্ষিপ্ত উত্তর হ'ল

আপনার "শেল এক্সিকিউট করুন" বিল্ড স্টেপে নিম্নলিখিত লাইনটি যুক্ত করুন।

#!/bin/sh

"এক্সিকিউট শেল" বিল্ড জব করার জন্য আমাদের কেন এই লাইনটির প্রয়োজনীয়তার কারণটি আমি আপনাকে ব্যাখ্যা করি।

ডিফল্টরূপে জেনকিনস গ্রহণ করে /bin/sh -xeএবং এর অর্থ -xপ্রতিটি কমান্ড মুদ্রণ করবে। এবং অন্য বিকল্পটি -e, যার ফলে শেলটি স্ক্রিপ্ট চালানো বন্ধ করে দেয় যখন কোনও কমান্ড শূন্য-সহ (যখন কোনও কমান্ড ব্যর্থ হয়) প্রস্থান কোড থেকে বেরিয়ে আসে।

সুতরাং যোগ করে #!/bin/shআপনাকে কোনও বিকল্প ছাড়াই কার্যকর করতে দেবে allow


4
সম্মত। -Xe ডিফল্ট সম্পর্কে জানতেন না। যখন আমার গ্রেপ কম্যান স্ট্রিংটি খুঁজে না পেয়েছিল তখন আমার পুরো স্ক্রিপ্টটি ব্যর্থ হয়েছে কারণ
গ্রেপ

দুর্দান্ত কাজ করেছেন! এটি আমার অ-গুরুত্বপূর্ণ পদক্ষেপগুলিতে ব্যবহার করে, একটি ক্লিনআপ ধাপ যা ঠিক এমন কিছু করে find . -name 'bower_components' -exec rm {} \;এবং কিছু ক্ষেত্রে এটি ব্যর্থ হয়েছিল। ধন্যবাদ!
ইয়র্ক

এটি সমস্ত কিছু সাফ করেছে - 'এবং অন্যান্য বিকল্প -e, যার ফলে শেলটি স্ক্রিপ্ট চালানো বন্ধ করে দেয় যখন কোনও কমান্ড শূন্য নয় (যখন কোনও কমান্ড ব্যর্থ হয়) প্রস্থান কোড সহ বের হয়' '
পরমবীর সিং কারওয়াল

3

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

যদি আপনার স্ক্রিপ্টে কোনও লাইন থাকে যেখানে ব্যর্থতা আশা করা হয়, যেমন গ্রেপ বা অনুসন্ধানের মতো, তবে কেবল || trueসেই লাইনের শেষে যুক্ত করুন । এটি নিশ্চিত করে যে লাইন সর্বদা সাফল্য ফিরিয়ে আনবে।

যদি আপনার সেই প্রস্থান কোডটি ব্যবহার করার দরকার হয় তবে আপনি যদি হয় তবে আপনার যদি বিবৃতিতে কমান্ডটি উত্তোলন করতে পারেন:

grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...

অথবা আপনি আপনার ||ধারাতে রিটার্ন কোডটি ক্যাপচার করতে পারেন :

grep foo bar || ret=$?

1
ধন্যবাদ ব্রায়ান আপনি আমার দিন বাঁচিয়েছেন। এছাড়াও, আমি -x এবং -e উভয় চালু করা ভাল ধারণা বলে মনে করি। যাতে আপনি আপনার জিনকিনস লগ দেখতে পাবেন।
বিকাশ বাসনেট 25'17

2

মসৃন এবং সাধারণ:

জেনকিনস যদি বিল্ড স্টেপটি দেখে (যা একটি স্ক্রিপ্টও) অ-শূন্য কোড সহ প্রস্থান করে, তবে বিল্ডটি একটি লাল বল (= ব্যর্থ) দিয়ে চিহ্নিত হয়েছে।

কেন এটি ঘটে তা আপনার বিল্ড স্ক্রিপ্টের উপর নির্ভর করে।

আমি অন্য দৃষ্টিকোণ থেকে অনুরূপ কিছু লিখেছি তবে এটি এটি যেভাবেই পড়তে সহায়তা করবে: জেনকিন্স কেন মনে করেন যে আমার বিল্ডটি সফল হয়েছে?


0

সুতরাং যোগ করে #!/bin/shআপনাকে কোনও বিকল্প ছাড়াই কার্যকর করতে দেবে allow

এটি আমার লিনাক্স ক্রীতদাসে জেনকিনস মাস্টারের কাছ থেকে ব্যাশ স্ক্রিপ্ট সম্পাদন করে এমন একটি সমস্যা ঠিক করতে আমাকে সহায়তা করেছিল। #!/bin/bash"বাস্তবায়ন শেল" ব্লকটিতে কেবল আমার আসল স্ক্রিপ্টের উপরে যুক্ত করে এটি আমার সমস্যাটিকে স্থির করেছে কারণ অন্যথায় এটি ত্রুটি দিচ্ছিল এমন বাশ শেলের সংস্করণ উইন্ডোজ গিট সরবরাহ করে।


0

জেনকিন্স ভারে। 1.635, স্থানীয় নেভিগেশন পরিবেশের পরিবর্তনশীল এটি দেখানো অসম্ভব:

$BUILD_NUMBER or ${BUILD_NUMBER}

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

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