Robocopyの戻り値にはまる

JenkinsでRedmineのバックアップを取り、それを他のWindowsマシンへコピーする処理を作成したところ、少々はまってしまったので覚え書として残しておく。動作環境は下記の通り。

まず、ファイルコピー(ミラーリング)については、以前ならrsyncWindows版を使っていたのだが、Windows 7ではデフォルトでrobocopyコマンドが使えるようになったので、こちらに乗り換えた。

フォルダの同期に利用できるツールとしては、以上のほかにもrobocopy.exeというコマンドライン・ツールがある。これはもともとはWindows OSのリソースキット・ツールの1つとして提供されていたものであるが、Windows VistaWindows Server 2008Windows 7Windows Server 2008 R2ではOS標準コマンドとして用意されている。

robocopy――ファイルのコピーやミラーリング - ITmedia エンタープライズ

ところがこのコマンドをJenkinsのジョブとして呼び出してみると、なぜか失敗として記録されてしまう。ログを確認してみたところ、robocopyの戻り値として"3"が返ってきていた。この"3"とは一体何だ?

リソースキットの中に情報が含まれているようなのだが、有り難いことにその戻り値を抜粋して載せているエントリ記事を見つけた。

リソースキッドをインストールすると、インストールフォルダにrobocopy.docというMS WORDのファイルがあります。その中にReturn Codeに関する表がありました。

Robocopyの戻り値を知りたい - 履歴

この情報によれば、"3"という値は、0x02の"Some Extra files or directories were detected. Examine the output log. Some housekeeping may be needed."と、0x01の"One or more files were copied successfully (that is, new files have arrived)."の両方が行われたという意味のようだ。ログを再確認してみると、確かに削除されたファイル名と、新たに追加されたファイル名の両方が出力されていた。

8以上の戻り値ならエラーと見なして良さそうなので、その判断を行うための処理を追加して下記のようなバッチを作成した。(/MIR はミラーリング、/R:3 はリトライを3回行うという意味)

robocopy %SRC_DIR% %DST_DIR% /MIR /R:3 & if errorlevel 8 goto error

:done
echo done:%errorlevel%
exit /b 0

:error
echo error:%errorlevel%
exit /b 1

errorlevelという「演算子」については、下記の情報を参考にした。

これで再度試したところ、今度はrobocopyから戻り値として"3"が返ってきても、Jenkins側では正常終了と見なせるようになった。取りあえず、これで様子を見ることにする。