diff mbox series

[RFC,v3,1/1] gitlab: Use plain docker in container-template.yml

Message ID 20230227151110.31455-2-farosas@suse.de
State New
Headers show
Series ci: Speed up container stage | expand

Commit Message

Fabiano Rosas Feb. 27, 2023, 3:11 p.m. UTC
Our dockerfiles no longer reference layers from other qemu images so
we can now use 'docker build' on them.

Also reinstate the caching that was disabled due to bad interactions
with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
BUILDKIT in GitLab either"). We now believe those issues to be fixed.

The COMMON_TAG needed to be fixed for the caching to work. The
docker.py script was not using the variable, but constructing the
correct URL directly.

Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
 .gitlab-ci.d/container-template.yml | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

Comments

Alex Bennée Feb. 27, 2023, 7 p.m. UTC | #1
Fabiano Rosas <farosas@suse.de> writes:

> Our dockerfiles no longer reference layers from other qemu images so
> we can now use 'docker build' on them.
>
> Also reinstate the caching that was disabled due to bad interactions
> with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
> BUILDKIT in GitLab either"). We now believe those issues to be fixed.
>
> The COMMON_TAG needed to be fixed for the caching to work. The
> docker.py script was not using the variable, but constructing the
> correct URL directly.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
>  .gitlab-ci.d/container-template.yml | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
> index c434b9c8f3..519b8a9482 100644
> --- a/.gitlab-ci.d/container-template.yml
> +++ b/.gitlab-ci.d/container-template.yml
> @@ -6,17 +6,16 @@
>      - docker:dind
>    before_script:
>      - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
> -    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
> +    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
>      - apk add python3
>      - docker info
>      - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
>    script:
>      - echo "TAG:$TAG"
>      - echo "COMMON_TAG:$COMMON_TAG"
> -    - ./tests/docker/docker.py --engine docker build
> -          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
> -          -r $CI_REGISTRY/qemu-project/qemu
> -    - docker tag "qemu/$NAME" "$TAG"
> +    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
> +      --build-arg BUILDKIT_INLINE_CACHE=1
> +      -f "tests/docker/dockerfiles/$NAME.docker" "."

I wonder why this doesn't injest a bunch of context. If I run:

  docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg BUILDKIT_INLINE_CACHE=1  --build-arg USER=alex --build-arg UID=1000 -t qemu
  /debian-alpha-cross -f "/home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker" .

it attempts to bring my entire build directory in as build context. This
is why we use the - < docker form in the Makefile.

>      - docker push "$TAG"
>    after_script:
>      - docker logout

So what I don't understand is if I do:

  docker pull registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross
  docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg
    BUILDKIT_INLINE_CACHE=1 -t qemu/debian-alpha-cross - <
    /home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker

I still see pretty much a full rebuild of the image.
Alex Bennée Feb. 27, 2023, 7:39 p.m. UTC | #2
Alex Bennée <alex.bennee@linaro.org> writes:

