CI for [% gerrit_project %] '[% branch %]' branch on [% gerrit_host %] [automatically generated from [% job_template %]] [% enabled ? "false" : "true" %] [% log_days_to_keep %] [% log_num_to_keep %] [% log_days_to_keep %] [% log_num_to_keep %] qt_ci_git_url Git URL for code under test ssh://[% gerrit_host %]/[% gerrit_project %] qt_ci_git_ref Git ref for code under test refs/heads/[% branch %] qt_ci_request_id Qt Project CI system build request ID; leave blank for manual trigger [%- IF trigger_cron %] [% trigger_cron %] [%- END %] ci/[% gerrit_project %] [% branch %] cfg [%- FOREACH cfg IN configurations %] [% cfg %] [%- END %] [%- IF on_demand == 1 %] xterm [%- END %] [%- IF on_demand == 1 %] ^o-win.*$ [%- ELSE %] ^.*\bwindows\b.*$ [%- END %] ^.*\bmaster\b.*$ [%- IF on_demand == 1 %] mkdir c:\work\build cd c:\work\build [%- ELSE %] rd /S /Q %WORKSPACE%\_artifacts rd /S /Q %CI_NODE_ROOT%\build & IF EXIST %CI_NODE_ROOT%\build TIMEOUT /T 5 & rd /S /Q %CI_NODE_ROOT%\build mkdir %CI_NODE_ROOT%\build cd %CI_NODE_ROOT%\build [%- END %] call git init if errorlevel 1 exit /b 1 [%- IF gerrit_host != "codereview.qt-project.org" %] call git fetch --verbose [% gerrit_host %]:[% gerrit_project %] +refs/heads/[% branch %]:refs/remotes/mirror/[% branch %] [%- ELSE %] call git fetch --verbose qt-gerrit-mirror:[% gerrit_project %] +refs/heads/[% branch %]:refs/remotes/mirror/[% branch %] [%- END %] exit /b 0 [%- IF on_demand == 1 %] ^o-win.*$ [%- ELSE %] ^.*\bwindows\b.*$ [%- END %] ^.*\bmaster\b.*$ set +e /opt/version.sh || echo "Unable to execute version.sh" [%- IF on_demand == 1 %] rm -rf /work/ci rm -rf /work/build mkdir -p /work/build cd /work/build [%- ELSE %] rm -rf $WORKSPACE/_artifacts rm -rf $CI_NODE_ROOT/build mkdir -p $CI_NODE_ROOT/build cd $CI_NODE_ROOT/build [%- END %] git init [%- IF gerrit_host != "codereview.qt-project.org" %] git fetch --verbose [% gerrit_host %]:[% gerrit_project %] +refs/heads/[% branch %]:refs/remotes/mirror/[% branch %] [%- ELSE %] git fetch --verbose qt-gerrit-mirror:[% gerrit_project %] +refs/heads/[% branch %]:refs/remotes/mirror/[% branch %] [% END %] [%- IF on_demand == 1 %] ^.*\bmaster\b.*$ PARENT=${JOB_NAME} BRANCH=[% template_ini_prefix %] create_nodes_and_vms ALWAYS false false [%- END %] [%- IF on_demand == 1 %] ^o-win.*$ [%- ELSE %] ^.*\bwindows\b.*$ [%- END %] [%- IF on_demand == 1 %] setlocal enabledelayedexpansion echo %cfg%|findstr /i winrt >nul: if %errorlevel%==0 ( set "TARGET_ARCHITECTURE=x86" ) else ( set "TARGET_ARCHITECTURE=%PROCESSOR_ARCHITECTURE%" ) echo %cfg%|findstr /i wince70embedded >nul: if %errorlevel%==0 ( REM LIB/INCLUDE contains desktop openssl paths as set in jenkins ini, REM reset them before calling vsvars32.bat if we are building for WEC7 set LIB= set INCLUDE= ) echo %cfg%|findstr /i msvc2008 >nul: if %errorlevel%==0 ( call "%VS90COMNTOOLS%\vsvars32.bat" ) echo %cfg%|findstr /i msvc2010 >nul: if %errorlevel%==0 ( call "%VS100COMNTOOLS%\vsvars32.bat" ) echo %cfg%|findstr /i msvc2012 >nul: if %errorlevel%==0 ( call "%MSVC2012_DIR%\vcvarsall.bat" %TARGET_ARCHITECTURE% ) ) cd c:\work\build set GIT_BRANCH=%qt_ci_git_ref% set call git remote add origin -t %qt_ci_git_ref% %qt_ci_git_url% if errorlevel 1 exit /b 1 call git pull origin %qt_ci_git_ref% if errorlevel 1 exit /b 1 call git init _testconfig if errorlevel 1 exit /b 1 cd _testconfig call git fetch qt-gerrit-mirror:qtqa/testconfig +refs/heads/*:refs/remotes/mirror/* call git fetch git://github.com/tsarajar/qtqa-testconfig.git +refs/heads/*:refs/remotes/origin/* if errorlevel 1 exit /b 1 call git reset --hard origin/master if errorlevel 1 exit /b 1 cd .. perl _testconfig/test.pl --project "[% testconfig_project %]" [%- IF publish_build == "log_publisher" %] set PUBLISHER_PARAMS="token=PUBLISHER&BUILD_LOG_URL=%BUILD_URL%&REMOTE_BUILD_NUMBER=%BUILD_NUMBER%&REMOTE_BUILD_NAME=%JOB_NAME% set PUBLISHER_JENKINS="[% remote_jenkins %]" set PUBLISHER_JOB="[% remote_jenkins_job %]" perl _qtqa_latest\scripts\jenkins\jenkins_job_trigger.pl -fireandforget [%- END %] endlocal [%- ELSE %] setlocal enabledelayedexpansion echo %cfg%|findstr /i mingw491 >nul: if %errorlevel%==0 ( set "PATH=%PATH_MINGW491%;%PATH%" set "PATH=!PATH!;%ICUMINGW491%\bin" set "LIBRARY=!LIBRARY!;%ICUMINGW491%\lib" set "INCLUDE=!INCLUDE!;%ICUMINGW491%\include" ) echo %cfg%|findstr /i mingw48 >nul: if %errorlevel%==0 ( set "PATH=%PATH_MINGW48%;!PATH!" set "PATH=!PATH!;%ICUMINGW48%\bin" set "LIBRARY=!LIBRARY!;%ICUMINGW48%\lib" set "INCLUDE=!INCLUDE!;%ICUMINGW48%\include" ) echo %cfg%|findstr /i winrt >nul||echo %cfg%|findstr /i winphone >nul: if %errorlevel%==0 ( set "TARGET_ARCHITECTURE=x86" ) else ( set "TARGET_ARCHITECTURE=%PROCESSOR_ARCHITECTURE%" ) echo %cfg%|findstr /i wince70embedded >nul: if %errorlevel%==0 ( REM LIB/INCLUDE contains desktop openssl/icu paths as set in jenkins ini, REM reset them before calling vsvars32.bat if we are building for WEC7 set LIB= set INCLUDE= ) echo %cfg%|findstr /i msvc2008 >nul: if %errorlevel%==0 ( call "%VS90COMNTOOLS%\vsvars32.bat" ) echo %cfg%|findstr /i msvc2010 >nul: if %errorlevel%==0 ( call "%VS100COMNTOOLS%\vsvars32.bat" ) echo %cfg%|findstr /i msvc2012 >nul: if %errorlevel%==0 ( call "%MSVC2012_DIR%\vcvarsall.bat" %TARGET_ARCHITECTURE% set "PATH=!PATH!;%ICU2012%\bin;%ICU2012%\lib" set "LIB=!LIB!;%ICU2012%\lib" set "INCLUDE=!INCLUDE!;%ICU2012%\include" ) echo %cfg%|findstr /i msvc2013 >nul: if %errorlevel%==0 ( call "%MSVC2013_DIR%\vcvarsall.bat" %TARGET_ARCHITECTURE% set "PATH=!PATH!;%ICU2013%\bin;%ICU2013%\lib" set "LIB=!LIB!;%ICU2013%\lib" set "INCLUDE=!INCLUDE!;%ICU2013%\include" ) cd %CI_NODE_ROOT%\build set GIT_BRANCH=%qt_ci_git_ref% set call git remote add origin -t %qt_ci_git_ref% %qt_ci_git_url% if errorlevel 1 exit /b 1 call git pull origin %qt_ci_git_ref% if errorlevel 1 exit /b 1 call git init _testconfig if errorlevel 1 exit /b 1 cd _testconfig call git fetch qt-gerrit-mirror:qtqa/testconfig +refs/heads/*:refs/remotes/mirror/* call git fetch ssh://codereview.qt-project.org/qtqa/testconfig.git +refs/heads/*:refs/remotes/origin/* if errorlevel 1 exit /b 1 call git reset --hard origin/master if errorlevel 1 exit /b 1 cd .. perl _testconfig/test.pl --project "[% testconfig_project %]" [%- IF publish_build == "log_publisher" %] set PUBLISHER_PARAMS="token=PUBLISHER&BUILD_LOG_URL=%BUILD_URL%&REMOTE_BUILD_NUMBER=%BUILD_NUMBER%&REMOTE_BUILD_NAME=%JOB_NAME% set PUBLISHER_JENKINS="[% remote_jenkins %]" set PUBLISHER_JOB="[% remote_jenkins_job %]" perl _qtqa_latest\scripts\jenkins\jenkins_job_trigger.pl -fireandforget [%- END %] endlocal [%- END %] [%- IF on_demand == 1 %] ^o-win.*$ [%- ELSE %] ^.*\bwindows\b.*$ [%- END %] [%- IF on_demand == 1 %] cd /work/build [%- ELSE %] cd $CI_NODE_ROOT/build [%- END %] GIT_BRANCH=${qt_ci_git_ref} export GIT_BRANCH set git remote add origin -t ${qt_ci_git_ref} ${qt_ci_git_url} git pull origin ${qt_ci_git_ref} git init _testconfig cd _testconfig git fetch qt-gerrit-mirror:qtqa/testconfig +refs/heads/*:refs/remotes/mirror/* || true git fetch ssh://codereview.qt-project.org/qtqa/testconfig +refs/heads/*:refs/remotes/origin/* git reset --hard origin/master cd .. [%- IF publish_build == "log_publisher" %] PUBLISHER_PARAMS="token=PUBLISHER&BUILD_LOG_URL=$BUILD_URL&REMOTE_BUILD_NUMBER=$BUILD_NUMBER&REMOTE_BUILD_NAME=$JOB_NAME" export PUBLISHER_PARAMS export PUBLISHER_JENKINS="[% remote_jenkins %]" export PUBLISHER_JOB="[% remote_jenkins_job %]" trap 'perl _qtqa_latest/scripts/jenkins/jenkins_job_trigger.pl -fireandforget' INT TERM EXIT [%- END %] perl _testconfig/test.pl --project "[% testconfig_project %]" [%- IF publish_xunit == 1 %] **/_artifacts/test-logs/*.xml false true false [%- END %] [%- IF publish_build == 1 %] true true [%- END %] [%- IF send_status_mail == 1 %] $DEFAULT_RECIPIENTS $PROJECT_DEFAULT_SUBJECT $PROJECT_DEFAULT_CONTENT false false $PROJECT_DEFAULT_REPLYTO project default $DEFAULT_SUBJECT $DEFAULT_CONTENT $DEFAULT_PRESEND_SCRIPT false false no-reply@qt-project.org false ONLY_PARENT [%- END %] **/*.xml false true [%- IF publish_build == "postbuild_publisher" %] rm -f ./state_postbuild.py cp $JENKINS_HOME/state_postbuild.py . python ./state_postbuild.py -u $JOB_URL -n $BUILD_NUMBER false false MATRIX [%- END %] [%- IF on_demand == 0 %] import hudson.slaves.OfflineCause.SimpleOfflineCause import hudson.util.RemotingDiagnostics import java.io.PrintWriter import java.io.StringWriter // returns full stack trace of a throwable 't' as a string def getStackTrace(t) { def sw = new StringWriter() def pw = new PrintWriter(sw, true) t.printStackTrace(pw) pw.flush() sw.flush() return sw.toString() } // FIXME: why cannot we import jenkins.util.NonLocalizable ? class OfflineMessage extends org.jvnet.localizer.Localizable { def message OfflineMessage() { super(null, null, []) def timestr = new Date().format("HH:mm dd/MM/yy z", TimeZone.getTimeZone("UTC")) this.message = "automated reboot at end of test at " + timestr } String toString() { this.message } String toString(java.util.Locale l) { toString() } } def computer = manager.build.getBuiltOn().toComputer() def channel = computer.getChannel() def cause = SimpleOfflineCause.create(new OfflineMessage()) def rebooted = 0 for (i in 1..5) { try { RemotingDiagnostics.executeGroovy( """ if (Functions.isWindows()) { 'shutdown /r /t 10 /c "Restarting after Jenkins test completed"'.execute() } else { "sudo -n /sbin/reboot".execute() } """, channel ) rebooted = i break } catch (Exception e) { manager.addWarningBadge("could not reboot [attempt " + i + "]: " + getStackTrace(e)) // disconnecting the computer, waiting for it to reconnect and reinitializing the // channel helps to recover from "Could not initialize class org.codehause.groovy.runtime.InvokerHelper", // which occurs on slaves sometimes (with Jenkins 1.466) for unknown reasons. computer.disconnect(cause).get() sleep(30000) channel = computer.getChannel() def attempts = 0 while (channel == null && ++attempts < 5) { sleep(30000) channel = computer.getChannel() } } } if (rebooted == 0) { manager.addShortText("reboot failed") } else if (rebooted > 1) { manager.addShortText("rebooted after " + rebooted + " attempts") } else { manager.addInfoBadge("rebooted after build") } if (rebooted) { // make sure jobs cannot be scheduled until after the node reboots computer.setTemporarilyOffline(true, cause) computer.disconnect(cause).get() } s = new Socket("localhost", 7182) s << '{"type":"build-updated","job":"[% name %]","build":' << manager.build.number << '}' s.close() 0 [%- END %] [%- IF on_demand == 1 %] import hudson.slaves.OfflineCause.SimpleOfflineCause import hudson.util.RemotingDiagnostics import java.io.PrintWriter import java.io.StringWriter // returns full stack trace of a throwable 't' as a string def getStackTrace(t) { def sw = new StringWriter() def pw = new PrintWriter(sw, true) t.printStackTrace(pw) pw.flush() sw.flush() return sw.toString() } // FIXME: why cannot we import jenkins.util.NonLocalizable ? class OfflineMessage extends org.jvnet.localizer.Localizable { def message OfflineMessage() { super(null, null, []) def timestr = new Date().format("HH:mm dd/MM/yy z", TimeZone.getTimeZone("UTC")) this.message = "Node brought offline after build at " + timestr } String toString() { this.message } String toString(java.util.Locale l) { toString() } } def computer = manager.build.getBuiltOn().toComputer() def channel = computer.getChannel() def cause = SimpleOfflineCause.create(new OfflineMessage()) // make sure jobs cannot be scheduled until after the node reboots computer.setTemporarilyOffline(true, cause) 0 perl /var/lib/jenkins/vm-cloner/vm-cloner-delete-nodes-and-vms.pl -ini /var/lib/jenkins/vm-cloner/[% template_ini_prefix %]_templates.ini -job $JOB_NAME -build_number $BUILD_NUMBER set false false MATRIX [%- END %] 5 false false true false false true