10

パイプラインでファイルから値を読み取る必要があります。それらをArrayに入れるsplit()を使用しています。それらをArraylistに入れる必要があるので、Arrays.asList()を使用しています。私が抱えている問題は、size()またはlength()メソッドを使用できないため、次のような for ループを作成できないことです。

for (ii = 0; ii < var.length; ii++)

また

for (ii = 0; ii < var.size; ii++)

エラーが発生するため: unclassified field java.util.Arrays$ArrayList length

そのため、for each ループを使用しようとしましたが、finally ブロックで何らかのアクション (たとえば ls コマンドなど) を実行すると、1 回だけ反復されます。しかし、コマンド 'echo' を実行すると、各要素が想定どおりに反復されます。コマンドを使用するときにリスト内の各要素を反復処理するようにコードを変更する方法に関するアドバイスはありますか?

正しく動作します....

node{
    wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [[fileId: 'dest_hosts.txt', targetLocation: '', variable: 'DEST_HOST']]]) {
        HOST = Arrays.asList(readFile(env.DEST_HOST).split("\\r?\\n"))
        deploy(HOST)
    }
}

@NonCPS
def deploy(host){
    for (String target : host){
        try {
            echo target
        }
        finally {
           echo target
        }
    }
}

OUTPUT (要素ごとに反復):

[Pipeline] node
Running on <obfuscated>
[Pipeline] {
[Pipeline] wrap
provisoning config files...
copy managed file [<obfuscated>] to file:/var/lib/jenkins/<obfuscated>
[Pipeline] {
[Pipeline] readFile
[Pipeline] echo
www.testhost.com
[Pipeline] echo
www.testhost.com
[Pipeline] echo
www.testhost2.com
[Pipeline] echo
www.testhost2.com
[Pipeline] }
Deleting 1 temporary files
[Pipeline] // wrap
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

しかし、 「ls -l」などのアクションを実行すると、1回しか繰り返されません

node{
    wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [[fileId: 'dest_hosts.txt', targetLocation: '', variable: 'DEST_HOST']]]) {
        HOST = Arrays.asList(readFile(env.DEST_HOST).split("\\r?\\n"))
        deploy(HOST)
    }
}

@NonCPS
def deploy(host){
    for (String target : host){
        try {
            echo target
        }
        finally {
           sh 'ls -l'
        }
    }
}

OUTPUT (1回だけ反復):

[Pipeline] node
Running on <obfuscated>
[Pipeline] {
[Pipeline] wrap
provisoning config files...
copy managed file [<obfuscated>] to file:/var/lib/jenkins/<obfuscated>
[Pipeline] {
[Pipeline] readFile
[Pipeline] echo
www.testhost.com
[Pipeline] sh
[sandbox%2Fpipeline-test-new1] Running shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 10 Jun 17 16:07 someFile
[Pipeline] }
Deleting 1 temporary files
[Pipeline] // wrap
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
4

4 に答える 4

9

ArrayList(そして一般的にLists)長さやサイズのフィールドはなく、size()メソッドがあります。したがって、それを for で使用します。

for (ii = 0; ii < var.size(); ii++)
于 2016-07-08T05:09:36.940 に答える
4

このチュートリアルに従って: https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md#serializing-local-variables

... 注釈 ... でマークされたメソッドは@NonCPS、パイプライン エンジンによって「ネイティブ」として扱われ、そのローカル変数は保存されません。ただし、パイプライン ステップへの呼び出しは行わない場合があります

あなたの場合、呼び出しはパイプラインのステップ操作であり、注釈付きのメソッドsh内から実行できないようです。@NonCPS

配列を に変換することに関してListは、Groovy ランドにいるので.toList()、配列でメソッドを使用できます。

于 2017-08-25T07:34:41.760 に答える