> Fabiano Rosas <farosas@suse.de> writes:
>
>> Our dockerfiles no longer reference layers from other qemu images so
>> we can now use 'docker build' on them.
>>
>> Also reinstate the caching that was disabled due to bad interactions
>> with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
>> BUILDKIT in GitLab either"). We now believe those issues to be fixed.
>>
>> The COMMON_TAG needed to be fixed for the caching to work. The
>> docker.py script was not using the variable, but constructing the
>> correct URL directly.
>>
>> Signed-off-by: Fabiano Rosas <farosas@suse.de>
>> ---
>>  .gitlab-ci.d/container-template.yml | 9 ++++-----
>>  1 file changed, 4 insertions(+), 5 deletions(-)
>>
>> diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
>> index c434b9c8f3..519b8a9482 100644
>> --- a/.gitlab-ci.d/container-template.yml
>> +++ b/.gitlab-ci.d/container-template.yml
>> @@ -6,17 +6,16 @@
>>      - docker:dind
>>    before_script:
>>      - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
>> -    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
>> +    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
>>      - apk add python3
>>      - docker info
>>      - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
>>    script:
>>      - echo "TAG:$TAG"
>>      - echo "COMMON_TAG:$COMMON_TAG"
>> -    - ./tests/docker/docker.py --engine docker build
>> -          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
>> -          -r $CI_REGISTRY/qemu-project/qemu
>> -    - docker tag "qemu/$NAME" "$TAG"
>> +    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
>> +      --build-arg BUILDKIT_INLINE_CACHE=1
>> +      -f "tests/docker/dockerfiles/$NAME.docker" "."
>
> I wonder why this doesn't injest a bunch of context. If I run:
>
>   docker build --cache-from
> registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg
> BUILDKIT_INLINE_CACHE=1 --build-arg USER=alex --build-arg UID=1000 -t
> qemu
>   /debian-alpha-cross -f "/home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker" .
>
> it attempts to bring my entire build directory in as build context. This
> is why we use the - < docker form in the Makefile.
>
>>      - docker push "$TAG"
>>    after_script:
>>      - docker logout
>
> So what I don't understand is if I do:
>
>   docker pull registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross
>   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg
>     BUILDKIT_INLINE_CACHE=1 -t qemu/debian-alpha-cross - <
>     /home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker
>
> I still see pretty much a full rebuild of the image.

For reference at the end:

  🕙19:37:36 alex@zen:container-diff.git  on  master took 19s 
  ➜  ./out/container-diff diff daemon://registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross daemon://qemu/debian-alpha-cross --type=file

  -----File-----

  These entries have been added to qemu/debian-alpha-cross:
  FILE                                 SIZE
  /usr/share/doc/base-files/FAQ        6B
  /usr/share/info/dir                  781B

  These entries have been deleted from qemu/debian-alpha-cross: None

  These entries have been changed between registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross and qemu/debian-alpha-cross:
  FILE                                        SIZE1         SIZE2
  /var/cache/debconf/templates.dat            762.2K        764.1K
  /var/cache/debconf/templates.dat-old        762.2K        764.1K
  /var/lib/dpkg/available                     70.7K         70.7K
  /var/log/dpkg.log                           12.9K         20.2K
  /var/log/apt/term.log                       7.4K          15.5K
  /var/cache/ldconfig/aux-cache               5.5K          5.5K
  /var/cache/debconf/config.dat-old           4.5K          4.7K
  /var/log/apt/history.log                    1.5K          2K
  /etc/shadow                                 501B          501B
  /etc/shadow-                                501B          501B
  /etc/apt/sources.list                       430B          430B
Fabiano Rosas Feb. 27, 2023, 9:12 p.m. UTC | #3
Alex Bennée <alex.bennee@linaro.org> writes:

> Fabiano Rosas <farosas@suse.de> writes:
>
>> Our dockerfiles no longer reference layers from other qemu images so
>> we can now use 'docker build' on them.
>>
>> Also reinstate the caching that was disabled due to bad interactions
>> with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
>> BUILDKIT in GitLab either"). We now believe those issues to be fixed.
>>
>> The COMMON_TAG needed to be fixed for the caching to work. The
>> docker.py script was not using the variable, but constructing the
>> correct URL directly.
>>
>> Signed-off-by: Fabiano Rosas <farosas@suse.de>
>> ---
>>  .gitlab-ci.d/container-template.yml | 9 ++++-----
>>  1 file changed, 4 insertions(+), 5 deletions(-)
>>
>> diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
>> index c434b9c8f3..519b8a9482 100644
>> --- a/.gitlab-ci.d/container-template.yml
>> +++ b/.gitlab-ci.d/container-template.yml
>> @@ -6,17 +6,16 @@
>>      - docker:dind
>>    before_script:
>>      - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
>> -    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
>> +    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
>>      - apk add python3
>>      - docker info
>>      - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
>>    script:
>>      - echo "TAG:$TAG"
>>      - echo "COMMON_TAG:$COMMON_TAG"
>> -    - ./tests/docker/docker.py --engine docker build
>> -          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
>> -          -r $CI_REGISTRY/qemu-project/qemu
>> -    - docker tag "qemu/$NAME" "$TAG"
>> +    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
>> +      --build-arg BUILDKIT_INLINE_CACHE=1
>> +      -f "tests/docker/dockerfiles/$NAME.docker" "."
>
> I wonder why this doesn't injest a bunch of context. If I run:
>
>   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg BUILDKIT_INLINE_CACHE=1  --build-arg USER=alex --build-arg UID=1000 -t qemu
>   /debian-alpha-cross -f "/home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker" .
>
> it attempts to bring my entire build directory in as build context. This
> is why we use the - < docker form in the Makefile.
>

