[解決済み] Jenkins Pipeline NotSerializableException: groovy.json.internal.LazyMap
質問
解決済み
: ありがとうございます。
回答
S.Richmondより。私はアンセットする必要がありました
すべて
の保存されたマップを
groovy.json.internal.LazyMap
型の変数を無効化することを意味します。
envServers
と
object
を使用した後です。
追加
: このエラーを検索している人はJenkinsのパイプラインステップを使うことに興味があるかもしれません。
readJSON
を使うことに興味があるかもしれません。
ここで
.
Jenkins Pipelineを使って、ユーザーからの入力をjson文字列としてジョブに渡そうとしています。Pipelineはslurperを使用してこれを解析し、私は重要な情報を選び出します。そして、その情報を使って、1つのジョブを異なるジョブパラメータで複数回、並行して実行します。
以下のコードを追加するまでは
"## Error when below here is added"
を追加するまでは、スクリプトは問題なく実行されます。それ以下のコードも単独で実行されます。しかし、組み合わせると以下のようなエラーになります。
トリガーされたジョブは呼び出され、正常に実行されますが、以下のエラーが発生し、メインジョブが失敗することに注意する必要があります。このため、メインジョブはトリガーされたジョブのリターンを待つことはありません。I
は
の周りをtry/catchしてください。
build job:
の周りでtry/catchすることもできますが、私はメインジョブがトリガーされたジョブの終了を待つようにしたいのです。
どなたか助けていただけませんか?もしこれ以上情報が必要なら、私に知らせてください。
乾杯
def slurpJSON() {
return new groovy.json.JsonSlurper().parseText(BUILD_CHOICES);
}
node {
stage 'Prepare';
echo 'Loading choices as build properties';
def object = slurpJSON();
def serverChoices = [];
def serverChoicesStr = '';
for (env in object) {
envName = env.name;
envServers = env.servers;
for (server in envServers) {
if (server.Select) {
serverChoicesStr += server.Server;
serverChoicesStr += ',';
}
}
}
serverChoicesStr = serverChoicesStr[0..-2];
println("Server choices: " + serverChoicesStr);
## Error when below here is added
stage 'Jobs'
build job: 'Dummy Start App', parameters: [[$class: 'StringParameterValue', name: 'SERVER_NAME', value: 'TestServer'], [$class: 'StringParameterValue', name: 'SERVER_DOMAIN', value: 'domain.uk'], [$class: 'StringParameterValue', name: 'APP', value: 'application1']]
}
エラーです。
java.io.NotSerializableException: groovy.json.internal.LazyMap
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:569)
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.LinkedHashMap.internalWriteEntries(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
...
...
Caused by: an exception which occurred:
in field delegate
in field closures
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5288c
どのように解決するのですか?
今日、私自身この問題に遭遇し、いくつかのブルートフォースを通じて、解決方法と潜在的な理由の両方が判明しました。
おそらく、その理由から始めるのが最善でしょう。
Jenkinsは、すべてのジョブを中断、一時停止、およびサーバーの再起動によって再開できるパラダイムを持っています。これを達成するために、パイプラインとそのデータは完全にシリアライズ可能でなければなりません - つまり、すべての状態を保存できる必要があるのです。同様に、ビルドのノードとサブジョブの間でグローバル変数の状態をシリアライズできる必要があります。これは、あなたと私が考えていることであり、追加のビルドステップを追加した場合にのみ発生する理由です。
何らかの理由で、JSONObject はデフォルトではシリアライズ可能ではありません。私は Java 開発者ではないので、悲しいことに、このトピックについてこれ以上多くを語ることはできません。GroovyとJenkinsにどの程度適用できるかはわかりませんが、これを適切に修正する方法についての回答はたくさんあります。 この投稿を見る を参照してください。
どのように修正するのか
もし方法を知っているならば、おそらくJSONObjectを何らかの方法でシリアライズ可能にすることができます。そうでなければ、グローバル変数がその型でないことを確認することで解決できます。
をアンセットしてください。
object
の設定を解除するか、メソッドでラップして、そのスコープがノードグローバルでないようにしてください。
関連
-
[解決済み】tsconfig.json: Build:No inputs were found in config file.
-
[解決済み] ヘッダ値:application/vnd.api+json
-
[解決済み] JSON Schemaにおける "required "と "optional "の違いについて
-
[解決済み] UnixツールでJSONをパースする
-
[解決済み] Jenkinsを手動で再起動する方法は?
-
Ext.grid.EditorGridPanelを使用する際に発生する問題点
-
[解決済み] VS Codeで、"JSONではコメントが許可されていません "というエラーを無効にする。
-
[解決済み] どのようにjqを使用して2つのファイルから2つのJSONオブジェクトをマージするには?
-
[解決済み] Swift 4 の JSONDecoder で、見つからないキーは、オプションのプロパティである必要はなく、デフォルト値を使うことができますか?
-
[解決済み] ASP.NETでWebAPIやMVCを使ってJSONを返す。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】tsconfig.json: Build:No inputs were found in config file.
-
[解決済み] コマンドラインを使用してJSONオブジェクトの項目をカウントする方法は?
-
ジャクソン・ジャクソン・コア
-
[解決済み] JSON APIのレスポンス形式には規格がありますか?
-
[解決済み] jqを使用して、オブジェクト内の変数の値に基づいてオブジェクトを選択します。
-
[解決済み】GoのJSONマーシャルでJSONのキー名を小文字にする
-
[解決済み] どのようにjqを使用して2つのファイルから2つのJSONオブジェクトをマージするには?
-
[解決済み] http.GetからJSONレスポンスを取得する方法
-
[解決済み] VSCodeでlaunch.jsonに環境変数を追加する方法
-
[解決済み] ヘッダー値:application/vnd.api+json