<?xml version="1.0" encoding="UTF-8"?><matrix-project>
  <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl">
    <runSequentially>false</runSequentially>
  </executionStrategy>
  <combinationFilter/>
  <axes>
    <hudson.matrix.LabelAxis>
      <name>label</name>
      <values>
        <string>build-amd64</string>
        <string>build-arm64</string>
      </values>
    </hudson.matrix.LabelAxis>
  </axes>
  <actions/>
  <description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
  <keepDependencies>false</keepDependencies>
  <disabled>false</disabled>
  <displayName>CI Dockerfiles sanity check</displayName>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <concurrentBuild>false</concurrentBuild>
  <assignedNode>triggers</assignedNode>
  <canRoam>false</canRoam>
  <properties>
    <hudson.security.AuthorizationMatrixProperty>
      <permission>hudson.model.Item.Discover:anonymous</permission>
      <permission>hudson.model.Item.Read:everyone-flat</permission>
      <permission>hudson.model.Item.ExtendedRead:everyone-flat</permission>
    </hudson.security.AuthorizationMatrixProperty>
    <jenkins.model.BuildDiscarderProperty>
      <strategy class="hudson.tasks.LogRotator">
        <daysToKeep>90</daysToKeep>
        <numToKeep>200</numToKeep>
        <artifactDaysToKeep>-1</artifactDaysToKeep>
        <artifactNumToKeep>-1</artifactNumToKeep>
      </strategy>
    </jenkins.model.BuildDiscarderProperty>
    <hudson.plugins.buildblocker.BuildBlockerProperty>
      <useBuildBlocker>true</useBuildBlocker>
      <blockingJobs>ci-docker.*</blockingJobs>
      <blockLevel>NODE</blockLevel>
      <scanQueueFor>DISABLED</scanQueueFor>
    </hudson.plugins.buildblocker.BuildBlockerProperty>
  </properties>
  <scm class="hudson.plugins.git.GitSCM">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <name>origin</name>
        <refspec>${GERRIT_REFSPEC}</refspec>
        <url>https://review.linaro.org/${GERRIT_PROJECT}</url>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>${GERRIT_BRANCH}</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <disableSubmodules>false</disableSubmodules>
    <recursiveSubmodules>false</recursiveSubmodules>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <remotePoll>false</remotePoll>
    <gitTool>Default</gitTool>
    <submoduleCfg class="list"/>
    <reference/>
    <gitConfigName/>
    <gitConfigEmail/>
    <extensions>
      <hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
        <relativeTargetDir>dockerfiles</relativeTargetDir>
      </hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
      <hudson.plugins.git.extensions.impl.BuildChooserSetting>
        <buildChooser class="com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerBuildChooser"/>
      </hudson.plugins.git.extensions.impl.BuildChooserSetting>
      <hudson.plugins.git.extensions.impl.CleanBeforeCheckout/>
      <hudson.plugins.git.extensions.impl.WipeWorkspace/>
    </extensions>
  </scm>
  <triggers class="vector">
    <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger>
      <spec/>
      <gerritProjects>
        <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject>
          <compareType>PLAIN</compareType>
          <pattern>ci/dockerfiles</pattern>
          <branches>
            <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
              <compareType>PLAIN</compareType>
              <pattern>master</pattern>
            </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
            <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
              <compareType>ANT</compareType>
              <pattern>tcwg**</pattern>
            </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
          </branches>
          <disableStrictForbiddenFileVerification>false</disableStrictForbiddenFileVerification>
        </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject>
      </gerritProjects>
      <skipVote>
        <onSuccessful>false</onSuccessful>
        <onFailed>false</onFailed>
        <onUnstable>false</onUnstable>
        <onNotBuilt>false</onNotBuilt>
      </skipVote>
      <silentMode>false</silentMode>
      <silentStartMode>true</silentStartMode>
      <escapeQuotes>true</escapeQuotes>
      <noNameAndEmailParameters>false</noNameAndEmailParameters>
      <readableMessage>false</readableMessage>
      <dependencyJobsNames/>
      <notificationLevel/>
      <dynamicTriggerConfiguration>False</dynamicTriggerConfiguration>
      <triggerConfigURL/>
      <triggerInformationAction/>
      <allowTriggeringUnreviewedPatches>false</allowTriggeringUnreviewedPatches>
      <triggerOnEvents>
        <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginPatchsetCreatedEvent/>
      </triggerOnEvents>
      <buildStartMessage/>
      <buildFailureMessage/>
      <buildSuccessfulMessage/>
      <buildUnstableMessage/>
      <buildNotBuiltMessage/>
      <buildUnsuccessfulFilepath/>
      <customUrl/>
      <serverName>review.linaro.org</serverName>
    </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger>
  </triggers>
  <builders>
    <hudson.tasks.Shell>
      <command>#!/bin/bash -e