I only see that without DOCKER_BUILDKIT=1. With the variable set it does
like in the CI jobs. I presume it is being set automatically by gitlab,
but we could add it to the script to be explicit.

>>      - docker push "$TAG"
>>    after_script:
>>      - docker logout
>
> So what I don't understand is if I do:
>
>   docker pull registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross
>   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg
>     BUILDKIT_INLINE_CACHE=1 -t qemu/debian-alpha-cross - <
>     /home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker
>
> I still see pretty much a full rebuild of the image.

I don't use docker and podman does not support caching. I have
fresh-installed docker today and indeed it seems to not use the cache at
every build. We're missing something.

Sometimes it works:

===
$ docker system prune -a -f
Deleted build cache objects:                                                                                                                                                                   
xzbxmzaib3a8s0ufetop5ikhi                                                                                                                                                                      
0ce9qln4ipd2vgf9xw9to0fdb                                                                                                                                                                      
se4hq3rce3lad20t9sqqnubob

Total reclaimed space: 5.845kB

$ docker images -a
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

$ DOCKER_BUILDKIT=1 docker build --tag
registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest --cache-from
registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest --build-arg
BUILDKIT_INLINE_CACHE=1 -f debian-amd64.docker .

[+] Building 57.8s (12/12) FINISHED                                                                                                                                                            
 => [internal] load build definition from debian-amd64.docker                                                                                                                             0.2s
 => => transferring dockerfile: 5.90kB                                                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                                                         0.3s
 => => transferring context: 2B                                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/debian:11-slim                                                                                                                         1.8s
 => importing cache manifest from registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest                                                                                               0.7s
 => [1/6] FROM docker.io/library/debian:11-slim@sha256:8eaee63a5ea83744e62d5bf88e7d472d7f19b5feda3bfc6a2304cc074f269269                                                                   0.0s
 => CACHED [2/6] RUN export DEBIAN_FRONTEND=noninteractive &&     apt-get update &&     apt-get install -y eatmydata &&     eatmydata apt-get dist-upgrade -y &&     eatmydata apt-get i  0.0s
 => CACHED [3/6] RUN DEBIAN_FRONTEND=noninteractive eatmydata   apt install -y --no-install-recommends   cscope  global  linux-headers-amd64                                              0.0s
 => CACHED [4/6] RUN git clone https://github.com/luigirizzo/netmap.git /usr/src/netmap                                                                                                   0.0s
 => CACHED [5/6] RUN cd /usr/src/netmap && git checkout v11.3                                                                                                                             0.0s
 => CACHED [6/6] RUN cd /usr/src/netmap/LINUX && ./configure --no-drivers --no-apps --kernel-dir=$(ls -d /usr/src/linux-headers-*-amd64) && make install                                 54.9s
 => => pulling sha256:bb263680fed18eecdc67f885094df6f589bafc19004839d7fdf141df236a61aa                                                                                                    1.2s
 => => pulling sha256:f63092d28e024c119d6a4e257d0c62bb2117be93605f1f2363b1d9cb8fc9dc6c                                                                                                   44.6s
 => => pulling sha256:30fcedea9de9f22da43e20a79b40516c6e4a55e70eea401acacca18912e86769                                                                                                    4.5s
 => => pulling sha256:6f498daa6d20055a31e4681ec878e86129c3c1eaf5cf40f7ed87631accef1906                                                                                                    3.6s
 => => pulling sha256:79b1b0d7bce9a16b4a01e2055cd402d93e04efded50e2ffcf6be0d7c67e4895a                                                                                                    0.6s
 => => pulling sha256:250b927c5ce2d6d3e9d24bf085f649ce951966c9ec9c9e00ab8292dfb02c8b17                                                                                                    0.7s
 => exporting to image                                                                                                                                                                    0.1s
 => => exporting layers                                                                                                                                                                   0.0s
 => => writing image sha256:3663223c0a31c2be678c2fe110ba284b80b8d04d2d3290c14be7a4d7320f8a67                                                                                              0.0s
 => => naming to registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest                                                                                                                0.0s
 => exporting cache                                                                                                                                                                       0.0s
 => => preparing build cache for export  
