วิธีหยุดงานซอมบี้ที่หยุดไม่ได้ใน Jenkins โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์


178

เซิร์ฟเวอร์เจนกินส์ของเรามีงานที่ทำงานมาสามวันแล้ว แต่ไม่ได้ทำอะไรเลย การคลิกที่เครื่องหมาย X เล็ก ๆ ที่มุมไม่ได้ทำอะไรเลยและบันทึกผลลัพธ์คอนโซลจะไม่แสดงอะไรเลย ฉันได้ตรวจสอบเซิร์ฟเวอร์การสร้างของเราแล้วและดูเหมือนว่างานจะไม่ทำงานเลย

มีวิธีที่จะบอกเจนกินส์ว่างานนั้น "เสร็จสิ้น" โดยการแก้ไขไฟล์หรือล็อกหรืออะไรบางอย่าง? เนื่องจากเรามีงานจำนวนมากเราจึงไม่ต้องการรีสตาร์ทเซิร์ฟเวอร์


1
ดูเหมือนกับเจนกินส์รุ่นล่าสุดการแก้ปัญหาไม่ใช่สิ่งที่ถูกทำเครื่องหมายว่ายอมรับ (แต่จาก '16)
NicolasW

คำตอบ:


213

ไปที่ "Manage Jenkins"> "Script Console" เพื่อเรียกใช้สคริปต์บนเซิร์ฟเวอร์ของคุณเพื่อขัดขวางเธรดที่หยุดทำงาน

คุณสามารถรับเธรดสดทั้งหมดด้วยThread.getAllStackTraces()และขัดขวางเธรดที่ค้างอยู่

Thread.getAllStackTraces().keySet().each() {
  t -> if (t.getName()=="YOUR THREAD NAME" ) {   t.interrupt();  }
}

UPDATE:

วิธีแก้ปัญหาข้างต้นที่ใช้เธรดอาจไม่ทำงานกับเจนกินส์รุ่นล่าสุด ในการอินเตอร์รัปต์ท่อแช่แข็งอ้างอิงถึงวิธีนี้ (โดยalexandru-bantiuc ) แทนและเรียกใช้:

Jenkins.instance.getItemByFullName("JobName")
                .getBuildByNumber(JobNumber)
                .finish(
                        hudson.model.Result.ABORTED,
                        new java.io.IOException("Aborting build")
                );

48
ใช้งานได้ดีมาก! สำหรับใครก็ตามที่อ่านคุณสามารถดูชื่อชุดคำสั่งได้โดยการเรียกใช้ข้างต้นโดยใช้วิธีการโทรt -> println(t.getName());
Phil

2
ยังคงไม่ทำงานกับสคริปต์ข้างบนด้วยเช่นกันการรับสคริปต์ แต่ไม่ฆ่าเหมือนกัน
Raghav S

2
คุณสามารถพิมพ์ชื่อของเธรดเฉพาะหลังจากจับคู่ชื่อได้t.getName()=="SOME NAME"หรือไม่
Zahra

3
สิ่งนี้ไม่ช่วยฉันเช่นกัน - เธรดไม่ตอบสนองต่อการขัดจังหวะ ()
Zitrax

2
สำหรับฉันขัดจังหวะไม่เพียงพอฉันต้องโทรt.stopแทน:Thread.getAllStackTraces().keySet().each() { t -> if (t.getName()=="YOUR THREAD NAME" ) { println(“Found, stopping now… “); t.stop(); } }
ศุกร์

258

ฉันมีปัญหาเดียวกันและแก้ไขผ่าน Jenkins Console

ไปที่ "Manage Jenkins"> "Script Console" และเรียกใช้สคริปต์:

 Jenkins .instance.getItemByFullName("JobName")
        .getBuildByNumber(JobNumber)
        .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")); 

คุณจะมีเพียงระบุ JobName และ JobNumber ของคุณ


ฉันมีสิ่งนี้ด้วยงานไปป์ไลน์ที่เริ่มงานอื่น เซิร์ฟเวอร์ขัดข้องงานอื่นหายไป แต่งานท่อยังคงเป็นผีดิบ ฉันลองคำตอบที่ได้รับการยอมรับก่อนเพื่อประโยชน์ ฉันต้องเรียกใช้คำสั่งของ @ Alexandru หลายครั้งทุกครั้งที่ฉันเห็นแถบความคืบหน้าของงานไปป์ไลน์เล็กน้อย ในที่สุดงานท่อก็เสียชีวิตและสำหรับมาตรการที่ดีฉันก็ลบมันด้วย
Amedee Van Gasse

18
วิธีนี้ใช้งานได้ดีสำหรับโครงการหลายสาขาเช่นกัน แต่กุญแจสำคัญคือการระบุ JobName เป็น Jenkins.instance.getItemByFullName ("<project-name> / <branch-name>")
evasilchenko

22
คำตอบนี้ช่วยให้ฉันแก้ปัญหาได้ ท่อส่งเป็นซอมบี้ทั้งหมด สคริปต์ด้านบนยังไม่ทำงานและไปป์ไลน์ยังคงทำงานอยู่แม้จะมีการรีสตาร์ทเจนกินส์สองสามครั้งก็ตาม ฉันอ่านเอกสารประกอบการเรียนภายในและพบวิธีการลบ () ดังนั้นสคริปต์ของฉันดูเหมือนว่านี้: Jenkins.instance.getItemByFullName("JobName").getBuildByNumber(JobNumber).delete();หลังจากดำเนินการนี้และอีกคนหนึ่งเจนกินส์รีสตาร์ทซอมบี้สร้างหายไปในที่สุด
Szymon Sadło

5
ไม่มีวิธีการfinishใน AbstractBuild หรือ FreeSyleBuild หรือ MavenModulesetBuild
Jakub Bochenski

3
ฉันมีปัญหาเมื่อเรียกใช้งานสคริปต์ความคิดใด ๆ groovy.lang.MissingMethodException: No signature of method: hudson.model.FreeStyleBuild.finish() is applicable for argument types: (hudson.model.Result, java.io.IOException) values: [ABORTED, java.io.IOException: Aborting build] Possible solutions: find(), findAll(), find(groovy.lang.Closure) at
Tien Dung Tran

31

ในกรณีที่คุณมีMultibranch Pipeline -job (และคุณเป็น Jenkins-admin) ให้ใช้ในJenkins Script Consoleสคริปต์นี้:

Jenkins.instance
.getItemByFullName("<JOB NAME>")
.getBranch("<BRANCH NAME>")
.getBuildByNumber(<BUILD NUMBER>)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));

