শেল স্ক্রিপ্টগুলি চলাকালীন জেনকিনসে কীভাবে কোনও বিল্ডকে অস্থির হিসাবে চিহ্নিত করবেন


93

যে প্রকল্পে আমি কাজ করছি, আমরা বিভিন্ন কাজ সম্পাদন করতে শেল স্ক্রিপ্ট ব্যবহার করছি। কিছু sh / bash স্ক্রিপ্ট যা rsync চালায়, এবং কিছু পিএইচপি স্ক্রিপ্ট। পিএইচপি স্ক্রিপ্টগুলির মধ্যে একটিতে কিছু সংহতকরণ পরীক্ষা চলছে যা জুনিট এক্সএমএল, কোড কভারেজ রিপোর্ট এবং অনুরূপ আউটপুট দেয়।

জেনকিন্স করতে সক্ষম হয় সফল / উপর ভিত্তি করে ব্যর্থ হয়েছে কাজ চিহ্নিত প্রস্থান অবস্থা । ইন পিএইচপি, 1 সহ স্ক্রিপ্টের প্রস্থানের এটা সনাক্ত করেছে যে পরীক্ষা সঞ্চালিত হবে সময় ব্যর্থ হয়েছে। অন্যান্য শেল স্ক্রিপ্টগুলি কমান্ডগুলি চালায় এবং বিল্ড ব্যর্থ হিসাবে চিহ্নিত করতে সেগুলি থেকে প্রস্থান কোডগুলি ব্যবহার করে।

// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);

ইন জেনকিন্স পরিভাষা , একটি পরিবর্তনশীল বিল্ড হিসাবে সংজ্ঞায়িত করা হয়:

একটি বিল্ড অস্থির হয় যদি এটি সফলভাবে নির্মিত হয় এবং এক বা একাধিক প্রকাশক এটি অস্থির প্রতিবেদন করে। উদাহরণস্বরূপ, যদি JUnit প্রকাশক কনফিগার করা থাকে এবং কোনও পরীক্ষা ব্যর্থ হয় তবে বিল্ডটি অস্থির হিসাবে চিহ্নিত করা হবে।

আমি কীভাবে জেনকিন্সকে শেল স্ক্রিপ্টগুলি চালানোর সময় কেবল সাফল্যের / ব্যর্থতার পরিবর্তে কোনও বিল্ডকে অস্থির হিসাবে চিহ্নিত করতে পারি?


আমি এটা diffrent কাজ পদক্ষেপ দৌড়ানো এবং Jenkins প্লাগিন ব্যবহার সংযোজন stackoverflow.com/questions/25442343/...
fantastory

উত্তর:


58

পাঠ্য-সন্ধানকারী প্লাগইন ব্যবহার করুন ।

স্থিতি 1 (যা বিল্ডে ব্যর্থ হবে) দিয়ে বেরিয়ে আসার পরিবর্তে করুন:

if ($build_error) print("TESTS FAILED!");

পোস্ট-বিল্ড-পরবর্তী ক্রিয়াগুলি পাঠ্য সন্ধানকারীকে সক্ষম করে, আপনার মুদ্রিত বার্তাকে মেলে দেওয়ার জন্য নিয়মিত অভিব্যক্তিটি সেট করুন ( TESTS FAILED!) এবং সেই প্রবেশের অধীনে "যদি অস্থির খুঁজে পাওয়া যায়" চেকবক্সটি পরীক্ষা করে দেখুন।


4
কোনো প্ল্যাগইন ইনস্টল ছাড়াই একটি বিকল্প জন্য নিচে উত্তর দেখার Jenkins সংস্করণ 2.26 যেহেতু: stackoverflow.com/a/49676269/1347649
JSoet

65

আধুনিক জেনকিন্স সংস্করণ (২.২26, অক্টোবর ২০১ 2016 সাল থেকে) এটি সমাধান করেছে: এটি এক্সিকিউট শেল বিল্ড পদক্ষেপের জন্য কেবল একটি উন্নত বিকল্প!

বিল্ড জন্য প্রস্থান কোড

