Philippe Mathieu-Daudé <f4...@amsat.org> writes:

> Thanks Fam, this fixes Shippable builds :)
>
> On 11/03/2017 10:12 AM, Fam Zheng wrote:
>> When a base image locally defined by QEMU, such as in the debian images,
>> is updated, the dockerfile checksum mechanism in docker.py still skips
>> updating the derived image, because it only looks at the literal content
>> of the dockerfile, without considering changes to the base image.
>>
>> For example we have a recent fix e58c1f9b35e81 that fixed
>> debian-win64-cross by updating its base image, debian8-mxe, but due to
>> above "feature" of docker.py the image in question is automatically NOT
>> rebuilt unless you add NOCACHE=1. It is noticed on Shippable:
>>
>> https://app.shippable.com/github/qemu/qemu/runs/541/2/console
>>
>> because after the fix is merged, the error still occurs, and the log
>> shows the container image is, as explained above, not updated.
>>
>> This is because at the time docker.py was written, there wasn't any
>> dependencies between QEMU's docker images.
>>
>> Now improve this to preprocess any "FROM qemu:*" directives in the
>> dockerfiles while doing checksum, and inline the base image's dockerfile
>> content, recursively. This ensures any changes on the depended _QEMU_
>> images are taken into account.
>>
>> This means for external images that we expect to retrieve from docker
>> registries, we still do it as before. It is not perfect, because
>> registry images can get updated too. Technically we could substitute the
>> image name with its hex ID as obtained with $(docker images $IMAGE
>> --format="{{.Id}}"), but --format is not supported by RHEL 7, so leave
>> it for now.
>>
>> Reported-by: Philippe Mathieu-Daudé <f4...@amsat.org>
>> Signed-off-by: Fam Zheng <f...@redhat.com>
>
> Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
> Tested-by: Philippe Mathieu-Daudé <f4...@amsat.org>

Reviewed-by: Alex Bennée <alex.ben...@linaro.org>

>
>> ---
>>  tests/docker/docker.py | 24 +++++++++++++++++++++++-
>>  1 file changed, 23 insertions(+), 1 deletion(-)
>>
>> diff --git a/tests/docker/docker.py b/tests/docker/docker.py
>> index 08122ca17d..1246ba9578 100755
>> --- a/tests/docker/docker.py
>> +++ b/tests/docker/docker.py
>> @@ -105,6 +105,28 @@ def _copy_binary_with_libs(src, dest_dir):
>>              so_path = os.path.dirname(l)
>>              _copy_with_mkdir(l , dest_dir, so_path)
>>
>> +def _read_qemu_dockerfile(img_name):
>> +    df = os.path.join(os.path.dirname(__file__), "dockerfiles",
>> +                      img_name + ".docker")
>> +    return open(df, "r").read()
>> +
>> +def _dockerfile_preprocess(df):
>> +    out = ""
>> +    for l in df.splitlines():
>> +        if len(l.strip()) == 0 or l.startswith("#"):
>> +            continue
>> +        from_pref = "FROM qemu:"
>> +        if l.startswith(from_pref):
>> +            # TODO: Alternatively we could replace this line with "FROM $ID"
>> +            # where $ID is the image's hex id obtained with
>> +            #    $ docker images $IMAGE --format="{{.Id}}"
>> +            # but unfortunately that's not supported by RHEL 7.
>> +            inlining = _read_qemu_dockerfile(l[len(from_pref):])
>> +            out += _dockerfile_preprocess(inlining)
>> +            continue
>> +        out += l + "\n"
>> +    return out
>> +
>>  class Docker(object):
>>      """ Running Docker commands """
>>      def __init__(self):
>> @@ -196,7 +218,7 @@ class Docker(object):
>>              checksum = self.get_image_dockerfile_checksum(tag)
>>          except Exception:
>>              return False
>> -        return checksum == _text_checksum(dockerfile)
>> +        return checksum == 
>> _text_checksum(_dockerfile_preprocess(dockerfile))
>>
>>      def run(self, cmd, keep, quiet):
>>          label = uuid.uuid1().hex
>>


--
Alex Bennée

Reply via email to