จากhttps://issues.jenkins-ci.org/browse/JENKINS-43020

หากคุณไม่แน่ใจว่าชื่อเต็ม (เส้นทาง) ของงานคืออะไรคุณอาจใช้ตัวอย่างต่อไปนี้เพื่อแสดงชื่อเต็มของรายการทั้งหมด:

  Jenkins.instance.getAllItems(AbstractItem.class).each {
    println(it.fullName)
  };

จากhttps://support.cloudbees.com/hc/en-us/articles/226941767-Groovy-to-list-all-jobs


หมายเหตุข้างนี้: หากคุณใช้ SVN (และคุณทำตามอนุสัญญามาตรฐาน) <BRANCH NAME> ของคุณจะเป็นอะไรที่เหมือนกับbranch / my_branch
tvt173

25

ฉันใช้ปลั๊กอินการตรวจสอบสำหรับงานนี้ หลังจากการติดตั้งปลั๊กอิน

  1. ไปที่จัดการเจนกินส์> การตรวจสอบต้นแบบของฮัดสัน / เจนกินส์
  2. ขยายรายละเอียดของเธรดลิงค์สีน้ำเงินเล็ก ๆ ทางด้านขวา
  3. ค้นหาชื่องานที่หยุดทำงาน

    ชื่อของเธรดจะเริ่มต้นเช่นนี้

    Executor #2 for master : executing <your-job-name> #<build-number>

  4. คลิกปุ่มกลมสีแดงที่ด้านขวาของตารางงานที่คุณต้องการ


3
มันบอกว่าถูกฆ่าตาย แต่อีกครั้งเมื่อเรารีเฟรชหน้าด้ายดูเหมือนจะมีชีวิตอยู่
Raghav S

