Most of times, the base and LLVM images do not require to be rebuilt,
as the dependencies remains the same.

To avoid rebuilding these images everytime, store in the image the
Dockerfile's sha256sum: if the Dockerfile changes (because new
dependencies were added or changed), then rebuild the image and push it.

Signed-off-by: Juan A. Suarez Romero <jasua...@igalia.com>
---
 .gitlab-ci.yml                    |  9 ++++++---
 gitlab-ci/Rockerfile.base         |  4 +++-
 gitlab-ci/Rockerfile.llvm         |  4 +++-
 gitlab-ci/inspect-remote-image.sh | 21 +++++++++++++++++++++
 4 files changed, 33 insertions(+), 5 deletions(-)
 create mode 100755 gitlab-ci/inspect-remote-image.sh

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5cee333dd45..31f69ceb29e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -23,7 +23,7 @@ before_script:
   - rm -fr ../ccache
   - mv ccache ../
   - export MAKEFLAGS=-j$(nproc)
-  - apk --no-cache add libc6-compat
+  - apk --no-cache add libc6-compat curl jq
   - wget 
https://github.com/grammarly/rocker/releases/download/1.3.1/rocker-1.3.1-linux_amd64.tar.gz
   - tar xvf rocker-1.3.1-linux_amd64.tar.gz
   - rm rocker-1.3.1-linux_amd64.tar.gz
@@ -37,8 +37,11 @@ after_script:
   stage: llvm
   cache: {}
   script:
-    - ../rocker build -f gitlab-ci/Rockerfile.llvm --var LLVM=$LLVM
-    - docker push $CI_REGISTRY_IMAGE:llvm-$LLVM
+    - DOCKERFILE_SHA256=$(cat gitlab-ci/Rockerfile.base 
gitlab-ci/Rockerfile.llvm | sha256sum | cut -c-64)
+    - IMAGE_DOCKERFILE_SHA256=$(./gitlab-ci/inspect-remote-image.sh 
gitlab-ci-token $CI_BUILD_TOKEN $CI_PROJECT_PATH "llvm-$LLVM" 
".config.Labels[\"dockerfile.sha256\"]" || echo -n "<notfound>")
+    - if [ "$DOCKERFILE_SHA256" != "$IMAGE_DOCKERFILE_SHA256" ] ; then 
FORCE_BUILD=true ; fi
+    - if [ "$FORCE_BUILD" ] ; then ../rocker build -f 
gitlab-ci/Rockerfile.llvm --var DOCKERFILE_SHA256=$DOCKERFILE_SHA256 --var 
LLVM=$LLVM ; fi
+    - if [ "$FORCE_BUILD" ] ; then docker push $CI_REGISTRY_IMAGE:llvm-$LLVM ; 
fi
 
 .build_mesa: &build_mesa
   stage: mesa
diff --git a/gitlab-ci/Rockerfile.base b/gitlab-ci/Rockerfile.base
index a0cb5e5290d..2056aceacdf 100644
--- a/gitlab-ci/Rockerfile.base
+++ b/gitlab-ci/Rockerfile.base
@@ -2,7 +2,8 @@
 # Base image for building Mesa.
 #
 # ~~~
-#  rocker build -f Rockerfile.base [--attach] [--pull]
+#  rocker build -f Rockerfile.base [--attach] [--pull]   \
+#    --var DOCKERFILE_SHA256=`sha256sum Rockerfile.base | cut -c-64)`
 # ~~~
 #
 # Environment variables that are used in the build:
@@ -16,6 +17,7 @@
 FROM ubuntu:xenial
 
 LABEL maintainer "Juan A. Suarez Romero <jasua...@igalia.com>"
+LABEL dockerfile.sha256 {{ .DOCKERFILE_SHA256 }}
 
 ENV LC_ALL=C.UTF-8
 
diff --git a/gitlab-ci/Rockerfile.llvm b/gitlab-ci/Rockerfile.llvm
index ed75f4f0f02..cb2906d9a40 100644
--- a/gitlab-ci/Rockerfile.llvm
+++ b/gitlab-ci/Rockerfile.llvm
@@ -2,7 +2,8 @@
 # This builds the base image for building Mesa.
 #
 # ~~~
-#  rocker build -f Rockerfile.llvm [--pull]     \
+#  rocker build -f Rockerfile.llvm [--pull]                             \
+#    --var DOCKERFILE_SHA256=`sha256sum Rockerfile.base | cut -c-64)`   \
 #    --var LLVM=3.3             # 3.3, 3.6, 3.8, 3.9, 4.0, 5.0, 6.0
 # ~~~
 #
@@ -30,6 +31,7 @@
 FROM {{ $image }}:base
 
 LABEL maintainer "Juan A. Suarez Romero <jasua...@igalia.com>"
+LABEL dockerfile.sha256 {{ .DOCKERFILE_SHA256 }}
 
 {{ if ge .LLVM "3.9" }}
 RUN apt-get update                                                            \
diff --git a/gitlab-ci/inspect-remote-image.sh 
b/gitlab-ci/inspect-remote-image.sh
new file mode 100755
index 00000000000..e3810023b00
--- /dev/null
+++ b/gitlab-ci/inspect-remote-image.sh
@@ -0,0 +1,21 @@
+if [ $# != 5 ]; then
+    echo "Usage: $0 <username> <password> <image> <tag> <property>"
+    exit 0
+fi
+
+USERNAME=$1
+PASSWORD=$2
+IMAGE=$3
+TAG=$4
+PROPERTY=$5
+
+AUTHPOINT=$(curl -L -D - -s https://${CI_REGISTRY}/v2/ | grep Www-Authenticate)
+
+REALM=$(echo -n ${AUTHPOINT} | cut -d \" -f 2)
+SERVICE=$(echo -n ${AUTHPOINT} | cut -d \" -f 4)
+
+TOKEN=$(curl -L -s --user "${USERNAME}:${PASSWORD}" 
"${REALM}?client_id=docker&offline_token=true&service=${SERVICE}&scope=repository:${IMAGE}:pull"
 | jq -r ".token")
+
+DIGEST=$(curl -L -s -H "Accept: 
application/vnd.docker.distribution.manifest.v2+json" -H "Authorization: Bearer 
${TOKEN}" "https://${CI_REGISTRY}/v2/${IMAGE}/manifests/${TAG}"; | jq -r 
".config.digest")
+
+curl -L -s -H "Authorization: Bearer ${TOKEN}" 
"https://${CI_REGISTRY}/v2/${IMAGE}/blobs/${DIGEST}"; | jq -r "${PROPERTY}"
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to