diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 782c2e7b24fff36a31e1cb4ccb8d271e61fd05f7..73f2ad1e71f8a2e45f45870d8223d52de27b9974 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 29a5bc7e5d8b27a4b7fe4f8f5d98de1ab70b7083..0e8bcd01476a197b9f44031618da4aa3d1bf148b 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 2493d29127b8a89def55e1b97439b422f9bc8bde..44b7dc2f3dd0c35838a4daf7b44a75dea13aae46 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/MODULE.bazel b/e2e/MODULE.bazel index 5a6c39b546fa17a904cc9fafb20fbf0d9f2b9e2e..e61f2db81030a55944d8a296aee79c27a063a431 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/docker/local-ubuntu.16.04-gnu.yaml b/e2e/docker/local-ubuntu.16.04-gnu.yaml index 6239d70ce789e87e8632464f1262fd5a3d7c5b56..a3e31b451015f6b63ef546c114d13e01c4b5fb13 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" diff --git a/e2e/labgrid/pkg/patches/BUILD.bazel b/e2e/labgrid/pkg/patches/BUILD.bazel new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/e2e/labgrid/pkg/patches/RECORD.patch b/e2e/labgrid/pkg/patches/RECORD.patch new file mode 100644 index 0000000000000000000000000000000000000000..0627df70aee267809efa38647fa3a119c3d6b99e --- /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 0000000000000000000000000000000000000000..e588453f4a3b146320f7dd151f583b9ec559ef58 --- /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)