<?xml version="1.1" encoding="UTF-8" standalone="no"?><project>
  <actions/>
  <description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
  <displayName>TCWG CCC Update jenkins containers</displayName>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.plugins.buildblocker.BuildBlockerProperty plugin="build-blocker-plugin@1.7.9">
      <useBuildBlocker>false</useBuildBlocker>
      <blockLevel>GLOBAL</blockLevel>
      <scanQueueFor>DISABLED</scanQueueFor>
      <blockingJobs/>
    </hudson.plugins.buildblocker.BuildBlockerProperty>
    <jenkins.model.BuildDiscarderProperty>
      <strategy class="hudson.tasks.LogRotator">
        <daysToKeep>30</daysToKeep>
        <numToKeep>100</numToKeep>
        <artifactDaysToKeep>-1</artifactDaysToKeep>
        <artifactNumToKeep>-1</artifactNumToKeep>
      </strategy>
    </jenkins.model.BuildDiscarderProperty>
    <org.bstick12.jenkinsci.plugins.leastload.LeastLoadDisabledProperty plugin="leastload@3.0.0">
      <leastLoadDisabled>false</leastLoadDisabled>
    </org.bstick12.jenkinsci.plugins.leastload.LeastLoadDisabledProperty>
    <com.chikli.hudson.plugin.naginator.NaginatorOptOutProperty plugin="naginator@1.436.vb_e769dcb_cdf6">
      <optOut>false</optOut>
    </com.chikli.hudson.plugin.naginator.NaginatorOptOutProperty>
    <com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@330.v645b_7df10e2a_">
      <autoRebuild>false</autoRebuild>
      <rebuildDisabled>false</rebuildDisabled>
    </com.sonyericsson.rebuild.RebuildSettings>
    <hudson.model.ParametersDefinitionProperty>
      <parameterDefinitions>
        <org.jvnet.jenkins.plugins.nodelabelparameter.LabelParameterDefinition plugin="nodelabelparameter@1.12.0">
          <name>nodes</name>
          <description>Machines to run on</description>
          <defaultValue>tcwg &amp;&amp; !tcwg-bmk-hw</defaultValue>
          <allNodesMatchingLabel>true</allNodesMatchingLabel>
          <triggerIfResult>allCases</triggerIfResult>
          <nodeEligibility class="org.jvnet.jenkins.plugins.nodelabelparameter.node.AllNodeEligibility"/>
        </org.jvnet.jenkins.plugins.nodelabelparameter.LabelParameterDefinition>
        <hudson.model.StringParameterDefinition>
          <name>distro</name>
          <description>Distro version to use.</description>
          <defaultValue>default</defaultValue>
          <trim>false</trim>
        </hudson.model.StringParameterDefinition>
        <hudson.model.BooleanParameterDefinition>
          <name>force</name>
          <description>Whether to force update even with no changes in image</description>
          <defaultValue>false</defaultValue>
        </hudson.model.BooleanParameterDefinition>
        <hudson.model.BooleanParameterDefinition>
          <name>verbose</name>
          <description>Whether to be verbose</description>
          <defaultValue>true</defaultValue>
        </hudson.model.BooleanParameterDefinition>
        <hudson.model.StringParameterDefinition>
          <name>scripts_branch</name>
          <description>Scripts revision to use</description>
          <defaultValue>master</defaultValue>
          <trim>false</trim>
        </hudson.model.StringParameterDefinition>
      </parameterDefinitions>
    </hudson.model.ParametersDefinitionProperty>
    <hudson.plugins.heavy__job.HeavyJobProperty plugin="heavy-job@1.1">
      <weight>1</weight>
    </hudson.plugins.heavy__job.HeavyJobProperty>
    <hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="throttle-concurrents@2.14">
      <maxConcurrentPerNode>1</maxConcurrentPerNode>
      <maxConcurrentTotal>0</maxConcurrentTotal>
      <categories class="java.util.concurrent.CopyOnWriteArrayList"/>
      <throttleEnabled>true</throttleEnabled>
      <throttleOption>project</throttleOption>
      <limitOneJobWithMatchingParams>false</limitOneJobWithMatchingParams>
      <paramsToUseForLimit/>
    </hudson.plugins.throttleconcurrents.ThrottleJobProperty>
    
  </properties>
  <scm class="hudson.plugins.git.GitSCM" plugin="git@5.2.1">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <name>origin</name>
        <refspec>+refs/heads/*:refs/remotes/origin/* +refs/changes/*:refs/changes/*</refspec>
        <url>https://gitlab.com/LinaroLtd/tcwg/jenkins-scripts.git</url>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>$scripts_branch</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <submoduleCfg class="empty-list"/>
    <extensions>
      <hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
        <relativeTargetDir>jenkins-scripts</relativeTargetDir>
      </hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
      <hudson.plugins.git.extensions.impl.CleanBeforeCheckout>
        <deleteUntrackedNestedRepositories>false</deleteUntrackedNestedRepositories>
      </hudson.plugins.git.extensions.impl.CleanBeforeCheckout>
      <hudson.plugins.git.extensions.impl.CloneOption>
        <shallow>false</shallow>
        <noTags>false</noTags>
        <reference>/home/tcwg-buildslave/snapshots-ref/jenkins-scripts.git</reference>
        <depth>1</depth>
        <honorRefspec>false</honorRefspec>
      </hudson.plugins.git.extensions.impl.CloneOption>
      <hudson.plugins.git.extensions.impl.PruneStaleBranch/>
    </extensions>
  </scm>
  <assignedNode>tcwg-coordinator</assignedNode>
  <canRoam>false</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers>
    <hudson.triggers.TimerTrigger>
      <spec>@daily</spec>
    </hudson.triggers.TimerTrigger>
  </triggers>
  <concurrentBuild>true</concurrentBuild>
  <customWorkspace>workspace/tcwg-update-jenkins-containers_$EXECUTOR_NUMBER/$NODE_NAME</customWorkspace>
  <builders>
    <hudson.tasks.Shell>
      <command>#!/bin/bash
set -ex

# Check if we need to update the image -- run with --dryrun true.
./jenkins-scripts/tcwg-update-host-containers.sh \
--distro "$distro" \
--jenkins_server "$JENKINS_URL" \
--dryrun true \
--node "$NODE_NAME" \
--force "$force" \
--verbose "$verbose" &amp;
res=0 &amp;&amp; wait $! || res=$?

if [ $res = 0 ]; then
  # Fast-path exit to avoid bringing the node offline.
  echo "$NODE_NAME is up-to-date"
  # Skip the rest and mark the build UNSTABLE (aka skipped).
  exit 125
elif [ $res = 125 ]; then
  echo "$NODE_NAME needs container update"
elif [ $res != 0 ]; then
  echo "ERROR: container check failed"
  exit $res
fi

# We are about to update the container that is running this.
# The plan is:
# 1. Prevent new builds from starting by putting the node into
#    offline mode.
# 2. Wait for current builds to finish.  We detect this by
#    checking for children process of the jenkins client.
# 3. Trigger a job on the master node to bring this node back
#    online.  Without this we would restart the jenkins container,
#    but the node would still be marked as "offline" and no new
#    builds will be scheduled to it.
# 4. Restart the container.

# Mark the node offline.
ssh -p$JENKINS_SSH_PORT -l $JENKINS_SSH_USER $JENKINS_SSH_SERVER \
  offline-node "$NODE_NAME" \
  -m "Updating_jenkins_container:$BUILD_URL"

start_date=$(date +%s)
rm -f timeout

# Wait for current builds to finish.
while true; do
  n_busy=$(source jenkins-scripts/jenkins-helpers.sh
           print_number_of_busy_executors "$NODE_NAME")

  if [ "$n_busy" = "1" ]; then
    # We are the only build left.
    break
  fi

  elapsed=$(($(date +%s) - $start_date))
  elapsed=$(($elapsed / 60))
  if [ "$elapsed" -gt "270" ]; then
    # We'll timeout in 30 minutes; give up on the update and
    # bring the node back online.
    # We budget 30 minutes for tcwg-cleanup-stale-workspaces.sh
    # below.
    touch timeout
    break
  fi

  # Wait for other builds to complete.
  sleep 60
done
</command>
      <configuredLocalRules/>
      <unstableReturn>125</unstableReturn>
    </hudson.tasks.Shell>
    <org.jenkinsci.plugins.conditionalbuildstep.ConditionalBuilder plugin="conditional-buildstep@1.4.3">
      <runner class="org.jenkins_ci.plugins.run_condition.BuildStepRunner$Fail" plugin="run-condition@1.7"/>
      <runCondition class="org.jenkins_ci.plugins.run_condition.core.StatusCondition" plugin="run-condition@1.7">
        <worstResult>
          <name>SUCCESS</name>
          <ordinal>0</ordinal>
          <color>BLUE</color>
          <completeBuild>true</completeBuild>
        </worstResult>
        <bestResult>
          <name>SUCCESS</name>
          <ordinal>0</ordinal>
          <color>BLUE</color>
          <completeBuild>true</completeBuild>
        </bestResult>
      </runCondition>
      <conditionalbuilders>
        <hudson.plugins.parameterizedtrigger.TriggerBuilder plugin="parameterized-trigger@787.v665fcf2a_830b_">
          <configs>
            <hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
              <configs>
                <hudson.plugins.parameterizedtrigger.PredefinedBuildParameters>
                  <properties>node=$NODE_NAME
build_num=$BUILD_NUMBER
</properties>
                  <textParamValueOnNewLine>false</textParamValueOnNewLine>
                </hudson.plugins.parameterizedtrigger.PredefinedBuildParameters>
              </configs>
              <projects>tcwg-update-jenkins-containers-online-node</projects>
              <condition>ALWAYS</condition>
              <triggerWithNoParameters>false</triggerWithNoParameters>
              <triggerFromChildProjects>false</triggerFromChildProjects>
              <buildAllNodesWithLabel>false</buildAllNodesWithLabel>
            </hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
          </configs>
        </hudson.plugins.parameterizedtrigger.TriggerBuilder>
        <hudson.tasks.Shell>
          <command>#!/bin/bash
set -ex

if [ -f timeout ]; then
  exit 125
fi

# Cleanup workspace directory while the node is idle.
(
set +e
$WORKSPACE/jenkins-scripts/tcwg-cleanup-stale-workspaces.sh \
  --days 3 --workspace_top $HOME/workspace
)

./jenkins-scripts/tcwg-update-host-containers.sh \
  --distro "$distro" \
  --dryrun false \
  --node "$NODE_NAME" \
  --force "$force" \
  --verbose "$verbose" || exit 125
</command>
          <configuredLocalRules/>
          <unstableReturn>125</unstableReturn>
        </hudson.tasks.Shell>
      </conditionalbuilders>
    </org.jenkinsci.plugins.conditionalbuildstep.ConditionalBuilder>
  </builders>
  <publishers/>
  <buildWrappers>
    <hudson.plugins.timestamper.TimestamperBuildWrapper plugin="timestamper@1.26"/>
    <com.cloudbees.jenkins.plugins.sshagent.SSHAgentBuildWrapper plugin="ssh-agent@346.vda_a_c4f2c8e50">
      <credentialIds>
        <string>e0958a95-204f-4c14-a66c-5e2be6c5d50a</string>
      </credentialIds>
      <ignoreMissing>false</ignoreMissing>
    </com.cloudbees.jenkins.plugins.sshagent.SSHAgentBuildWrapper>
    <org.jenkinsci.plugins.buildnamesetter.BuildNameSetter plugin="build-name-setter@2.4.1">
      <template>#${BUILD_NUMBER}-${NODE_NAME}</template>
      <descriptionTemplate/>
      <runAtStart>true</runAtStart>
      <runAtEnd>true</runAtEnd>
    </org.jenkinsci.plugins.buildnamesetter.BuildNameSetter>
    <hudson.plugins.build__timeout.BuildTimeoutWrapper plugin="build-timeout@1.32">
      <strategy class="hudson.plugins.build_timeout.impl.AbsoluteTimeOutStrategy">
        <timeoutMinutes>300</timeoutMinutes>
      </strategy>
      <operationList>
        <hudson.plugins.build__timeout.operations.AbortOperation/>
      </operationList>
    </hudson.plugins.build__timeout.BuildTimeoutWrapper>
  </buildWrappers>
</project>