CI環境でビルドを行っていると、バイナリファイル、exe、dll等 成果物 を配布用のディレクトリに同期させてコミットしたい事がよくあります。
今回はWindows環境における Subversion、Gitでのサンプルを書いてみます。
手順
同期したいディレクトリにミラーリング処理を実行する
Windowsでミラーリングを行うには、robocopy
コマンドがあります。
オプションで、ミラーリングだけでなくリトライ回数を指定したり、除外ディレクトリ指定等が出来ます。
robocopy %SRC_PATH% %DEST_PATH% /MIR /XD .git /NP R:1
コマンドの説明は割愛します。
ステータスを確認し、追加削除処理を行う
Subversion、Gitどちらもstatus
オプションが存在します。
svn status
? unmanaged.txt
! lost.txt
A add-file.txt
git status -s
A add-file.txt
D deleted.txt
?? unmanaged.txt
これらの情報を用いて、追加、削除処理を行います。
bat処理で一行ずつ処理する
batのfor文では、/f
と合わせてusebackq
を指定することで、コマンドの出力結果を使用し1行ずつ処理する事が可能です。
さらにtokens
を指定することで、スペースで分割し、状態とパスを取得する事ができます。
for /F "usebackq tokens=1,2" %%i IN (`svn status`) do (
echo %%i
echo %%j
echo.
)
?
unmanaged.txt
!
lost.txt
A
add-file.txt
コミット(プッシュ)を行う
ここは適宜処理します。割愛します。
サンプル
Subversion - bat
@echo off
rem .svn ディレクトリを除外しなければいけない事に注意
robocopy %SRC_PATH% %DEST_PATH% /MIR /XD .svn /NP R:3
if errorlevel 8 goto error
pushd %DEST_PATH%
for /F "usebackq tokens=1,2" %%i IN (`svn status`) do (
if %%i==? (
rem 管理外ファイルという事は追加されたファイル
svn add %%j
) else if %%i==! (
rem 紛失しているという事は削除されたファイル
svn delete %%j
)
)
svn commit -m "ミラーリング"
popd
exit /b 0
:error
echo error robocopyに失敗
exit /b 1
Git - bat
@echo off
rem .git ディレクトリを除外しなければいけない事に注意
robocopy %SRC_PATH% %DEST% /MIR /XD .git /NP R:3
if errorlevel 8 goto error
pushd %DEST_PATH%
for /F "usebackq tokens=1,2" %%i IN (`git status -s`) do (
if %%i==?? (
rem 管理外ファイルという事は追加されたファイルの可能性
git add %%j
) else if %%i==D (
rem 削除状態をステージングへ
git add %%j
)
)
git commit -m "ミラーリング"
git push origin master
popd
exit /b 0
:error
echo error robocopyに失敗
exit /b 1
参考リンク
svn status
http://www.thekyo.jp/manual/subversion/svn.ref.svn.c.status.html
git status Short Format
https://git-scm.com/docs/git-status#_short_format
.bat(バッチファイル)のforコマンド解説。
https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9