見出し画像

Jenkins上でrobocopyが失敗する理由と解決方法


テスト自動化メンバーのK.Tです!
普段はテスト自動化エンジニアとして、自動テストツールの調査や自動テストの実装/品質保証に取り組んでいます。
まだまだテスト自動化の経験は浅いですが、自分なりに調べて学んだことや吸収したことをアウトプットできればと思います。

さて今回はRanorexのビルド成果物をネットワークフォルダにコピーする際に、Jenkinsでrobocopyを行うと、必ずビルド結果が「failure」になってしまう現象を回避したので、その方法をまとめたいと思います。

3行で要約!

  • robocopyのexit codeが7以下の場合は基本的に成功している。

  • しかしJenkinsではexit codeが0で終了しなければ成功したと判断されない。

  • robocopyのexit codeが7以下の場合はexit codeを0にする分岐処理を入れることで解決する。

robocopy フォルダパスA フォルダパスB
@echo robocopy exit code: %ERRORLEVEL%
@if %ERRORLEVEL% leq 7 (
    echo robocopy completed successfully (code:1-7)
    exit 0
) else (
    echo robocopy ERROR
    exit %ERRORLEVEL%
)

起きたこと

RanorexのビルドをCI/CDパイプライン上で行うことで、mainブランチにマージされた際に、自動でビルドが走りテスト実施環境にRanorexExeが配置されるような仕組みを作成していました。

しかしJenkinsでビルドした成果物をネットワークフォルダに格納しようとしたところ、robocopyの動作が成功で終了しているのに、Jenkins側では「Build Failure」として扱われていました。

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         2         2         0         0         0         0
   Files :      4802      4802         0         0         0         0
   Bytes :   76.92 m   76.92 m         0         0         0         0
   Times :   0:01:52   0:01:51                       0:00:00   0:00:01


   Speed :              724928 Bytes/sec.
   Speed :              41.480 MegaBytes/min.
   Ended : 202492715:43:46


C:\temp\workspace\ranorex-build>exit 1 
Build step 'Execute Windows batch command' marked build as failure
Skipped archiving because build is not successful
Finished: FAILURE

原因

robocopyのexit code

robocopyのexit codeは複数あり、その値を組み合わせることで実行結果が表現されています。

Robocopy.exe からの戻りコードはビットマップであり、次のように定義されます。
0:エラーは発生せず、コピーも行われませんでした。 ソースと宛先のディレクトリツリーは完全に同期されます。
1:1つ以上のファイルが正常にコピーされました。
2:余分なファイルまたはディレクトリが検出されました。ファイルはコピーされませんでした。
4:不一致なファイルまたはディレクトリが検出されました。
8:一部のファイルまたはディレクトリをコピーできませんでした (コピー エラーが発生し、再試行制限を超えました)。
16:重大なエラー。robocopy はファイルをコピーしませんでした。

これらを組み合わせると、いくつかの追加の終了コードが生成されます。

3 (2+1):一部のファイルがコピーされました。追加のファイルが存在しました。エラーは発生しませんでした。
5 (4+1):一部のファイルがコピーされました。一部のファイルが一致しませんでした。エラーは発生しませんでした。
6 (4+2):追加ファイルと一致しないファイルが存在します。ファイルはコピーされず、エラーも発生しませんでした。これは、ファイルが宛先ディレクトリにすでに存在することを意味します。
7 (4+1+2):ファイルがコピーされましたが、ファイルの不一致があり、追加のファイルが存在しました。

終了コードが0 ~ 7の場合は成功、値が8以上の場合はコピー操作中に少なくとも1つの失敗があったことを示します。

※以下を参考に日本語に翻訳しています。https://ss64.com/nt/robocopy-exit.html

ここからexit codeが7以下の場合は、robocopyは問題なく実行が終わった=成功したと言えます。

Jenkinsのエラー判定

Jenkinsではコマンドの返り値のexit codeが0の場合に、そのコマンドは成功したと判断するようになっています。

この2つが合わさると…

robocopyで1以上7以下のexit codeが出力された場合、コマンドの実行は成功しているのに、Jenkinsでは失敗したと判断されてしまいます。

解決策

バッチ処理かJenkins側で、成功した場合はexit code 0を返すように分岐処理を入れる必要があります。

robocopyの場合であれば7以下は成功なので、7以下はすべて0と扱うようなシェルスクリプトを書きます。

robocopy フォルダパスA フォルダパスB
@echo robocopy exit code: %ERRORLEVEL%
@if %ERRORLEVEL% leq 7 (
    echo robocopy completed successfully (code:1-7)
    exit 0
) else (
    echo robocopy ERROR
    exit %ERRORLEVEL%
)

結果

修正後はrobocopyに成功すればexit codeが0になるので「Success」となりました。

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         2         2         0         0         0         0
   Files :      4802      4802         0         0         0         0
   Bytes :   76.92 m   76.92 m         0         0         0         0
   Times :   0:01:46   0:01:44                       0:00:00   0:00:01


   Speed :              769592 Bytes/sec.
   Speed :              44.036 MegaBytes/min.
   Ended : 202492716:03:11

robocopy exit code: 1
robocopy completed successfully (code:1-7)

C:\temp\workspace\ranorex-build>exit 0 
Archiving artifacts
Finished: SUCCESS

補足

実運用ではexit codeやステータスを受け渡して、どのような状態でrobocopyが完了したのかを引き継げるようにすると良さそうです。
今回はrobocopyのexit codeをechoで出力した後に、exit codeの改変を行っています。

最後に

私自身、シェルスクリプトを書く経験が少なく、コマンドの仕様や実際のコーディングに少し時間がかかってしまいました。
ただこれからテスト自動化エンジニアとして頑張っていく上で、業務で使う機会も増えてくるため、この機会にしっかり学習したいと思います!

日本ナレッジではテスト自動化に力を入れており、効果的な自動テストの構築や、新しい技術を取り入れたテスト自動化に興味がある「テスト自動化エンジニア」を募集しています。
ご興味のある方は以下のリンクからご応募ください!

【日本ナレッジ】若手先輩社員参加!企業説明&職場の雰囲気を理解できる2時間!!

「業界」「職種」「仕事」「社風」を理解していただく構成になります。

座談会では若手社員が登壇し
・業務内容
・当時業界研究していた時のこと
・社風、職場の雰囲気
などを、詳しく聞くことができます!

参加後は別日程にてカジュアル面談へご参加いただき、
もっと詳しく事業内容や職種について個人で話すこともできます!
※対象は文理不問です。

https://forms.office.com/Pages/ResponsePage.aspx?id=EjqRh__A706HDzNTQKJSANp1_T6dyktPok8UCPXT1kBUQ0M5UDZPSkxEVEFVMERJUzZXMzBBRjZVNy4u


いいなと思ったら応援しよう!