আপনি কেবল একটি স্বেচ্ছাসেবী প্রস্থান মান নির্বাচন এবং সেট করতে পারেন; যদি এটি মেলে, বিল্ডটি অস্থির হবে। কেবলমাত্র এমন একটি মান বেছে নিন যা আপনার বিল্ডে কোনও বাস্তব প্রক্রিয়া দ্বারা আরম্ভ হওয়ার সম্ভাবনা নেই।


আমি এই বিকল্পটি পছন্দ করি কারণ এটির জন্য আপনাকে কোনও অতিরিক্ত প্লাগইন ইনস্টল করার প্রয়োজন নেই
ম্যাথারম্যান

4
যেহেতু এটি সর্বশেষ জেনকিন্সে প্রয়োগ করা হয়েছে - এটি একটি স্বীকৃত উত্তর হওয়া উচিত
ধূমপান 18

4
"মডার্ন জেনকিন্স সংস্করণ" এর অর্থ জেনকিন্স ২.২26 বা আরও নতুন। ইস্যুগুলি.জেনকিনস-ci.org/ ব্রাউজ / জেনকিনস-23786 দেখুন ।
নীল

4
এ-তে shস্টেপ কমান্ড ব্যবহার করার সময় কি কোডের মাধ্যমে এটি নির্দিষ্ট করা সম্ভব Jenkinsfile? জিইউআইতে সেটিংটি কোথায় অবস্থিত? আমি এটা খুঁজে পাচ্ছি না.
bluenote10

4
এটি প্রকাশের জন্য আমাকে বিল্ড স্টেপের নীচে "অ্যাডভান্সড ..." বোতামটি ক্লিক করতে হয়েছিল। "জিনিসগুলি করতে এখানে ক্লিক করুন" সংঘর্ষকারী এর পিছনে একটি একক (এবং বিশেষত উন্নত নয়) বিকল্পটি আড়াল করা খুব দরকারী নয় তবে এটি এটি।
ট্রিপলি

57

এটি যাদু স্ট্রিং মুদ্রণ এবং টেক্সটফাইন্ডার ব্যবহার না করেই করা যায়। এটি সম্পর্কে কিছু তথ্য এখানে

মূলত আপনার শেল স্ক্রিপ্টগুলিতে উপলব্ধ http: // thyerver.com / cli থেকে একটি .jar ফাইলের প্রয়োজন , তারপরে আপনি কোনও বিল্ডকে অস্থির হিসাবে চিহ্নিত করতে নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

java -jar jenkins-cli.jar set-build-result unstable

বিল্ডটি অস্থিরতে অস্থির চিহ্নিত করতে আপনি ব্যবহার করতে পারেন:

failing_cmd cmd_args || java -jar jenkins-cli.jar set-build-result unstable

সমস্যাটি হ'ল জেনকিনস-ক্লিপ.জারকে শেল স্ক্রিপ্ট থেকে উপলব্ধ থাকতে হবে। আপনি এটিকে সহজেই অ্যাক্সেসের পথে রাখতে পারেন, বা কাজের শেল স্ক্রিপ্টের মাধ্যমে ডাউনলোড করতে পারেন:

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar

4
আমি এই সমাধানটি সত্যই পছন্দ করি, আমি আমার রকেফিলগুলিতে সহজে পুনরায় ব্যবহারের জন্য এটির জন্য একটি রুবি শ্রেণি প্রয়োগ করেছি। :)
শায়ার

4
+1 - এটি গৃহীত উত্তরের চেয়ে ভাল সমাধান কারণ পাঠ্য ফাইন্ডার কেবল প্রতি চাকরির জন্য একটি স্ট্রিং সন্ধান করতে পারে, তাই আপনি কেবল দুটি মানের মধ্যে একটিতে বিল্ডের স্থিতি সেট করতে পারেন।
গ্যারেথ_উবলস