น่าสนใจ ฉันจะดูที่นี้ อาจขึ้นอยู่กับโครงสร้าง ในกรณีที่คุณเริ่มต้นกระบวนการภายนอกอาจเป็นไปได้โดย ANT หรือส่วนขยาย Maven นี้อาจล้มเหลว
cheffe

นี่คือทางออกที่ได้ผลสำหรับฉัน เพิ่งเข้าไปในรายการชุดข้อความค้นหาชื่องานแล้วคลิกปุ่มสีแดง jenkinsServer / monitoring # threads
Gilberto Treviño

24

เมื่อฉันพบโครงสร้างที่ไม่สามารถหยุดได้โดย "คอนโซลสคริปต์" ในที่สุดฉันก็แก้ปัญหาด้วยขั้นตอนเหล่านี้:

ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins

ที่จริงช่วยในกรณีของฉัน: งานไม่ได้อยู่อีกต่อไปในช่วงเวลาของการฆ่ามันผ่านคอนโซล (งานไปป์ไลน์แบบไดนามิก, สาขาฟีเจอร์ที่ถูกลบ)
mkko

24

วิธีแก้ปัญหาที่เสนอแรกนั้นค่อนข้างใกล้เคียง หากคุณใช้ stop () แทนที่จะขัดจังหวะ () มันจะฆ่าเธรดที่ไม่รันซึ่งจะรันในสคริปต์ระบบ groovy อย่างไม่มีที่สิ้นสุด สิ่งนี้จะฆ่าบิลด์ใด ๆ ที่รันสำหรับงาน นี่คือรหัส:

Thread.getAllStackTraces().keySet().each() {
    if (it.name.contains('YOUR JOBNAME')) {  
      println "Stopping $it.name"
      it.stop()
    }
}

4
IMO ที่ควรเป็นคำตอบที่ยอมรับได้ คำตอบอื่น ๆ ทั้งหมดไม่ได้ผลสำหรับฉันเนื่องจากบิลด์อยู่ในสถานะถูกขัดจังหวะแล้ว แต่การแขวนในบางขั้นตอนการสร้างโพสต์ วิธีแก้ปัญหานี้เท่านั้นที่ไม่ได้หยุดสร้าง
Kutzi

1
การใช้containsที่นี่ไม่ถูกต้องและอันตราย - ถ้าชื่องานของคุณคือ "Run Tests" มันจะฆ่างานใด ๆ ที่ชื่อ "Run Tests - Integration", "Run Tests - Unit" ฯลฯ ใครก็ตามที่ใช้สิ่งนี้จะต้องระมัดระวังไม่ให้ ยุติงานที่ไม่เกี่ยวข้องโดยไม่คาดคิด
Brandon

13

หากคุณมีงานไปป์ไลน์ที่ผ่านพ้นไม่ได้ลองต่อไปนี้:

  1. ยกเลิกงานโดยคลิก X สีแดงที่อยู่ติดกับแถบความคืบหน้าการสร้าง
  2. คลิกที่ "หยุดชั่วคราว / เล่นต่อ" บนบิลด์เพื่อหยุดชั่วคราว
  3. คลิกที่ "หยุดชั่วคราว / เล่นต่อ" อีกครั้งเพื่อดำเนินการสร้างต่อ

หยุดชั่วคราว / กลับไปที่งานท่อ

เจนกินส์จะตระหนักว่างานควรถูกยกเลิกและหยุดการสร้าง


8
ฉันไม่มีรายการเมนูนี้
papaiatis

13

โดยไม่ต้องใช้คอนโซลสคริปต์หรือปลั๊กอินเพิ่มเติมคุณก็สามารถยกเลิกการสร้างโดยการป้อน/stop, /termหรือ/killหลังจากที่สร้าง URL ในเบราว์เซอร์ของคุณ

การอ้างคำต่อคำจากลิงก์ด้านบน:

