回答:
[Jenkinsの管理]> [スクリプトコンソール]に移動して、サーバーでスクリプトを実行し、ハングしているスレッドを中断します。
すべてのライブスレッドを取得して、Thread.getAllStackTraces()
ハングしているスレッドを中断できます。
Thread.getAllStackTraces().keySet().each() {
t -> if (t.getName()=="YOUR THREAD NAME" ) { t.interrupt(); }
}
更新:
スレッドを使用する上記のソリューションは、最新のJenkinsバージョンでは機能しない場合があります。凍結されたパイプラインを中断するには、代わりに(alexandru-bantiucによる)このソリューションを参照して実行します。
Jenkins.instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(
hudson.model.Result.ABORTED,
new java.io.IOException("Aborting build")
);
t -> println(t.getName());
t.getName()=="SOME NAME"
ますか?
t.stop
代わりに呼び出す必要がありましたThread.getAllStackTraces().keySet().each() { t -> if (t.getName()=="YOUR THREAD NAME" ) { println(“Found, stopping now… “); t.stop(); } }
私も同じ問題を抱えていて、Jenkins Consoleで修正しました。
[Jenkinsの管理]> [スクリプトコンソール]に移動して、スクリプトを実行します。
Jenkins .instance.getItemByFullName("JobName")
.getBuildByNumber(JobNumber)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
JobNameとJobNumberを指定するだけです。
Jenkins.instance.getItemByFullName("JobName").getBuildByNumber(JobNumber).delete();
になりました。
finish
AbstractBuildにもFreeSyleBuildにもMavenModulesetBuildにもメソッドはありません
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
Multibranch Pipeline -job を取得した場合(かつJenkins管理者である場合)、Jenkinsスクリプトコンソールで次のスクリプトを使用します。
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から
このタスクには監視プラグインを使用します。プラグインのインストール後
ハングしているジョブ名を検索します
スレッドの名前はこのように始まります
Executor #2 for master : executing <your-job-name> #<build-number>
希望するジョブの行のテーブルの右端にある赤い丸いボタンをクリックします
最初に提案されたソリューションはかなり近いです。interrupt()の代わりにstop()を使用すると、暴走スレッドが強制終了され、groovyシステムスクリプトで無限に実行されます。これにより、ジョブで実行されるすべてのビルドが強制終了されます。これがコードです:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('YOUR JOBNAME')) {
println "Stopping $it.name"
it.stop()
}
}
contains
ここでの使用は不正確で危険です。ジョブの名前が「Run Tests」の場合、「Run Tests-Integration」、「Run Tests-Unit」などの名前のジョブもすべて強制終了します。これを使用する場合は、注意してください。無関係なジョブを予期せず終了させる
止められないパイプラインジョブがある場合は、以下を試してください。
Jenkinsはジョブを終了する必要があることを認識し、ビルドを停止します
スクリプトコンソールまたは追加のプラグインを使用することなく、あなたは単にすることができ、ビルドを中止入力することによって/stop
、/term
または/kill
お使いのブラウザでビルドURLの後に。
上記のリンクから逐語的に引用:
パイプラインジョブは、ビルドのURLエンドポイントにHTTP POSTリクエストを送信することで停止できます。
- <ビルドID URL> / stop stop-パイプラインを中止します。
- <BUILD ID URL> / term-ビルドを強制終了します(stopが機能しない場合にのみ使用してください。
- <ビルドID URL> / kill-パイプラインを強制終了します。これはパイプラインを停止する最も破壊的な方法であり、最後の手段としてのみ使用してください。
ビルドタイムアウトプラグインは、このような場合に便利です。時間がかかりすぎると、ジョブが自動的に強制終了されます。
答えるのは遅すぎると思いますが、私の助けとなる人もいます。
申し訳ありませんが、画像を投稿するのに十分な評判がありません。
それが役に立てば幸い
一番上の答えはほとんどうまくいきましたが、私には1つの大きな問題がありました:特にタイミングの悪いJenkinsの再起動が原因で、非常に多くの数(〜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
for 以外のものを返しますbuild.getResult()
。正当に実行されているジョブには、次のビルド結果もあります。null
であるため、これを実行する前に、強制終了したくない実行中のジョブがないことを確認してください。
複数のネストされたループは、主にマルチブランチパイプラインプロジェクトのすべてのリポジトリのすべてのブランチ/ PRを検出するために必要です。マルチブランチパイプラインを使用していない場合は、のようなものを使用して、すべてのジョブを直接ループできますJenkins.instance.getItems().each
。
runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) } runningBuilds.each { branch->branch.doKill() }
Jenkinsのソースを確認しましたが、ジョブの停止はスレッド割り込みを介して行われているように見えるため、実行しようとしていることが不可能であるようです。なぜ仕事がつり下げられているのか、私にはわかりません。
編集:
停止できないジョブの考えられる理由:
私は通常、そのような場合にjenkins-cliを使用します。jarはページからダウンロードできます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
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()
}
}
}
}
これと同じ問題がありましたが、スタックスレッドがありませんでした。Jenkins Consoleでこのスニペットを使用してジョブを削除しました。jobnameとbuil dnumberをあなたのものに置き換えます。
def jobname = "Main/FolderName/BuildDefinition"
def buildnum = 6
Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete();
最近、パイプラインジョブのビルド "X"によって1日間エグゼキューターが占有されているノード/エージェントに遭遇しましたが、そのジョブページはビルド "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()
考慮される他の回答:
Thread.getAllStackTraces()
:一致するスレッドがありません。getBuildByNumber()
:での、ビルドが実際には存在しなくなったため適用されませんでした。更新:
同じような状況が再び発生しました。Executorは、(まだ存在する)終了したパイプラインビルドによって数日間占有されていました。このコードスニペットは、唯一の有効なソリューションでした。
過去30分に同じ問題が発生しました...
マルチブランチパイプラインで実行されているゾンビビルドを削除できませんでした。UIによってサーバーを再起動したり、コマンドラインからサーバーを再起動したりしてもsudo service jenkins restart
、実行がブロックされました...ビルドを停止できませんでした...常に再表示されました。
使用されているバージョン:Jenkins ver 2.150.2
私は非常にイライラしましたが...ビルドのログを調べたところ、ログの最後で何かが気になりました:
赤いマークの付いた部分は「イライラする部分」です...ご覧のとおり、UIからビルドを中止したかったのですが、うまくいきませんでした...
しかし、テキスト付きのハイパーリンクがありますClick here to forcibly terminate running steps
...(最初の緑の1つ)次にリンクを押しました...)リンクの実行後、Still paused
別のリンクClick
here to forcibily kill entire build
(2番目の緑の1つ)に関するメッセージが表示されましたこのリンクを押した後、ビルドも最終的に困難でした殺された...
したがって、これは特別なプラグインなしで動作するようです(multibranch-pipelineビルドプラグイン自体を除く)。
tail
またはログビューアを使用してリンクを取得するのはどうですか?
<a href="#" onclick="new Ajax.Request('[server]/jenkins/job/[pipeline_name]/[job_number]/kill'); return false">Click here to forcibly kill entire build</a>
同じアカウントでサービスを実行しているマシンにログインできる限り、jkillthreadと呼ばれるユーティリティを使用して、任意のJavaプロセスの任意のスレッドを停止できます。
この問題が発生した理由はhttp
、ページのリンクが間違っていたためにhttps
ジョブが停止することではありませんでした。あなたがする必要があるのはonclick
、以下に従ってHTMLページの属性を編集することです
onclick
属性をダブルクリックして値を編集しますs
へhttp
持っていますhttps
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)
}
}
}
ジョブをコピーして古いジョブを削除するだけです。古いビルドログを失ったことが問題ではない場合。
2.100
ブルーオーシャンのバージョンでこの問題を修正した方法を次に示します
ssh
私のジェンキンスボックス
cd ~/.jenkins
(私がジェンキンス
を保管している場所)に
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>
この後、オプションで番号を変更できますnextBuildNumber
(これを行いました)
最後に、jenkinsを再起動しました(brew services restart jenkins
)この手順は、Jenkinsの管理方法とインストール方法によって明らかに異なります。
blue-ocean UIを開始します。そこからジョブを停止してみてください。