4
আকর্ষণীয় সমাধান। তবে যদি আপনার জেনকিনসের প্রমাণীকরণের প্রয়োজন হয় তবে আপনাকে তার কনফিগারেশনে সর্বজনীন কী প্রমাণীকরণ সেট আপ করতে হবে বা কোনও জেনকিনস-ক্লাইম কমান্ড অ্যাক্সেসডিনিডএক্সসেপশন ব্যর্থ হবে।
টম ডি লিউ

4
আপনি যদি কোনও দাসকে ব্যবহার করেন যা মাস্টারের কাছে কোনও ওয়েব অ্যাক্সেস নেই This উদাহরণস্বরূপ, জেনকিনস ক্রীতদাস যদি সার্ভারে ফিরে কোনও HTTP বা HTTPS সংযোগ তৈরি করতে না পারে।
স্টিভ এইচএইচএইচ

4
আমি এই সমাধানটি ব্যবহার করতে চেয়েছিলাম, তবে set-build-resultএর মধ্যে অবহেলা করা হয়েছে jenkins-cli
DrLime2k10

29

আপনার বিল্ড স্ক্রিপ্টটি মোড়ানোর জন্য আপনার জেনকিনসফিল ব্যবহার করা উচিত এবং ব্যবহারের মাধ্যমে বর্তমান বিল্ডটি কেবল অস্থির হিসাবে চিহ্নিত করা উচিত currentBuild.result = "UNSTABLE"

   মঞ্চ
      স্থিতি = / * আপনার বিল্ড কমান্ড এখানে যায় * /
      যদি (স্থিতি === "মার্ক-এ-অস্থির") {
        কারেন্টবিল্ড.আরসাল্ট = "অস্থির"
      }
   }

4
কেন এই উত্তরটি আরও উত্সাহী নয়? এটিতে কিছু সমস্যা আছে ("যাদু" স্ট্রিংয়ের ব্যবহার বাদে UNSTABLE)? অন্যান্য উত্তরের চেয়ে এটি আরও সোজা বলে মনে হচ্ছে।
কেভিন

4
প্রশ্নটি ফ্রিস্টাইল জব সম্পর্কে জিজ্ঞাসা করছিল, অন্যদিকে উত্তরটি পাইপলাইন চাকরির বিষয়ে। পাইপলাইন উত্তরটি ফ্রি স্টাইল
মার্ক ওয়েট

এটি কিভাবে কাজ করে? আমি একটি ত্রুটি Expected one of "steps", "stages", or "parallel" for stageপেয়েছি : যখন আমি সরাসরি মঞ্চের ভিতরে কারেন্টবিল্ড.আরসাল্ট সেট করার চেষ্টা করি।
ডকসপ্পার

11

আপনার গ্রোভি ব্যবহার করতে এবং পাঠ্যপদর্শক যা করেছে তা করতে সক্ষম হওয়া উচিত

গ্রোভি পোস্ট-বিল্ড প্লাগইন সহ একটি বিল্ডকে অ-স্থিতিশীল হিসাবে চিহ্নিত করে

if(manager.logContains("Could not login to FTP server")) {
    manager.addWarningBadge("FTP Login Failure")
    manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red")
    manager.buildUnstable()
}

গ্রোভি পোস্টবিল্ড প্লাগইনও দেখুন


6

আমার কাজের স্ক্রিপ্টে, আমার কাছে নিম্নলিখিত বিবৃতি রয়েছে (এই কাজটি কেবল জেনকিন্স মাস্টারের উপর চলে):

# This is the condition test I use to set the build status as UNSTABLE
if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then
  echo WARNING: disc usage percentage above 80%

  # Download the Jenkins CLI JAR:
  curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar

  # Set build status to unstable
  java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable

fi

আপনি এটি এবং জেনকিন্স উইকিতে স্থিতি স্থাপনের বিষয়ে আরও অনেক তথ্য দেখতে পাবেন: https://wiki.jenkins-ci.org/display/JENKINS/ জেনকিনস + সিএলআই