งานไปป์ไลน์สามารถหยุดได้โดยส่งคำร้องขอ HTTP POST ไปยังปลายทาง URL ของบิลด์

  • <BUILD ID URL> / หยุด - ยกเลิก Pipeline
  • <BUILD ID URL> / term - บังคับให้ยุติการสร้าง (ควรใช้ต่อเมื่อการหยุดไม่ทำงาน
  • <BUILD ID URL> / kill - ฆ่าไปป์ไลน์ยาก นี่เป็นวิธีที่อันตรายที่สุดในการหยุดท่อและควรใช้เป็นทางเลือกสุดท้าย

7

ปลั๊กอิน Build-timeoutอาจมีประโยชน์สำหรับกรณีดังกล่าว มันจะฆ่างานโดยอัตโนมัติหากใช้เวลานานเกินไป


1
แต่น่าเสียดายที่ไม่ได้เป็นตัวเลือกสำหรับเราเพราะเรามีคู่ของงานที่ควรจะใช้สำหรับวัน (ไม่ขอ)
blokkie

7
คุณกำหนดค่าการสร้างการหมดเวลาในงานพื้นฐาน
Draco Ater

1
ไม่มีเรามีการสร้างติดอยู่นานกว่า 3 ชั่วโมงกับชุดหมดเวลา 95 นาทีผมไม่คิดว่าหมดเวลาปลั๊กอินสามารถช่วยในขณะที่มันทำเช่นเดียวกับการคลิก "ยกเลิก" ด้วยตนเอง
ยาคุบบ Bochenski

7

ฉันเดาว่ามันสายเกินไปที่จะตอบ แต่ความช่วยเหลือของฉันบางคน

  1. ติดตั้งปลั๊กอินการตรวจสอบ ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring )
  2. ไปที่ jenkinsUrl / monitoring / nodes
  3. ไปที่หัวข้อหัวข้อที่ด้านล่าง
  4. คลิกที่ปุ่มรายละเอียดทางด้านซ้ายของต้นแบบ
  5. จัดเรียงตามเวลาของผู้ใช้ (มิลลิวินาที)
  6. จากนั้นดูที่ชื่อของเธรดคุณจะมีชื่อและหมายเลขบิลด์
  7. ฆ่ามัน

ฉันมีชื่อเสียงไม่พอที่จะโพสต์ภาพขอโทษ

หวังว่ามันจะช่วยได้


1
ไม่ช่วยมันบอกว่าฆ่า แต่อีกครั้งเมื่อหน้า reloads ฉันสามารถดูหัวข้อนั้น
Raghav S

คุณฆ่าเธรดของบิลด์หรือบิลย่อยของบิลด์หรือไม่? หัวข้อของหัวข้อนี้คืออะไร? ฉันเดาว่าคุณจะไม่ฆ่าคนดี หากคุณฆ่าเธรดของบิลด์คุณจะเห็นบิลด์เสร็จสิ้น
Simon

2
ฉันพยายามฆ่าเธรดซึ่งเชื่อมโยงกับจำนวนตัวเรียกทาสซึ่งมีชื่องานด้วย นอกจากนี้ฉันยังพบหัวข้ออื่น ๆ ที่เกี่ยวข้องกับการจัดการ GET และข้อมูลที่อยู่ในนั้นเกี่ยวกับการโค่นล้ม การสังหารทั้งคู่ก็ไม่ได้ช่วยอะไร ในที่สุดก็เริ่มช่วยฉัน อีกข้อสังเกตหนึ่งคือหัวข้ออื่น ๆ ที่ไม่มีการเชื่อมโยง SVN นั้นสามารถฆ่าได้
Raghav S

คำตอบนี้เป็นสำเนาของคำตอบ @cheffe ซึ่งโพสต์เมื่อหนึ่งเดือนก่อน
t0r0X

6

คำตอบด้านบนเกือบทำงานสำหรับฉัน แต่ฉันมีหนึ่งปัญหาสำคัญ: ฉันมีจำนวนมาก (~ 100) ของงานผีดิบเนื่องจากการเจนกินส์เริ่มต้นใหม่โดยเฉพาะอย่างยิ่งไม่ดีหมดเวลาเพื่อให้ตนเองหาชื่องานและหมายเลขการสร้างของแต่ละคนและ งานซอมบี้ทุกงานและฆ่าพวกมันด้วยตนเองนั้นเป็นไปไม่ได้ นี่คือวิธีที่ฉันค้นพบและฆ่างานซอมบี้โดยอัตโนมัติ:

Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
  repository.getItems().each { branch->
    branch.builds.each { build->
      if (build.getResult().equals(null)) {
        build.doKill()
      }
    }
  }
}

