私の Jenkinsfile では、パラメーター値で構成される XML 文字列を作成する必要があります。一部の値は、XML 属性として設定できるように「xml エスケープ」する必要があります。
これを行う簡単な方法の 1 つは、"XmlUtil.escapeXml(text)" を呼び出すことです (ただし、これはスペースを使用しないと思います)。
ただし、Jenkinsfile では静的メソッドの呼び出しが許可されていないため、これは高レベルでは失敗します。
Jenkinsfileでこの種のことを行うための最も簡単な戦略は何ですか?
更新:
Groovy の原則をいくつか思い出した後、MarkupBuilder がこれに対する解決策になることに気付きましたが、「スクリプトは新しい groovy.xml.MarkupBuilder の使用を許可されていません」ということさえ許しません。
更新:
OK、セキュリティ制限をオーバーライドできましたが、Pipeline DSL 内で MarkupBuilder DSL を使用すると問題が発生します。
Jenkinsfile の最後 (全体的な「ノード」ブロックの後) に次のメソッドを定義しました。
def constructMessageXML(String qid, String qpassword, String contactID, String text, boolean isMeeting) {
def writer = new StringWriter()
MarkupBuilder mb = new MarkupBuilder(writer)
mb.message (type:"contact.send.message", id:qid, password:qpassword, contactId:contactID) {
statement (isMeeting ? [from:qid, to:contactID, text:text, type:"meeting"] : [from:qid, to:contactID, text:text]) {}
}
return writer.toString()
}
これを groovyConsole でテストしたところ、問題なく動作しました。
ただし、このメソッドを呼び出すジョブを実行すると、次のようになります。
java.lang.NoSuchMethodError: ステップ [VersionNumber、アーカイブ、awaitDeployment、... の中にそのような DSL メソッド「ステートメント」が見つかりません
そこにリストされているステップは Pipeline DSL からのものであるため、「methodMissing」ルックアップは MarkupBuilder クラスではなく Pipeline DSL に向かうようです。
メソッド定義に「@NonCPS」を追加しようとしたことに注意してください。それは違いはありませんでした。
更新:
これに対する解決策を見つけました。「statement」を「delegate.statement」に変更すると、これを回避できます。