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 : 2024年9月27日 15: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は複数あり、その値を組み合わせることで実行結果が表現されています。
ここから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 : 2024年9月27日 16: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時間!!
「業界」「職種」「仕事」「社風」を理解していただく構成になります。
座談会では若手社員が登壇し
・業務内容
・当時業界研究していた時のこと
・社風、職場の雰囲気
などを、詳しく聞くことができます!
参加後は別日程にてカジュアル面談へご参加いただき、
もっと詳しく事業内容や職種について個人で話すこともできます!
※対象は文理不問です。