Jenkins でジョブにファイルをアップロードするプラグイン

この記事は約6分で読めます。

Jenkinsのジョブ実行時に、ジョブにファイルを渡すことができます。
デフォルトの機能なんですがうまく動作せず、プラグインを導入して解決できました。
ちょっとクセがあるのでその使い方を説明します。

スポンサーリンク

デフォルトのファイルアップロード機能

デフォルトのビルドパラメータにファイルをアップロードするための設定項目があります。
ジョブ設定の中の、文字列や真偽値を渡す設定のできる「ビルドのパラメーター」のところにファイルアップロードの設定もあります。
これを設定するとジョブ実行時にファイルをアップロードしてジョブに渡すことができます。

そこでDeclarative Directive Generatorで生成したコード片を参考に下記のようなコードで試したところ、悲しいことに動作しませんでした。


parameters {
    file name: 'UPLOADFILE', description: 'ジョブ実行時にアップロードするファイル'
}
スポンサーリンク

File Parameterプラグイン

いろいそググってみたところ、下記のプラグインを見つけました。

File Parameter
Provides an alternative set of file parameters that work with Pipeline, unlike the type built into Jenkins core.

そのプラグインの説明で
「Offers alternative types of file parameter that are compatible with Pipeline and do not suffer from the architectural flaws of the type built into Jenkins core.」
とあるので、ファイルアップロードできないのはまあよくある問題のようです

結果から言うと今プラグインでファイルのアップロードできました。ただちょっとクセがあるので使い方を下記に書きます。

File Parameterプラグイン有効化

このプラグインをインストールすると、ジョブ設定の「ビルドのパラメーター」のところにデフォルトのファイルアップロードに似た設定が追加されます。
「Stashed File Parameter」というのがそれです。

Jenkinsfile で書くと下記のようになります。


parameters {
    /* file パラメータはどうもpipelineでは動作しないらしいのでプラグインを利用. */
    stashedFile name: 'UPLOADFILE', description: 'ジョブ実行時にアップロードするファイル'
}

これでワークスペースにジョブ開始時にアップロードしたファイルが、ワークスペースに UPLAODFILE というファイル名で保存されます。
ワークスペース上のファイル名は、オリジナルのファイル名に関わらず上記の prameter のとこで指定した名前になります。

ファイル名をオリジナルと同じにする

アップロードされたファイル名が毎回固定のファイル名に変換されてしまうのは嫌な場合も多いかと思います。
そこでファイル名をオリジナルに戻す方法を2つ説明します。

まずは「withFileParameter()」を利用する方法です。このメソッドの説明は公式サイトの下記のページにあります。

File Parameter Plugin
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy...

その利用方法がプラグインのヘルプにあります。

file-parameters-plugin/src/main/resources/io/jenkins/plugins/file_parameters/FileParameterWrapper/help.html at master · jenkinsci/file-parameters-plugin
Contribute to jenkinsci/file-parameters-plugin development by creating an account on GitHub.

抜粋すると下記のようになります。この場合「$UPLOADFILE」がオリジナルのファイル名です。
注意が必要なのはこれはGroovyの変数ではありません。ですのでJenkinsfileから直接展開はできません。
下記の例ではシンブルクォートでそのまま「$UPLOADFILE」としてシェルに渡しています。
もしダブルクォーテーションをつかうなら「\$UPLOADFILE」のようにエスケープが必要です。


stages {
    stage ('アップロードファイルのリネーム') {
        steps {
            script {
                withFileParameter(name:'UPLOADFILE', allowNoFile: true) {
                    sh 'if [ -f "$UPLOADFILE" ]; then mv UPLOADFILE $UPLOADFILE; fi'
                }
            }
        }
    }
}

ファイル名をオリジナルと同じにする

上記の方法でもOKですが、いちいちwithFileParameter() で囲むのがめんどくさい場合は下記のようにできます。
下記の例ではファイルをアップロードしなかった場合も判定しています。


stages {
    stage ('アップロードファイルのリネーム') {
        steps {
            script {
                if (sh(returnStdout: false, returnStatus: true, script: 'test -n "$UPLOADFILE_FILENAME"') == 0) {
                    unstash 'UPLOADFILE'
                    sh "mv UPLOADFILE \$UPLOADFILE_FILENAME" // エスケープ必要.
                } else {
                    echo "UPLOADFILE is not uploaded."
                }
             }
        }
    }
}

まず、「*_FILENAME」でアップロードしたファイルのファイル名を取得できます。
上記の例では UPLAOD_FILENAMEがそれに該当します。
このファイル名が空かどうかでファイルがアップロードされたのか判定しています。
‘test -n “$UPLOADFILE_FILENAME”‘ の部分です。
この変数もGroovyの変数ではないのでシングルクォートで囲むかエスケープしてください

次に unstash でファイルを実際に取得します。ここで初めてワークスペースにファイルがコピーされます。
あとは mv でファイル名前を変更すれば、ワークスペースにもとのファイル名でファイルがアップロードされたことになります。

スポンサーリンク

まとめ

今回はJenkinsでファイルをアップロードするプラグインの使い方を説明しました。
ちょっとクセがあるのでこの記事を参考に色々試してみてください。

コメント