สคริปต์นี้วนรอบงานบิลด์ทั้งหมดของงานทั้งหมดและใช้getResult().equals(null)เพื่อพิจารณาว่างานเสร็จหรือไม่ สร้างที่อยู่ในคิว แต่ยังไม่ได้เริ่มต้นจะไม่ซ้ำมากกว่า (ตั้งแต่ที่สร้างจะไม่อยู่ในjob.builds) และการสร้างที่เสร็จแล้วจะกลับมาบางสิ่งบางอย่างอื่นที่ไม่ใช่สำหรับnull build.getResult()งานที่ถูกต้องตามกฎหมายจะมีผลงานการสร้างnullดังนั้นโปรดตรวจสอบให้แน่ใจว่าคุณไม่มีงานที่คุณไม่ต้องการฆ่าก่อนที่จะทำงานนี้

หลายลูปซ้อนกันเป็นส่วนใหญ่จำเป็นต้องค้นพบทุกสาขา / PR สำหรับทุกพื้นที่เก็บข้อมูลในโครงการ Multibranch Pipeline ถ้าคุณไม่ได้ใช้ท่อ Multibranch Jenkins.instance.getItems().eachคุณสามารถห่วงเพียงกว่างานของคุณทั้งหมดได้โดยตรงกับสิ่งที่ชอบ


3
ฉันปรับปรุงสคริปต์ของคุณเล็กน้อย runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) } runningBuilds.each { branch->branch.doKill() }
Tobi

5

ฉันได้ดูแหล่งที่มาของเจนกินส์และดูเหมือนว่าสิ่งที่ฉันกำลังพยายามทำนั้นเป็นไปไม่ได้เพราะการหยุดงานดูเหมือนว่าจะทำได้ผ่านการขัดจังหวะโดยเธรด ฉันไม่รู้ว่าทำไมงานถึงแขวนอยู่ ..

แก้ไข:

สาเหตุที่เป็นไปได้สำหรับงานที่ไม่สามารถหยุดได้:

  • ถ้าเจนกินส์ติดอยู่ในวงที่ไม่มีที่สิ้นสุดมันจะไม่มีวันถูกยกเลิก
  • หาก Jenkins กำลังทำเครือข่ายหรือไฟล์ I / O ภายใน Java VM (เช่นการคัดลอกไฟล์ที่มีความยาวหรืออัปเดต SVN) จะไม่สามารถยกเลิกได้

อันที่จริงมันเป็นไปไม่ได้ คุณสามารถใช้คอนโซลสคริปต์ jenkins เพื่อขัดขวางเธรดที่กำลังทำงานของคุณ ดูคำอธิบายได้ที่นี่: stackoverflow.com/a/26306081/1434041
Zahra

3

ฉันมักจะใช้เจนกินส์ - คลีในกรณีเช่นนี้ http://your-jenkins-host:PORT/cliคุณสามารถดาวน์โหลดขวดจากหน้าเว็บ จากนั้นเรียกใช้

java -jar jenkins-cli.jar delete-builds name_of_job_to_delete hanging_job_number

ข้อมูลเสริม:

นอกจากนี้คุณยังสามารถส่งงานสร้าง350:400ได้หลายแบบ ความช่วยเหลือทั่วไปพร้อมใช้งาน

java -jar jenkins-cli.jar help

บริบทคำสั่งช่วยdelete-buildsโดย

java -jar jenkins-cli.jar delete-builds

3

คำตอบของ Alexandru Bantiuc นั้นใช้ได้ผลดีสำหรับฉันที่จะหยุดการสร้าง แต่ผู้บริหารของฉันยังคงปรากฏตัวไม่ว่าง ฉันสามารถล้างสถานะผู้ปฏิบัติการไม่ว่างโดยใช้สิ่งต่อไปนี้

server_name_pattern = /your-servers-[1-5]/
jenkins.model.Jenkins.instance.getComputers().each { computer ->
  if (computer.getName().find(server_name_pattern)) {
    println computer.getName()
    execList = computer.getExecutors()      
    for( exec in execList ) {
      busyState = exec.isBusy() ? ' busy' : ' idle'
      println '--' + exec.getDisplayName() + busyState
      if (exec.isBusy()) {
        exec.interrupt()
      }
    }
  }
}