===

There are issues pointing to some general unreliability of the cache:

https://github.com/moby/buildkit/issues/2274
https://github.com/moby/buildkit/issues/1981

What is your docker version? Mine is 20.10.17-ce and Gitlab's is
23.0.1. The issues above are on 20.10.11.
Fabiano Rosas Feb. 27, 2023, 9:18 p.m. UTC | #4
Fabiano Rosas <farosas@suse.de> writes:

> Alex Bennée <alex.bennee@linaro.org> writes:
>
>> Fabiano Rosas <farosas@suse.de> writes:
>>
>>> Our dockerfiles no longer reference layers from other qemu images so
>>> we can now use 'docker build' on them.
>>>
>>> Also reinstate the caching that was disabled due to bad interactions
>>> with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
>>> BUILDKIT in GitLab either"). We now believe those issues to be fixed.
>>>
>>> The COMMON_TAG needed to be fixed for the caching to work. The
>>> docker.py script was not using the variable, but constructing the
>>> correct URL directly.
>>>
>>> Signed-off-by: Fabiano Rosas <farosas@suse.de>
>>> ---
>>>  .gitlab-ci.d/container-template.yml | 9 ++++-----
>>>  1 file changed, 4 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
>>> index c434b9c8f3..519b8a9482 100644
>>> --- a/.gitlab-ci.d/container-template.yml
>>> +++ b/.gitlab-ci.d/container-template.yml
>>> @@ -6,17 +6,16 @@
>>>      - docker:dind
>>>    before_script:
>>>      - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
>>> -    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
>>> +    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
>>>      - apk add python3
>>>      - docker info
>>>      - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
>>>    script:
>>>      - echo "TAG:$TAG"
>>>      - echo "COMMON_TAG:$COMMON_TAG"
>>> -    - ./tests/docker/docker.py --engine docker build
>>> -          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
>>> -          -r $CI_REGISTRY/qemu-project/qemu
>>> -    - docker tag "qemu/$NAME" "$TAG"
>>> +    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
>>> +      --build-arg BUILDKIT_INLINE_CACHE=1
>>> +      -f "tests/docker/dockerfiles/$NAME.docker" "."
>>
>> I wonder why this doesn't injest a bunch of context. If I run:
>>
>>   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg BUILDKIT_INLINE_CACHE=1  --build-arg USER=alex --build-arg UID=1000 -t qemu
>>   /debian-alpha-cross -f "/home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker" .
>>
>> it attempts to bring my entire build directory in as build context. This
>> is why we use the - < docker form in the Makefile.
>>
>
> I only see that without DOCKER_BUILDKIT=1. With the variable set it does
> like in the CI jobs. I presume it is being set automatically by gitlab,
> but we could add it to the script to be explicit.
>
>>>      - docker push "$TAG"
>>>    after_script:
>>>      - docker logout
>>
>> So what I don't understand is if I do:
>>
>>   docker pull registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross
>>   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg
>>     BUILDKIT_INLINE_CACHE=1 -t qemu/debian-alpha-cross - <
>>     /home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker
>>
>> I still see pretty much a full rebuild of the image.
>
> I don't use docker and podman does not support caching. I have
> fresh-installed docker today and indeed it seems to not use the cache at
> every build. We're missing something.
>
> Sometimes it works:
>