4
  1. এক্সএমএল জুনিট রিপোর্ট তৈরি করতে পিএইচপি বিল্ড কনফিগার করুন

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. স্থিতি 0 সহ বিল্ড স্ক্রিপ্ট শেষ করুন

    ...
    exit 0;
    
  3. পোস্ট-বিল্ড অ্যাকশন যুক্ত করুন পরীক্ষার রিপোর্ট এক্সএমএলগুলির জন্য JUnit পরীক্ষার ফলাফল প্রতিবেদন প্রকাশ করুন । পরীক্ষা ব্যর্থ হলে এই প্লাগইনটি স্থিতিশীল বিল্ডটিকে অস্থিরতায় পরিবর্তন করবে।

    **/build/junit.xml
    
  4. যোগ জেনকিন্স টেক্সট ফাইন্ডারে কনসোল আউটপুট স্ক্যানিং এবং অবারিত বিকল্প সহ প্লাগইন। মারাত্মক ত্রুটির উপর এই প্লাগইন পুরো বিল্ড ব্যর্থ।

    PHP Fatal error:
    

3

গ্রোভির পোস্ট বিল্ড প্লাগইনটিতে একটি ফাইল পড়ে এটি করার সর্বাধিক নমনীয় উপায়টি আমি খুঁজে পাই। এখানে চিত্র বর্ণনা লিখুন

import hudson.FilePath
import java.io.InputStream

def build = Thread.currentThread().executable

String unstable = null
if(build.workspace.isRemote()) {
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/build.properties")
    InputStream is = fp.read()
    unstable = is.text.trim()
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/build.properties"))
    InputStream is = fp.read()
    unstable = is.text.trim()
}

manager.listener.logger.println("Build status file: " + unstable)
if (unstable.equalsIgnoreCase('true')) {
    manager.listener.logger.println('setting build to unstable')
    manager.buildUnstable()
}

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


আমি ধরে নিচ্ছি এটি সত্যিই বলছে "যদি ওয়ার্কপেসে বিল্ড.প্রোপার্টি নামে একটি ফাইল থাকে" অস্থির হিসাবে চিহ্নিত করে। এটা কি সঠিক? আমি গ্রোভির কাছে নতুন, আপনি কি এই ব্যাখ্যাটি আরও কিছুটা ভাঙতে আপত্তি করবেন?
uchuugaka

@ মুচুগাকা হ্যাঁ, যদি কোনও ফাইল থাকে এবং এতে contents বিষয়গুলি থাকে। ফাইলের নাম এবং বিষয়বস্তুগুলি নির্বিচারে। আপনার ক্ষেত্রে যা উপযুক্ত তা ব্যবহার করুন।
jeremyjjbrown

ধন্যবাদ! খুব উপকারী. গ্রোভি পোস্টবিল্ড মোটামুটি পরোক্ষ, এবং গ্রোভী জাভা থেকে এত বিশাল পরিমাণে জিনিসপত্র সাজাচ্ছেন এবং আরও যোগ করেন ... এটি আমার জন্য একটি নতুন কৌশল।
uchuugaka

@ কুচুগাকা আমি গ্রোভির সমস্যা মনে করি না :)
jeremyjjbrown

মোটেই সমস্যা নয়। ঝুঁকে পড়া কেবল একটি চ্যালেঞ্জ!
উছুগাকা

2

টেক্সটফাইন্ডার কেবল তখনই ভাল যখন কাজের স্থিতি সাফল্য থেকে ব্যর্থ বা আবদ্ধ করা হয়নি। এই জাতীয় ক্ষেত্রে, পোস্ট বিল্ড পদক্ষেপে একটি গ্রোভি স্ক্রিপ্ট ব্যবহার করুন:

errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/;
manager.build.logFile.eachLine{ line ->
    errmatcher=errpattern.matcher(line)
    if (errmatcher.find()) {
        manager.build.@result = hudson.model.Result.NEW-STATUS-TO-SET
    }
 }

আমি এটি সম্পর্কে লিখেছি এমন একটি পোস্টে আরও বিশদ দেখুন: http://www.tikalk.com/devops/ জেনকিনস জোবস্ট্যাটাস চ্যাঞ্জ /


2