3

มีปัญหาเดียวกันนี้ แต่ไม่มีสแต็กเธรด เราลบงานโดยใช้ตัวอย่างนี้ในคอนโซลเจนกินส์ แทนที่ชื่องานและสร้างหมายเลขของคุณด้วย

def jobname = "Main/FolderName/BuildDefinition"
def buildnum = 6
Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete(); 

1
มันไม่ทำงาน! มันจะลบการสร้างจากมุมมองออกจากกระบวนการทำงานและทรัพยากรทั้งหมดถูกล็อค
Jakub Bochenski

3

เมื่อเร็ว ๆ นี้ฉันเจอโหนด / เอเจนต์ซึ่งมีผู้บริหารหนึ่งคนทำงานเป็นเวลาหลายวันโดยการสร้าง "X" ของงานไปป์ไลน์แม้ว่าหน้างานที่อ้างว่าบิลด์ "X" ไม่มีอยู่อีกต่อไป (ทิ้งหลังจาก 10 บิวด์ต่อมา กำหนดค่าในงานไปป์ไลน์) ตรวจสอบว่าบนดิสก์: สร้าง "X" หายไปจริงๆ

วิธีแก้ปัญหา: มันเป็นเอเจนต์ / โหนดซึ่งรายงานอย่างผิดพลาดว่าตัวดำเนินการที่ใช้งานอยู่นั้นกำลังยุ่งอยู่กับการสร้างบิลด์ "X" การขัดจังหวะเธรดของตัวจัดการได้เปิดตัวทันที

def executor = Jenkins.instance.getNode('NODENAME').computer.executors.find {
    it.isBusy() && it.name.contains('JOBNAME')
}

println executor?.name
if (executor?.isBusy()) executor.interrupt()

คำตอบอื่น ๆ ที่พิจารณา:

  • คำตอบจาก @cheffe: ไม่ทำงาน (ดูจุดต่อไปและอัปเดตด้านล่าง)
  • คำตอบด้วย Thread.getAllStackTraces() : ไม่มีเธรดที่ตรงกัน
  • คำตอบจาก @ levente-hollóและคำตอบทั้งหมดด้วย getBuildByNumber() : ไม่ได้ใช้เนื่องจากการสร้างไม่ได้มีอยู่จริงอีกต่อไป!
  • คำตอบจาก @austinfromboston: นั่นใกล้เคียงกับความต้องการของฉัน แต่มันก็ยังได้ทำให้ nuked build อื่น ๆ ที่ทำงานอยู่ในขณะนี้

อัปเดต:
ฉันพบสถานการณ์ที่คล้ายกันอีกครั้งซึ่งผู้บริหารถูกครอบครองหลายวันโดยการสร้างไปป์ไลน์ (ยังคงมีอยู่) ข้อมูลโค้ดนี้เป็นโซลูชันเดียวที่ทำงานได้


นี่เป็นเคล็ดลับสำหรับฉันขอบคุณ! โซลูชันอื่นไม่ทำงานเนื่องจากหมายเลขบิลด์ถูกโยนทิ้งไปแล้ว (เราเพิ่งสร้าง lat 5 บิวด์ดังนั้น job.getBuildByNumber (... ) ไม่ส่งคืนอะไรเลย)
L. Tischler

2

ฉันมีปัญหาเดียวกันในครึ่งชั่วโมงที่ผ่านมา ...

ไม่สามารถลบการสร้างซอมบี้ที่ทำงานอยู่ในไปป์ไลน์แบบหลายสาขาของฉันได้ แม้แต่เซิร์ฟเวอร์รีสตาร์ทโดย UI หรือแม้กระทั่งจาก commandline ผ่านsudo service jenkins restart ก็บล็อกการดำเนินการ ... การสร้างไม่สามารถหยุด ... มันจะ reapeared เสมอ

เวอร์ชันที่ใช้: Jenkins ver 2.150.2