Oops, sorry about the long lines, here it is again:

===
$ docker system prune -a -f
Deleted build cache objects:
xzbxmzaib3a8s0ufetop5ikhi
0ce9qln4ipd2vgf9xw9to0fdb
se4hq3rce3lad20t9sqqnubob

Total reclaimed space: 5.845kB

$ docker images -a
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

$ DOCKER_BUILDKIT=1 docker build --tag
registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest --cache-from
registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest --build-arg
BUILDKIT_INLINE_CACHE=1 -f debian-amd64.docker .

[+] Building 57.8s (12/12) FINISHED
 => [internal] load build definition from debian-amd64.docker
 => => transferring dockerfile: 5.90kB
 => [internal] load .dockerignore
 => => transferring context: 2B
 => [internal] load metadata for docker.io/library/debian:11-slim
 => importing cache manifest from registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest
 => [1/6] FROM
docker.io/library/debian:11-slim@sha256:8eaee63a5ea83744e62d5bf88e7d472d7f19b5feda3bfc6a2304cc074f269269
 => CACHED [2/6] RUN export DEBIAN_FRONTEND=noninteractive &&     apt-get update &&     apt-get install -y eatmydata
&&     eatmydata apt-get dist-upgrade -y &&     eatmydata apt-get i
 => CACHED [3/6] RUN DEBIAN_FRONTEND=noninteractive eatmydata   apt install -y --no-install-recommends   cscope 
global  linux-headers-amd64
 => CACHED [4/6] RUN git clone https://github.com/luigirizzo/netmap.git /usr/src/netmap
 => CACHED [5/6] RUN cd /usr/src/netmap && git checkout v11.3
 => CACHED [6/6] RUN cd /usr/src/netmap/LINUX && ./configure --no-drivers --no-apps --kernel-dir=$(ls -d
/usr/src/linux-headers-*-amd64) && make install
 => => pulling sha256:bb263680fed18eecdc67f885094df6f589bafc19004839d7fdf141df236a61aa
 => => pulling sha256:f63092d28e024c119d6a4e257d0c62bb2117be93605f1f2363b1d9cb8fc9dc6c
 => => pulling sha256:30fcedea9de9f22da43e20a79b40516c6e4a55e70eea401acacca18912e86769
 => => pulling sha256:6f498daa6d20055a31e4681ec878e86129c3c1eaf5cf40f7ed87631accef1906
 => => pulling sha256:79b1b0d7bce9a16b4a01e2055cd402d93e04efded50e2ffcf6be0d7c67e4895a
 => => pulling sha256:250b927c5ce2d6d3e9d24bf085f649ce951966c9ec9c9e00ab8292dfb02c8b17
 => exporting to image
 => => exporting layers
 => => writing image sha256:3663223c0a31c2be678c2fe110ba284b80b8d04d2d3290c14be7a4d7320f8a67
 => => naming to registry.gitlab.com/farosas/qemu/qemu/debian-amd64:latest
 => exporting cache
 => => preparing build cache for export
===