আমার উত্তরটি এখানে থেকে অনুলিপি করা হচ্ছে কারণ আমি এটি খুঁজতে কিছুটা সময় ব্যয় করেছি:

জেনকিন্সের নতুন সংস্করণগুলিতে এটি এখন সম্ভব, আপনি এর মতো কিছু করতে পারেন:

#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

পাইপলাইন সিনট্যাক্স জেনারেটর আপনাকে এটি উন্নত ট্যাবে দেখায়:

পাইপলাইন সিনট্যাক্স উদাহরণ


2

আমি ভেবেছিলাম এমন লোকদের জন্য আমি আরও একটি উত্তর পোস্ট করব যা সম্ভবত এর মতো কিছু খুঁজছে।

আমাদের বিল্ড জবটিতে আমাদের এমন কেস রয়েছে যেখানে আমরা বিল্ডটি চালিয়ে যেতে চাই, তবে অস্থির হিসাবে চিহ্নিত করা হবে। আমাদের জন্য এটি সংস্করণ সংখ্যার সাথে সম্পর্কিত।

সুতরাং, আমি বিল্ডটিতে একটি শর্ত নির্ধারণ করতে চেয়েছিলাম এবং যদি শর্তটি পূরণ হয় তবে বিল্ডটিকে অস্থির করতে চাই set

আমি বিল্ড স্টেপ হিসাবে শর্তসাপেক্ষ পদক্ষেপ (একক) বিকল্পটি ব্যবহার করেছি ।

তারপরে আমি নির্ধারিত সিস্টেম গ্রুভি স্ক্রিপ্টটি বিল্ড স্টেপ হিসাবে ব্যবহার করি যা যখন শর্তটি পূরণ হয় তখন চলবে।

আমি গ্রোভি কমান্ড ব্যবহার করেছি এবং স্ক্রিপ্টটি নীচে সেট করেছি

import hudson.model.*

def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE

return

এটি বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে।

আমি সমাধান এখানে হোঁচট খাচ্ছি

http://tech।


1

বিদ্যমান উত্তরের হালকা বিকল্প হিসাবে , গ্রোভী স্ক্রিপ্ট কনসোল REST এপিআই অ্যাক্সেস করার জন্য আপনি সাধারণ HTTP পোষ্টের সাথে বিল্ড ফলাফলটি সেট করতে পারেন :

    curl -X POST \
     --silent \
     --user "$YOUR_CREDENTIALS" \
     --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText

সুবিধাদি:

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

এই সমাধানের জন্য, আপনার পরিবেশকে এই শর্তগুলি পূরণ করতে হবে:

  • জেনকিনস আরএসটি এপিআই স্লেভ থেকে অ্যাক্সেস করা যায়
  • স্লেভের অবশ্যই শংসাপত্রগুলিতে অ্যাক্সেস থাকতে হবে যা জেনকিনস গ্রোভি স্ক্রিপ্ট REST এপিআই অ্যাক্সেস করতে দেয়।

0

কোনও বিল্ডটিকে অস্থির হিসাবে সেট করার একটি সহজ উপায় হ'ল আপনার "চালিত শেল" ব্লক, রান exit 13


-3

আপনি কেবল "প্রস্থান 1" কল করতে পারেন এবং বিল্ডটি সেই সময়ে ব্যর্থ হবে এবং চালিয়ে যাবে না। আমার কাছে এটি হ্যান্ডেল করার জন্য আমি পাসথ্রু মেক ফাংশন তৈরি করে ক্ষতবিক্ষত করেছি এবং বিল্ডিংয়ের পরিবর্তে মেকআপের পরিবর্তে সেফমেক কল করেছি:

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}

11
প্রস্থান 1, যতদূর আমি জানি কেবলমাত্র বিল্ডটিকে ব্যর্থ করে দেবে। আমি বিল্ডটি ব্যর্থ হওয়া চাই না, আমি চাই এটি অস্থির হিসাবে চিহ্নিত করা হোক।
এইচএনগার্ড

4
আরও দেখুন stackoverflow.com/questions/36313216/... - সহজ সমাধান ঠিক হয়if make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
tripleee
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.