echo "#${BUILD_NUMBER}-${GERRIT_PATCHSET_REVISION:0:8}" &gt; ${WORKSPACE}/version.txt
</command>
    </hudson.tasks.Shell>
    <hudson.tasks.Shell>
      <command>#!/bin/bash -e
curl -L -o ${WORKSPACE}/config.json ${JENKINS_URL}/userContent/config.json --fail
</command>
    </hudson.tasks.Shell>
    <org.jenkinsci.plugins.buildnameupdater.BuildNameUpdater>
      <buildName>version.txt</buildName>
      <macroTemplate>#${BUILD_NUMBER}</macroTemplate>
      <fromFile>true</fromFile>
      <fromMacro>false</fromMacro>
      <macroFirst>false</macroFirst>
    </org.jenkinsci.plugins.buildnameupdater.BuildNameUpdater>
    <hudson.tasks.Shell>
      <command>#!/bin/bash

set -ex

rm -f ${WORKSPACE}/log
cd dockerfiles/

git_commit=$(git rev-parse ${PATCHSET_REVISION})
git_previous_commit=$(git rev-parse ${PATCHSET_REVISION}~${nb_rev})

echo ""
echo "########################################################################"
echo "GIT_COMMIT=${git_commit}"
echo "GIT_PREVIOUS_COMMIT=${git_previous_commit}"
echo "BRANCH=${BRANCH}"
echo "########################################################################"

files=$(git diff --name-only ${git_previous_commit} ${git_commit})
echo Changes in: ${files}
changed_dirs=$(dirname ${files}|sort -u)

update_images=""
for dir in ${changed_dirs}; do
  # Find the closest directory with build.sh.  This is, primarily,
  # to handle changes to tcwg-base/tcwg-build/tcwg-builslave/* directories.
  while [ ! -e ${dir}/build.sh -a ! -e ${dir}/.git ]; do
    dir=$(dirname ${dir})
  done
  # Add this and all dependant images in the update.
  dir_basename=$(basename ${dir})
  case "${dir_basename}" in
    "tcwg-"*)
      # ${dir} is one of generic tcwg-base/* directories.  Add dependent
      # images to the list.
      update_images="${update_images} $(dirname $(find . -path "*-${dir_basename}*/build.sh" | sed -e "s#^\./##g"))"
      ;;
  ".")
      continue
      ;;
    *)
      update_images="${update_images} $(dirname $(find ${dir} -name build.sh))"
      ;;
  esac
done
update_images="$(echo "${update_images}" | tr " " "\n" | sort -u)"

host_arch=$(dpkg-architecture -qDEB_HOST_ARCH)

for image in ${update_images}; do
  (
  cd ${image}
  image_arch=$(basename ${PWD} | cut -f2 -d '-')
  skip="skip"
  if [ x"${BRANCH}" = x"main" ]; then
    # Build only from "main" branch.
    skip="no"
  fi
  case "${skip}:${host_arch}:${image_arch}" in
    "skip:"*)
      echo "Skipping: don't need to build ${image} on branch ${BRANCH}"
      ;;
    "no:amd64:amd64"|"no:amd64:i386"|"no:arm64:arm64"|"no:armhf:armhf"|"no:arm64:armhf")
      echo "=== Start build: ${image} ==="
      ./build.sh || echo "=== FAIL: ${image} ===" &gt;&gt; ${WORKSPACE}/log
      ;;
    *)
      echo "Skipping: can't build for ${image_arch} on ${host_arch}"
      ;;
  esac
  )||echo $image failed &gt;&gt; ${WORKSPACE}/log
done

</command>
    </hudson.tasks.Shell>
    <hudson.tasks.Shell>
      <command>#!/bin/bash

set -ex

trap cleanup_exit INT TERM EXIT

cleanup_exit()
{
    rm -rf ${HOME}/.docker
    rm -f ${WORKSPACE}/{log,config.json,version.txt}
}

update_images=$(find -type f -name .docker-tag)

for imagename in ${update_images}; do
  (
    docker_tag=$(cat $imagename)
    if [ x"${BRANCH}" != x"main" ]; then
      new_tag=${docker_tag}-${BRANCH}
      docker tag ${docker_tag} ${new_tag}
      docker_tag=${new_tag}
    fi
    echo successful build ${docker_tag}
  )
done

if [ -e ${WORKSPACE}/log ]
then
    echo "some images failed:"
    cat ${WORKSPACE}/log
    exit 1
fi
</command>
    </hudson.tasks.Shell>
  </builders>
  <publishers>
    <hudson.tasks.Mailer plugin="mailer">
      <recipients>linaro-infrastructure-errors@lists.linaro.org</recipients>
      <dontNotifyEveryUnstableBuild>false</dontNotifyEveryUnstableBuild>
      <sendToIndividuals>false</sendToIndividuals>
    </hudson.tasks.Mailer>
  </publishers>
  <buildWrappers>
    <hudson.plugins.timestamper.TimestamperBuildWrapper/>
  </buildWrappers>
</matrix-project>