(最新のバージョンではそんなことはないかもしれませんが)
その状態で古い履歴を削除する設定をしていると、
ビルド番号の大きい古いビルドが削除されず、ビルド番号の小さな新しいビルドが削除されてしまいます。
これが意外と気づきにくいんですよね。
というわけで自動化しましょう!
不整合の検出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
@ echo off pushd "%~dp0" if "x%~1" == "x" ( call :target_jenkins_home if errorlevel 1 goto error ) else ( call :target_command_line %* if errorlevel 1 goto error ) SET TARGET_PATH if errorlevel 1 goto error SET ERRORCODE=0 for /D %%d in ( "%TARGET_PATH%\jobs\*" ) do ( @ echo %%~nd if exist "%%d\nextBuildNumber" ( for /f %%i in ( %%d\nextBuildNumber ) do ( call :checkbuildnumber %%d %%i if errorlevel 1 ( SET ERRORCODE=1 ) ) ) ) if "%ERRORCODE%" == "1" goto error goto end :checkbuildnumber SET NEXT=%~2 rem @ echo next build number %NEXT% SET MAXNUM=0 setlocal enabledelayedexpansion for /D %%d in ( "%~1\builds\*" ) do ( call :getbuildlognumber %%d SET CURNUM=!errorlevel! if !CURNUM! gtr !MAXNUM! ( SET MAXNUM=!CURNUM! ) ) rem @ echo !MAXNUM! if %NEXT% lss !MAXNUM! ( @ echo "Warning: next build number [%NEXT%] is smaller than the number of the log [!MAXNUM!]." exit /b 1 ) endlocal exit /b 0 :getbuildlognumber if not exist "%~1\build.xml" exit /b 0 for /f "tokens=1,2,3,4* delims=<>" %%a in ( %~1\build.xml ) do ( if "%%b" == "number" ( exit /b %%c ) ) exit /b 0 :target_command_line if not exist "%~1" ( @ echo %~1 は存在しません。 exit /b 1 ) SET TARGET_PATH=%~1 exit /b 0 :target_jenkins_home SET JENKINS_HOME >NUL if errorlevle 1 ( @ echo JENKINS_HOME が設定されていません。 exit /b 1 ) SET TARGET_PATH=%JENKINS_HOME% exit /b 0 :error popd @ echo failed. pause exit /b 1 :end popd exit /b 0 |
master ノードで実行する必要があります。
第一引数に ${JENKINS_HOME} のパスを指定します。省略した場合、環境変数のパスをそのまま使います。
こんなんでも定期的に実行するようにしたら、効果はきっとあるでしょう。
もう少しスマートに検出する
Groovy post build plugin を使って検出させてみました。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import hudson.model.AbstractProject def jenkins = hudson.model.Hudson.instance def projects = jenkins.getAllItems(AbstractProject. class ) projects. each { project -> def lastBuild = project.getLastBuild() if ( lastBuild != null ) { def lastNumber = lastBuild.getNumber() def nextNumber = project.getNextBuildNumber() if ( nextNumber < lastNumber ) { manager.listener.logger. println (project.getName()) manager.listener.logger. println ( "Warning: next build number [${nextNumber}] is smaller than the number of the log [${lastNumber}]." ) manager.buildUnstable() } } } |
修復
ビルド番号の修正は Jenkins が"停止"しているときにする必要があります(たぶん)。 不整合の検出で使用したバッチファイルを少し変更して、不整合が見つかったら nextBuildNumber を修正します。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
@ echo off pushd "%~dp0" if "x%~1" == "x" ( call :target_jenkins_home if errorlevel 1 goto error ) else ( call :target_command_line %* if errorlevel 1 goto error ) SET TARGET_PATH if errorlevel 1 goto error for /D %%d in ( "%TARGET_PATH%\jobs\*" ) do ( @ echo %%~nd if exist "%%d\nextBuildNumber" ( for /f %%i in ( %%d\nextBuildNumber ) do ( call :repairbuildnumber %%d %%i ) ) ) goto end :repairbuildnumber SET NEXT=%~2 rem @ echo next build number %NEXT% SET MAXNUM=0 setlocal enabledelayedexpansion for /D %%d in ( "%~1\builds\*" ) do ( call :getbuildlognumber %%d SET CURNUM=!errorlevel! if !CURNUM! gtr !MAXNUM! ( SET MAXNUM=!CURNUM! ) ) rem @ echo !MAXNUM! if %NEXT% lss !MAXNUM! ( @ echo "Warning: next build number [%NEXT%] is smaller than the number of the log [!MAXNUM!]." SET /a NEWNUM=!MAXNUM!+1 @ echo new next build number !NEWNUM! @ echo !NEWNUM!| sed 's/\n//g' > "%~1\nextBuildNumber" ) endlocal exit /b 0 :getbuildlognumber if not exist "%~1\build.xml" exit /b 0 for /f "tokens=1,2,3,4* delims=<>" %%a in ( %~1\build.xml ) do ( if "%%b" == "number" ( exit /b %%c ) ) exit /b 0 :target_command_line if not exist "%~1" ( @ echo %~1 は存在しません。 exit /b 1 ) SET TARGET_PATH=%~1 exit /b 0 :target_jenkins_home SET JENKINS_HOME >NUL if errorlevle 1 ( @ echo JENKINS_HOME が設定されていません。 exit /b 1 ) SET TARGET_PATH=%JENKINS_HOME% exit /b 0 :error popd @ echo failed. pause exit /b 1 :end popd pause exit /b 0 |
0 件のコメント:
コメントを投稿