>
> There are issues pointing to some general unreliability of the cache:
>
> https://github.com/moby/buildkit/issues/2274
> https://github.com/moby/buildkit/issues/1981
>
> What is your docker version? Mine is 20.10.17-ce and Gitlab's is
> 23.0.1. The issues above are on 20.10.11.
Daniel P. Berrangé Feb. 28, 2023, 10:03 a.m. UTC | #5
On Mon, Feb 27, 2023 at 06:12:30PM -0300, Fabiano Rosas wrote:
> Alex Bennée <alex.bennee@linaro.org> writes:
> 
> > Fabiano Rosas <farosas@suse.de> writes:
> >
> >> Our dockerfiles no longer reference layers from other qemu images so
> >> we can now use 'docker build' on them.
> >>
> >> Also reinstate the caching that was disabled due to bad interactions
> >> with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
> >> BUILDKIT in GitLab either"). We now believe those issues to be fixed.
> >>
> >> The COMMON_TAG needed to be fixed for the caching to work. The
> >> docker.py script was not using the variable, but constructing the
> >> correct URL directly.
> >>
> >> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> >> ---
> >>  .gitlab-ci.d/container-template.yml | 9 ++++-----
> >>  1 file changed, 4 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
> >> index c434b9c8f3..519b8a9482 100644
> >> --- a/.gitlab-ci.d/container-template.yml
> >> +++ b/.gitlab-ci.d/container-template.yml
> >> @@ -6,17 +6,16 @@
> >>      - docker:dind
> >>    before_script:
> >>      - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
> >> -    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
> >> +    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
> >>      - apk add python3
> >>      - docker info
> >>      - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
> >>    script:
> >>      - echo "TAG:$TAG"
> >>      - echo "COMMON_TAG:$COMMON_TAG"
> >> -    - ./tests/docker/docker.py --engine docker build
> >> -          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
> >> -          -r $CI_REGISTRY/qemu-project/qemu
> >> -    - docker tag "qemu/$NAME" "$TAG"
> >> +    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
> >> +      --build-arg BUILDKIT_INLINE_CACHE=1
> >> +      -f "tests/docker/dockerfiles/$NAME.docker" "."
> >
> > I wonder why this doesn't injest a bunch of context. If I run:
> >
> >   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg BUILDKIT_INLINE_CACHE=1  --build-arg USER=alex --build-arg UID=1000 -t qemu
> >   /debian-alpha-cross -f "/home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker" .
> >
> > it attempts to bring my entire build directory in as build context. This
> > is why we use the - < docker form in the Makefile.
> >
> 
> I only see that without DOCKER_BUILDKIT=1. With the variable set it does
> like in the CI jobs. I presume it is being set automatically by gitlab,
> but we could add it to the script to be explicit.
> 
> >>      - docker push "$TAG"
> >>    after_script:
> >>      - docker logout
> >
> > So what I don't understand is if I do:
> >
> >   docker pull registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross
> >   docker build --cache-from registry.gitlab.com/stsquad/qemu/qemu/debian-alpha-cross --build-arg
> >     BUILDKIT_INLINE_CACHE=1 -t qemu/debian-alpha-cross - <
> >     /home/alex/lsrc/qemu.git/tests/docker/dockerfiles/debian-alpha-cross.docker
> >
> > I still see pretty much a full rebuild of the image.
> 
> I don't use docker and podman does not support caching. I have
> fresh-installed docker today and indeed it seems to not use the cache at
> every build. We're missing something.

Empirically in gitlab I see it working as desired after applying this
patch. My first job building alpine container does all commands:

  https://gitlab.com/berrange/qemu/-/jobs/3845066410

My second job building alpine container uses the cache:

  https://gitlab.com/berrange/qemu/-/jobs/3845340414

IME of using this in libvirt the caching almost always did its job as
expected in gitlab.

IOW I wouldn't worry too much about local behaviour possibly differing.

