2017-05-02 10 views
3

私はJenkinsのマスターで実行しているJenkinsの宣言的パイプラインを持っています。しかし、スレーブノードでこれを実行しようとしたので、パイプラインで呼び出されるGroovyスクリプトはワークスペース内のファイルにアクセスできません。Jenkins宣言型パイプライン、スレーブエージェントでgroovyスクリプトを実行

私jenkinsfileが...このようになります

pipeline { 

agent { 
    label { 
     label "windows" 
     customWorkspace "WS-${env.BRANCH_NAME}" 
    } 
} 

stages { 
    stage('InitialSetup') { 
    steps { 
    "${env.WORKSPACE}/JenkinsScripts/myScript.groovy" 
    } 
    } 
} 

私はそれは、ワークスペースを作成するにgitからチェックアウトをして、そして正確にスクリプトを実行しているスレーブで見ることができます。ただし、スクリプト内の何かがワークスペース内のファイルと対話しようとすると失敗します。

私はこのような単純なものを持っている場合...

def updateFile(String filename) { 
    echo env.NODE_NAME 
    filename = "${env.WORKSPACE}/path/to/file" 
    def myFile = new File(filename) 
    <do other things with the file> 
} 

...それはそれは指定されたファイルを見つけることができないと言います。それは私にそれが探しているパスを与え、私はファイルが存在することを確認することができ、コードはマスター上に構築するときに実行されます。

マスターノードで実行しているときに、このようなファイルが見つからないのはなぜですか?私はgroovyファイルに "echo env.NODE_NAME"コマンドを追加しました。スクリプトは正しいノードで実行されています。

ありがとうございました。

+0

この問題は、特にFileの使用に関連しているようですが、マスターでは実行できるがエージェントでは実行できないと考えられるためです。まだ調査中。 – FloatingCoder

答えて

5

Groovyファイルのコマンドは安全ではないとみなされ、マスターで実行されますが、スレーブでは実行されません。エージェントが別のノードに設定されているスクリプトから呼び出すと、コマンドはエージェントだけでなくマスターノードでも正常に実行されます。以下はその抜粋ビルドがマスター上で実行されている場合ので、私だけがそれにアクセスできる場合は、この例では、私はファイルとチェックを作成し、動作しますが、Fileクラスでの操作がマスター上で実行されているhttps://support.cloudbees.com/hc/en-us/articles/230922508-Pipeline-Files-manipulation


ここに記事投稿のメソッドが存在するノードでは、「新しいファイル(ファイル)」がマスターで実行されているため、存在しません。これを確認するには、マスターに存在するがノードには存在しないフォルダー「ユーザー」を検索します。

stage 'file move wrong way' 

    //it only works on master 
    node('slave') { 

    def ws = pwd() 
    def context = ws + "/testArtifact" 
    def file = ws + '/file' 
    sh 'touch ' + file 
    sh 'ls ' + ws 

    echo 'File on node : ' + new File(file).exists() 
    echo 'Users : ' + new File('/Users').exists() 

    sh 'mv ' + file + ' ' + context 
    sh 'ls ' + ws 
    } 

ファイル操作コマンドを実行するには、ネイティブコマンドを使用することをお勧めします。

これはreadFileに、WriteFile関数、FindFilesとなどの手順を使用してスレーブ・ワークスペース上のファイルを操作するには、シェル

stage 'Create file' 
    sh 'touch test.txt' 

stage 'download file' 
    def out='$(pwd)/download/maven.tgz' 
    sh 'mkdir -p ./download' 
    sh 'curl -L http://ftp.cixug.es/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -o ' + out 

stage 'move/rename' 
    def newName = 'mvn.tgz' 
    sh 'mkdir -p $(pwd)/other' 
    sh 'mv ' + out + ' ' + newName 
    sh 'cp ' + newName + ' ' + out 
} 
0

で操作の簡単な例です。

FloatingCoderのサイズが大きい場合は、ネイティブツールを使用しています。 Groovyスクリプトを実行している可能性があります。

関連する問題