tutorial - jenkins 란



서버를 다시 시작하지 않고 Jenkins에서 멈출 수없는 좀비 작업을 중지하는 방법? (14)

"Manage Jenkins"> "Script Console"으로 이동하여 서버에서 스크립트를 실행하여 걸려있는 스레드를 중단하십시오.

Thread.getAllStackTraces() 모든 라이브 스레드를 가져와 걸려있는 스레드를 중단 할 수 있습니다.

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

최신 정보:

스레드를 사용하는 위의 솔루션은 최신 Jenkins 버전에서 작동하지 않을 수 있습니다. 고정 파이프 라인을 중단하려면 ( alexandru-bantiuc ) this 솔루션을 대신 참조하여 this 을 실행하십시오.

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

우리 Jenkins 서버에는 3 일 동안 실행 된 작업이 있지만 아무 것도하지 않습니다. 모서리에있는 작은 X를 클릭해도 아무런 변화가 없으며 콘솔 출력 로그에도 아무 것도 표시되지 않습니다. 빌드 서버를 점검했는데 실제로 그 작업이 전혀 실행되지 않는 것처럼 보입니다.

jenkins에게 작업이 "완료되었습니다"라고 말하고, 일부 파일을 수정하거나 잠금을 걸거나 할 수 있습니까? 우리에게는 많은 일자리가 있기 때문에 실제로 서버를 다시 시작하지 않아도됩니다.


Answer #1

Alexandru Bantiuc의 답변은 빌드를 막기 위해 잘 작동했지만 집행자는 여전히 바쁜 것으로 나타났습니다. 다음 명령을 사용하여 busy executor status를 지울 수있었습니다.

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()
      }
    }
  }
}

Answer #2

나는 대답하기에는 너무 늦었다 고 생각하지만 어떤 사람들을 돕는다.

  1. 모니터링 플러그인을 설치하십시오. ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring )
  2. jenkinsUrl / monitoring / nodes로 이동하십시오.
  3. 하단의 스레드 섹션으로 이동하십시오.
  4. 마스터의 왼쪽에있는 세부 정보 버튼을 클릭하십시오.
  5. 사용자 시간순으로 정렬 (밀리 초)
  6. 그런 다음 스레드의 이름을 보면 빌드의 이름과 번호가 표시됩니다.
  7. 죽여

나는 이미지를 게시하는 데 충분한 명성이 없다.

희망이 도움이된다.


Answer #3

나는 또한 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를 지정하면됩니다.


Answer #4

다음은 Blue Ocean으로 버전 2.100 에서이 문제를 해결 한 방법입니다.

  • 내가 설치 한 유일한 플러그인은 bitbucket입니다.
  • 단 하나의 노드 만 있습니다.

내 Jenkins 상자에 ssh
cd ~/.jenkins (나는 젠킨스를 유지한다)
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>

이 후 선택적으로 nextBuildNumber 에서 숫자를 변경할 수 있습니다 (이 작업을 nextBuildNumber ).

마지막으로 젠킨스를 재시작했습니다. 양키스를 brew services restart jenkins 이 단계는 젠킨스 (Jenkins)를 관리하고 설치하는 방법에 따라 분명히 다릅니다.


Answer #5

두 번 나에게 똑같은 문제가 생겼다. 유일한 해결사는 톰캣 서버를 재시작하고 빌드를 다시 시작한 것이다.


Answer #6

이 같은 문제가 있었지만 스택 스레드가 없었습니다. Jenkins Console에서이 스 니펫을 사용하여 작업을 삭제했습니다. jobname과 buil dnumber를 자신의 것과 바꿉니다.

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

Answer #7

이 작업을 위해 Monitoring Plugin 을 사용 합니다 . 플러그인 설치 후

  1. Jenkins 관리> Hudson / Jenkins 마스터 모니터링
  2. 실의 세부 사항을 펼치고, 오른쪽의 작은 파란색 링크
  3. 걸려있는 작업 이름 검색

    스레드의 이름은 다음과 같이 시작됩니다.

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

  4. 원하는 작업이있는 행의 오른쪽 오른쪽에있는 빨간색 둥근 버튼을 클릭하십시오.


Answer #8

일단 "스크립트 콘솔"에 의해 멈출 수없는 빌드를 만났습니다. 마지막으로이 단계를 통해 문제를 해결했습니다.

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

Answer #9

작업을 복사하고 이전 작업을 삭제할 수 있습니다. 오래된 빌드 로그를 잃어 버리지 않아도 상관 없다면.


Answer #10

첫 번째 제안 된 솔루션은 매우 가깝습니다. interrupt () 대신 stop ()을 사용하면 그루비 시스템 스크립트에서 끝없이 실행되는 가출 스레드를 죽이기도합니다. 그러면 모든 빌드가 종료되고 작업을 위해 실행됩니다. 다음은 코드입니다.

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

Answer #11

최근에 저는 파이프 라인 작업의 "X"빌드로 인해 한 명의 집행자가 며칠 동안 점유 한 노드 / 에이전트를 보았습니다. 작업 페이지는 "X"빌드가 더 이상 존재하지 않는다고 선언했으나 (이후 10 개의 빌드 (!), 파이프 라인 작업에서 구성됨). 디스크에서 확인 : 빌드 "X"정말 사라 졌어요.

해결책 : 점령 된 집행자가 빌드 "X"를 실행하는 중 바쁘다고 잘못보고 한 것은 에이전트 / 노드입니다. 실행 프로그램의 스레드가 인터럽트되면 즉시이를 해제합니다.

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

println executor?.name
executor?.interrupt()

기타 답변 :

  • @cheffe의 답변 : 솔루션을 적용한 후에 만 ​​이해 했으므로 작동 여부는 알 수 없습니다 (다음 참조).
  • Thread.getAllStackTraces() 대한 답변 : 일치하는 스레드가 없습니다.
  • @ levente-holló의 대답과 getBuildByNumber()getBuildByNumber() 모든 대답은 빌드가 실제로는 더 이상 존재하지 않으므로 적용되지 않았습니다!
  • @austinfromboston의 대답은 내 필요에 가깝지만, 현재 실행중인 다른 빌드도 숨겨 놨습니다.

Answer #12

jkillthread 라고하는 유틸리티는 동일한 계정으로 서비스를 실행하는 시스템에 로그인 할 수있는 한 모든 Java 프로세스의 모든 스레드를 중지하는 데 사용할 수 있습니다.






jenkins