From 9f3c458a2c231096f54bd8f601e94c8bc3e49270 Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Mon, 21 Oct 2024 16:15:18 +0100 Subject: [PATCH 1/2] ci: add `docker` job Does not yet run the Docker tests. The tests are still flaky on waiting for the Docker container network connection. --- .gitlab-ci.yml | 28 ++++++++++++++++++++++++-- e2e/.bazelrc | 3 +++ e2e/.bazelrc.ci | 3 +++ e2e/docker/local-ubuntu.16.04-gnu.yaml | 2 +- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 782c2e7b..73f2ad1e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,6 +16,7 @@ include: CI_COMMIT_REF_NAME CI_COMMIT_SHA CI_SERVER_HOST + DOCKER_HOST default: tags: @@ -27,7 +28,8 @@ oci: tags: - dind services: - - docker:27.3.0-dind + - name: docker:27.3.0-dind + entrypoint: ["sh", "-c", "dockerd-entrypoint.sh --registry-mirror=$CI_REGISTRY_MIRROR"] variables: DOCKER_TLS_CERTDIR: "/certs" DOCKER_HOST: tcp://docker:2376 @@ -40,7 +42,7 @@ oci: - docker buildx build --tag="$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" --push --cache-from "type=registry,ref=$CI_REGISTRY_IMAGE:$CI_COMMIT_BEFORE_SHA" --build-arg BUILDKIT_INLINE_CACHE=1 . rules: !reference [.bazelisk, rules] -test: +.test: extends: .bazelisk needs: - oci @@ -50,6 +52,11 @@ test: paths: - ".cache/bazel/disk" - ".cache/bazel/repo" + +test: + extends: .test + variables: + DOCKER_HOST: "none://available" parallel: matrix: - ROOT: @@ -62,6 +69,23 @@ test: script: - cd "${ROOT}"; bazelisk test --config="${CONFIG}" //... +docker: + extends: .test + tags: + - arm64 + - dind + services: + - docker:27.3.0-dind + variables: + ROOT: e2e + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" # Do not use TLS as `docker` image sets that up + HEALTHCHECK_TCP_PORT: "2375" + script: + - cd "${ROOT}" + - bazelisk run docker:info + - bazelisk test $(bazelisk query 'attr("tags", "requires-docker", tests(...))') + # TODO: switch this out for `rules_semantic_release` semantic-release: stage: .post diff --git a/e2e/.bazelrc b/e2e/.bazelrc index 29a5bc7e..0e8bcd01 100644 --- a/e2e/.bazelrc +++ b/e2e/.bazelrc @@ -25,5 +25,8 @@ common --@rules_labgrid//python:bootstrap=script # Enable built Zstandard toolchain common --extra_toolchains=@rules_zstd//zstd/toolchain/zstd:built +# Enable local Docker host for testing +test --action_env=LG_DOCKER_HOST=unix:///var/run/docker.sock + # User-specific .bazelrc try-import %workspace%/.bazelrc.user diff --git a/e2e/.bazelrc.ci b/e2e/.bazelrc.ci index 2493d291..44b7dc2f 100644 --- a/e2e/.bazelrc.ci +++ b/e2e/.bazelrc.ci @@ -28,6 +28,9 @@ test --test_verbose_timeout_warnings # Validate that the lockfile is correct common --lockfile_mode=error +# Enable local Docker host for testing +test --action_env=LG_DOCKER_HOST=${DOCKER_HOST} + # These locations are cached on the CI build:local --disk_cache=${CI_PROJECT_DIR}/.cache/bazel/disk build:local --repository_cache=${CI_PROJECT_DIR}/.cache/bazel/repo diff --git a/e2e/docker/local-ubuntu.16.04-gnu.yaml b/e2e/docker/local-ubuntu.16.04-gnu.yaml index 6239d70c..a3e31b45 100644 --- a/e2e/docker/local-ubuntu.16.04-gnu.yaml +++ b/e2e/docker/local-ubuntu.16.04-gnu.yaml @@ -2,7 +2,7 @@ targets: main: resources: - DockerDaemon: - docker_daemon_url: "unix:///var/run/docker.sock" + docker_daemon_url: !template "$LG_DOCKER_HOST" drivers: - DockerDriver: image_uri: "rastasheep/ubuntu-sshd:16.04" -- GitLab From 8f5b7b0df7aa0a2308aac7929f97187f7f418810 Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Tue, 29 Oct 2024 16:46:32 +0000 Subject: [PATCH 2/2] fix(e2e): patch `labgrid` Docker race condition Patch needs to go upstream. --- e2e/MODULE.bazel | 10 +++++ e2e/labgrid/pkg/patches/BUILD.bazel | 0 e2e/labgrid/pkg/patches/RECORD.patch | 11 ++++++ .../patches/docker-resource-avail-false.patch | 38 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 e2e/labgrid/pkg/patches/BUILD.bazel create mode 100644 e2e/labgrid/pkg/patches/RECORD.patch create mode 100644 e2e/labgrid/pkg/patches/docker-resource-avail-false.patch diff --git a/e2e/MODULE.bazel b/e2e/MODULE.bazel index 5a6c39b5..e61f2db8 100644 --- a/e2e/MODULE.bazel +++ b/e2e/MODULE.bazel @@ -44,3 +44,13 @@ pip.parse( requirements_lock = "//python:requirements.txt", ) use_repo(pip, "pip") + +# Patch LabGrid Docker race condition +pip.override( + file = "labgrid-24.0a1-py3-none-any.whl", + patch_strip = 1, + patches = [ + "//labgrid/pkg/patches:docker-resource-avail-false.patch", + "//labgrid/pkg/patches:RECORD.patch", + ], +) diff --git a/e2e/labgrid/pkg/patches/BUILD.bazel b/e2e/labgrid/pkg/patches/BUILD.bazel new file mode 100644 index 00000000..e69de29b diff --git a/e2e/labgrid/pkg/patches/RECORD.patch b/e2e/labgrid/pkg/patches/RECORD.patch new file mode 100644 index 00000000..0627df70 --- /dev/null +++ b/e2e/labgrid/pkg/patches/RECORD.patch @@ -0,0 +1,11 @@ +--- a/labgrid-24.0a1.dist-info/RECORD ++++ b/labgrid-24.0a1.dist-info/RECORD +@@ -114,7 +114,7 @@ + labgrid/resource/base.py,sha256=QsoRsJXcljdV3SaexHiVhuSDvMU0m7RR4QaHH1fpp9s,1209 + labgrid/resource/common.py,sha256=ve-TGWU6_dJBll1NOAxL6m5oNHNN_4Ew82WhwFU-UvA,4329 + labgrid/resource/dediprogflasher.py,sha256=jAvXvt0dnKURmO_iyhQ-5emrofwdHMF1ju2z9s21DKc,423 +-labgrid/resource/docker.py,sha256=USQs_gcbQqFdA_Tlqu-fouNwJ4SWjY2HXz7hsUppLGs,6561 ++labgrid/resource/docker.py,sha256=MxHeDzA3YdrHxgIkjgOfm2FFSvc3h4y1oSe5-NgxW6Y,6637 + labgrid/resource/ethernetport.py,sha256=ronapV86S5Ok7rszbzZTB3WeI6AQCtYdYJ9HlETBZQI,11683 + labgrid/resource/fastboot.py,sha256=-NbkstcTTKsJTNjL0PZH4huad35V1g0zkm76kY4BJBs,388 + labgrid/resource/flashrom.py,sha256=gS4zTcviEtZz2DbFc7pXl5UWncz4ckE8eSdSpviZKcA,478 diff --git a/e2e/labgrid/pkg/patches/docker-resource-avail-false.patch b/e2e/labgrid/pkg/patches/docker-resource-avail-false.patch new file mode 100644 index 00000000..e588453f --- /dev/null +++ b/e2e/labgrid/pkg/patches/docker-resource-avail-false.patch @@ -0,0 +1,38 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Matt Clarkson +Date: Tue, 29 Oct 2024 16:38:26 +0000 +Subject: [PATCH] fix(DockerDaemon): correctly poll container network + connections + +- Set the network service unavailable when created + - Prevents a race condition when polling the network service +- Set the parent of the network service to the Docker daemon + - Moves the network service from a static resource to a dynamic one +- Increase the timeout + - Allows container download and booting to occur +--- + labgrid/resource/docker.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/labgrid/resource/docker.py b/labgrid/resource/docker.py +index 626e4f80..5228f3db 100644 +--- a/labgrid/resource/docker.py ++++ b/labgrid/resource/docker.py +@@ -88,7 +88,7 @@ class DockerDaemon(ManagedResource): + def __attrs_post_init__(self): + super().__attrs_post_init__() + self._nw_services = dict() +- self.timeout = 5.0 ++ self.timeout = 30.0 + self.avail = True + + def on_client_bound(self, client): +@@ -108,6 +108,8 @@ class DockerDaemon(ManagedResource): + nw_service = target_factory.make_resource( + self.target, "NetworkService", + service_name, network_service) ++ nw_service.avail = False ++ nw_service._parent = self + if client.container_name not in self._nw_services: + self._nw_services[client.container_name] = list() + self._nw_services[client.container_name].append(nw_service) -- GitLab