ฉันรำคาญมาก แต่เมื่อมองเข้าไปในบันทึกของสิ่งก่อสร้างฉันพบบางสิ่งที่เข้ามาในตอนท้ายของบันทึก:

เอาต์พุต Logfile ของการสร้างซอมบี้และการแสดงการรีสตาร์ทไม่ได้หยุด

ชิ้นส่วนที่ทำเครื่องหมายสีแดงคือ "ชิ้นส่วนที่น่าผิดหวัง" ... อย่างที่คุณเห็นฉันต้องการที่จะยกเลิกการสร้างจาก UI เสมอ แต่มันไม่ทำงาน ...

แต่มีไฮเปอร์ลิงก์พร้อมข้อความClick here to forcibly terminate running steps... (สีเขียวอันแรก) ตอนนี้ฉันกดลิงค์ ... ) หลังจากดำเนินการเชื่อมโยงข้อความเกี่ยวกับการStill pausedปรากฏตัวพร้อมกับลิงค์อื่นClick here to forcibily kill entire build (สีเขียวที่สอง) หลังจากกดลิงค์นี้ยังสร้างในที่สุดก็ยาก ฆ่า ...

ดังนั้นสิ่งนี้จึงดูเหมือนว่าจะทำงานโดยไม่มีปลั๊กอินพิเศษใด ๆ (ยกเว้นปลั๊กอินสำหรับสร้าง multibranch-pip)


หากคุณให้ลิงก์ที่ "คลิกที่นี่เพื่อบังคับให้ฆ่างานสร้างทั้งหมด" ให้ไปฉันก็จะโหวตให้เพราะนั่นใช้ได้ผลสำหรับฉัน น่าเสียดายที่โซลูชันนี้ไม่ได้เนื่องจากเจนกินส์ล้มเหลวในการแสดงบันทึกล่าสุดเนื่องจากไฟล์บันทึกมีหลาย GB
mjaggard

ขออภัยขณะนี้ฉันไม่สามารถเข้าถึงบันทึกเหล่านี้ได้อีกต่อไป หากฉันมีความล้มเหลวนี้อีกครั้งฉันจะเพิ่มความเห็นของเธอ / การแก้ปัญหาการปรับปรุง แต่สิ่งที่เกี่ยวกับการทำเข้าสู่ระบบที่เครื่องเจนกินส์ของคุณและเพียงแค่ใช้tailหรือโปรแกรมดูบันทึกเพื่อรับลิงค์?
de-jcup

3
มันใช้งานได้สำหรับฉันขอบคุณ! @mjaggard: ลิงก์คือ:<a href="#" onclick="new Ajax.Request('[server]/jenkins/job/[pipeline_name]/[job_number]/kill'); return false">Click here to forcibly kill entire build</a>
kaveish

1

ฉันมีงานซอมบี้จำนวนมากดังนั้นฉันจึงใช้สคริปต์ต่อไปนี้:

for(int x = 1000; x < 1813; x = x + 1) {
    Jenkins .instance.getItemByFullName("JOBNAME/BRANCH")
    .getBuildByNumber(x)
    .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"))
}

1

สิ่งนี้ใช้ได้กับฉันทุกครั้ง:

Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {  
  println "Stopping $it.name"
  it.stop()
}

ขอบคุณ funql.org


0

มีปัญหาเดียวกันเกิดขึ้นกับฉันสองครั้งแล้วตอนนี้ fix sofa เท่านั้นที่ต้องรีสตาร์ทเซิร์ฟเวอร์ tomcat และเริ่มการสร้างใหม่


0

ยูทิลิตี้ที่ฉันเขียนชื่อjkillthreadสามารถใช้เพื่อหยุดเธรดใด ๆ ในกระบวนการ Java ใด ๆ ตราบใดที่คุณสามารถเข้าสู่เครื่องที่ใช้บริการภายใต้บัญชีเดียวกัน


0

โซลูชั่นที่เรียบง่ายมาก