With regards,
Daniel
Daniel P. Berrangé Feb. 28, 2023, 10:14 a.m. UTC | #6
On Mon, Feb 27, 2023 at 12:11:10PM -0300, Fabiano Rosas wrote:
> Our dockerfiles no longer reference layers from other qemu images so
> we can now use 'docker build' on them.
> 
> Also reinstate the caching that was disabled due to bad interactions
> with certain runners. See commit 6ddc3dc7a8 ("tests/docker: don't use
> BUILDKIT in GitLab either"). We now believe those issues to be fixed.
> 
> The COMMON_TAG needed to be fixed for the caching to work. The
> docker.py script was not using the variable, but constructing the
> correct URL directly.
> 
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
>  .gitlab-ci.d/container-template.yml | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)

Tested-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

> 
> diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
> index c434b9c8f3..519b8a9482 100644
> --- a/.gitlab-ci.d/container-template.yml
> +++ b/.gitlab-ci.d/container-template.yml
> @@ -6,17 +6,16 @@
>      - docker:dind
>    before_script:
>      - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
> -    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
> +    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
>      - apk add python3
>      - docker info
>      - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
>    script:
>      - echo "TAG:$TAG"
>      - echo "COMMON_TAG:$COMMON_TAG"
> -    - ./tests/docker/docker.py --engine docker build
> -          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
> -          -r $CI_REGISTRY/qemu-project/qemu
> -    - docker tag "qemu/$NAME" "$TAG"
> +    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
> +      --build-arg BUILDKIT_INLINE_CACHE=1
> +      -f "tests/docker/dockerfiles/$NAME.docker" "."
>      - docker push "$TAG"
>    after_script:
>      - docker logout
> -- 
> 2.35.3
> 

With regards,
Daniel
Alex Bennée Feb. 28, 2023, 10:23 a.m. UTC | #7
Fabiano Rosas <farosas@suse.de> writes:

> Alex Bennée <alex.bennee@linaro.org> writes:
>
>> Fabiano Rosas <farosas@suse.de> writes:
>>
<snip>
>
> There are issues pointing to some general unreliability of the cache:
>
> https://github.com/moby/buildkit/issues/2274
> https://github.com/moby/buildkit/issues/1981
>
> What is your docker version? Mine is 20.10.17-ce and Gitlab's is
> 23.0.1. The issues above are on 20.10.11.

Ahh Debian stable strikes again:

  19:34:42 [root@zen:~] # docker --version
  Docker version 20.10.5+dfsg1, build 55c4c88

Bookworm is only on 20.10.23+dfsg1-1 and others

Maybe it's time to enable the docker repos again? Debian does offer
podman but I had issues with mapping user ids between container and
volume with it. All the user files appeared own by root.
diff mbox series

Patch

diff --git a/.gitlab-ci.d/container-template.yml b/.gitlab-ci.d/container-template.yml
index c434b9c8f3..519b8a9482 100644
--- a/.gitlab-ci.d/container-template.yml
+++ b/.gitlab-ci.d/container-template.yml
@@ -6,17 +6,16 @@ 
     - docker:dind
   before_script:
     - export TAG="$CI_REGISTRY_IMAGE/qemu/$NAME:latest"
-    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/$NAME:latest"
+    - export COMMON_TAG="$CI_REGISTRY/qemu-project/qemu/qemu/$NAME:latest"
     - apk add python3
     - docker info
     - docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
   script:
     - echo "TAG:$TAG"
     - echo "COMMON_TAG:$COMMON_TAG"
-    - ./tests/docker/docker.py --engine docker build
-          -t "qemu/$NAME" -f "tests/docker/dockerfiles/$NAME.docker"
-          -r $CI_REGISTRY/qemu-project/qemu
-    - docker tag "qemu/$NAME" "$TAG"
+    - docker build --tag "$TAG" --cache-from "$TAG" --cache-from "$COMMON_TAG"
+      --build-arg BUILDKIT_INLINE_CACHE=1
+      -f "tests/docker/dockerfiles/$NAME.docker" "."
     - docker push "$TAG"
   after_script:
     - docker logout