1

私の 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」に変更すると、これを回避できます。

4

0 に答える 0