ci-dockerfiles-sanity-check: Add verbatim from upstream repo

Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
Change-Id: Ic4e32d081e2f9ac30bad50ba0e2edf84ecca2aa7
diff --git a/ci-dockerfiles-deployment/builders.sh b/ci-dockerfiles-deployment/builders.sh
new file mode 100644
index 0000000..a5b112c
--- /dev/null
+++ b/ci-dockerfiles-deployment/builders.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+set -ex
+
+echo ""
+echo "########################################################################"
+echo "    Gerrit Environment"
+env |grep '^GERRIT'
+echo "########################################################################"
+
+rm -f ${WORKSPACE}/log
+cd dockerfiles/
+
+git_previous_commit=$(git rev-parse HEAD~1)
+git_commit=$(git rev-parse HEAD)
+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 [ -f gerrit-branches ]; then
+    # Build only from branches mentioned in gerrit-branches
+    if grep -q "^${GERRIT_BRANCH}\$" gerrit-branches; then
+      skip="no"
+    fi
+  elif [ x"${GERRIT_BRANCH}" = x"master" ]; then
+    # No gerrit-branch file, so build only from "master" branch.
+    skip="no"
+  fi
+  case "${skip}:${host_arch}:${image_arch}" in
+    "skip:"*)
+      echo "Skipping: don't need to build ${image} on branch ${GERRIT_BRANCH}"
+      ;;
+    "no:amd64:amd64"|"no:amd64:i386"|"no:arm64:arm64"|"no:armhf:armhf")
+      echo "=== Start build: ${image} ==="
+      bash -x ./build.sh || echo "=== FAIL: ${image} ===" >> ${WORKSPACE}/log
+      ;;
+    *)
+      echo "Skipping: can't build for ${image_arch} on ${host_arch}"
+      ;;
+  esac
+  )||echo $image failed >> ${WORKSPACE}/log
+done
+
diff --git a/ci-dockerfiles-deployment/cleanup-update.sh b/ci-dockerfiles-deployment/cleanup-update.sh
new file mode 100644
index 0000000..a0a3abe
--- /dev/null
+++ b/ci-dockerfiles-deployment/cleanup-update.sh
@@ -0,0 +1,14 @@
+#!/bin/bash -e
+
+for image in $(docker images|grep trustedfirmware|grep -v none|awk '{ print $1":"$2}');
+do
+    echo update: $image:
+    if ! docker pull $image
+    then
+        echo could not fetch image from dockerhub, delete
+        docker rmi $image||true
+    fi
+done
+
+echo cleaning up
+docker system prune -f
diff --git a/ci-dockerfiles-deployment/report.sh b/ci-dockerfiles-deployment/report.sh
new file mode 100644
index 0000000..fe0ac53
--- /dev/null
+++ b/ci-dockerfiles-deployment/report.sh
@@ -0,0 +1,32 @@
+#!/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"${GERRIT_BRANCH}" != x"master" ]; then
+      new_tag=${docker_tag}-${GERRIT_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
diff --git a/ci-dockerfiles-deployment/update-images.sh b/ci-dockerfiles-deployment/update-images.sh
new file mode 100755
index 0000000..d4b9058
--- /dev/null
+++ b/ci-dockerfiles-deployment/update-images.sh
@@ -0,0 +1,42 @@
+#!/bin/bash -e
+
+cd dockerfiles/
+
+images_to_update=""
+
+# find out which images haven't had any commits in the last 30 days
+
+for dir in ./*/; do
+    shortdir=$(basename $dir)
+    # Skip toolchain images
+    echo $shortdir|grep -q tcwg && continue
+    # not an image dir
+    [ -x $shortdir/build.sh ]||continue
+    changed=$(git log -1 --oneline --since "1 month" ${shortdir}|wc -l)
+    if [ $changed -eq 1 ]; then
+        echo "new: $shortdir"
+    else
+        echo "nothing new: $shortdir"
+        images_to_update="$images_to_update $shortdir"
+    fi
+done
+
+echo $images_to_update
+
+# trigger builds for every non-updated image over the http api
+for image in $images_to_update
+do
+    arch=$(echo ${image} | cut -f2 -d '-')
+    if [ "$arch" = "aarch64" ]; then
+        arch=arm64
+    fi
+    if [ "$arch" = "amd64" -o "$arch" = "arm64" -o "$arch" = "armhf" ]; then
+        cat > ../docker_${image}_build.txt << EOF
+nodelabel=build-${arch}
+image=${image}
+EOF
+    else
+        echo "unknown arch: $arch in $image"
+    fi
+done
+
diff --git a/ci-dockerfiles-sanity-check.yaml b/ci-dockerfiles-sanity-check.yaml
new file mode 100644
index 0000000..e51bd53
--- /dev/null
+++ b/ci-dockerfiles-sanity-check.yaml
@@ -0,0 +1,71 @@
+- job:
+    name: ci-dockerfiles-sanity-check
+    project-type: matrix
+    defaults: global
+    properties:
+        - authorization:
+            anonymous:
+                - job-discover
+            authenticated:
+                - job-read
+                - job-extended-read
+                - job-discover
+        - build-discarder:
+            days-to-keep: 90
+            num-to-keep: 200
+        - build-blocker:
+            use-build-blocker: true
+            blocking-jobs:
+              - "ci-docker*"
+            block-level: 'NODE'
+    disabled: false
+    node: build-amd64
+    concurrent: false
+    display-name: 'CI Dockerfiles sanity check'
+    scm:
+        - git:
+            url: https://review.trustedfirmware.org/${GERRIT_PROJECT}
+            refspec: ${GERRIT_REFSPEC}
+            branches:
+                - ${GERRIT_BRANCH}
+            skip-tag: true
+            clean:
+                before: true
+            choosing-strategy: gerrit
+            basedir: dockerfiles
+    triggers:
+        - gerrit:
+            server-name: 'review.trustedfirmware.org'
+            trigger-on:
+                - patchset-created-event
+            projects:
+                - project-compare-type: 'PLAIN'
+                  project-pattern: 'ci/dockerfiles'
+                  branches:
+                    - branch-compare-type: 'PLAIN'
+                      branch-pattern: 'master'
+            silent-start: true
+    axes:
+        - axis:
+            type: slave
+            name: label
+            values:
+                - build-amd64
+    execution-strategy:
+        sequential: false
+    wrappers:
+        - timestamps
+    builders:
+        - shell: |
+            #!/bin/bash -e
+            echo "#${BUILD_NUMBER}-${GERRIT_PATCHSET_REVISION:0:8}" > ${WORKSPACE}/version.txt
+        - build-name-setter:
+            name: 'version.txt'
+            file: true
+        - shell:
+            !include-raw: ci-dockerfiles-deployment/builders.sh
+        - shell:
+            !include-raw: ci-dockerfiles-deployment/report.sh
+    publishers:
+        - email:
+            recipients: linaro-infrastructure-errors@lists.linaro.org