เหตุผลที่ฉันเห็นปัญหานี้คือhttpลิงค์ที่ไม่ถูกต้องบนหน้าแทนที่จะเป็นhttpsสิ่งที่ควรหยุดงาน สิ่งที่คุณต้องทำคือแก้ไขonclickแอตทริบิวต์ในหน้า html โดยทำตาม

  1. เปิดบันทึกคอนโซลของงาน (ไปป์ไลน์) ที่ค้าง
  2. คลิกสิ่งที่มีอยู่เพื่อฆ่างาน (ไอคอน x, "คลิกที่นี่เพื่อบังคับให้ยุติขั้นตอนการทำงาน" ฯลฯ ) เพื่อรับลิงค์ "คลิกที่นี่เพื่อบังคับให้ฆ่าทั้งงานสร้าง" ปรากฏขึ้น ( ไม่ใช่สามารถคลิกได้ในขณะนี้)
  3. เปิดคอนโซลของเบราว์เซอร์ ( ใช้หนึ่งในสามตัวสำหรับ chrome: F12; ctrl + shift + i; menu-> tools tools-> tools developer )
  4. ค้นหาลิงก์ "คลิกที่นี่เพื่อบังคับให้ฆ่าทั้งบิลด์" ด้วยตนเองหรือใช้ปุ่ม "เลือกองค์ประกอบในหน้า" ของคอนโซล
  5. ดับเบิลคลิกที่ onclickแอตทริบิวต์เพื่อแก้ไขค่า
  6. ผนวกsเพื่อhttpที่จะมีhttps
  7. กด Enter เพื่อส่งการเปลี่ยนแปลง
  8. คลิกลิงก์ "คลิกที่นี่เพื่อบังคับให้ฆ่างานสร้างทั้งหมด"

ใช้ภาพหน้าจอสำหรับการอ้างอิง ป้อนคำอธิบายรูปภาพที่นี่


0

ใช้คอนโซลสคริปต์ที่https: // my-jenkins / script

import hudson.model.Job
import org.jenkinsci.plugins.workflow.job.WorkflowRun

Collection<Job> jobs = Jenkins.instance.getItem('My-Folder').getAllJobs()
for (int i = 0; i < jobs.size(); i++) {
  def job = jobs[i]
  for (int j = 0; j < job.builds.size(); j++) {
    WorkflowRun build = job.builds[j]
    if (build.isBuilding()) {
      println("Stopping $job ${build.number}")
      build.setResult(Result.FAILURE)
    }
  }
}

0

ไม่มีวิธีแก้ปัญหาเหล่านี้สำหรับฉัน ฉันต้องรีบู๊ตเครื่องที่ติดตั้งเซิร์ฟเวอร์ไว้ งานที่ไม่มีทักษะนั้นสิ้นสุดลงแล้ว


-1

คุณสามารถคัดลอกงานและลบงานเก่าได้ หากไม่สำคัญว่าคุณทำไฟล์บันทึกเก่าหาย


-2

นี่คือวิธีที่ฉันแก้ไขปัญหานี้ในเวอร์ชัน2.100กับ Blue Ocean

  • ปลั๊กอินที่ฉันติดตั้งไว้สำหรับ bitbucket เท่านั้น
  • ฉันมีเพียงโหนดเดียว

sshลงในกล่องเจนกินส์ของฉัน
cd ~/.jenkins(ที่ฉันเก็บเจนกินส์)
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>

หลังจากนี้คุณสามารถเลือกที่จะเปลี่ยนตัวเลขในnextBuildNumber(ฉันทำสิ่งนี้)

ในที่สุดฉันเริ่มต้นใหม่เจนกินส์ ( brew services restart jenkins) ขั้นตอนนี้จะแตกต่างกันอย่างเห็นได้ชัดขึ้นอยู่กับวิธีที่คุณจัดการและติดตั้งเจนกินส์


-3

ป้อน UI สีน้ำเงิน พยายามหยุดงานจากที่นั่น


นั่นหมายความว่าอย่างไร? เซิร์ฟเวอร์ Jenkins ของฉันไม่มี UI เช่นนี้
Nico Haase

ทะเลสีฟ้าเป็นปลั๊กอินเจนกินส์กันมากคุณสามารถอ่านเกี่ยวกับเรื่องนี้ที่นี่
user3360767

สิ่งนี้จริง ๆ แล้วยกเลิกงานในลักษณะที่แตกต่างจาก UI แบบดั้งเดิมหรือไม่ ดูเหมือนว่าน่าสงสัย
StockB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.