diff --git a/zombienet/docker/Makefile.include/polkadot.mk b/zombienet/docker/Makefile.include/polkadot.mk index 00f4576404..314e45630b 100644 --- a/zombienet/docker/Makefile.include/polkadot.mk +++ b/zombienet/docker/Makefile.include/polkadot.mk @@ -6,12 +6,12 @@ polkadot_builder: --build-arg GROUP_ID=$(GROUP_ID) \ --build-arg USER_NAME=$(IN_DOCKER_USERNAME) \ --build-arg RUST_VERSION=$(RUST_VERSION) \ - --build-arg BASE_IMAGE=$(OS_IMAGE_NAME) \ --build-arg SCCACHE_VERSION=$(SCCACHE_VERSION) \ + --build-arg BASE_IMAGE=$(OS_IMAGE_NAME) \ --build-arg BASE_IMAGE_TAG=$(OS_IMAGE_TAG_WITH_HASH) . polkadot_builder_push: set_versions - docker push $(DOCKER_REGISTRY_PATH)polkadot_builder:$(CURRENT_DATE)-rust$(RUST_VERSION)-$(ARCHITECTURE) ; \ + docker push $(DOCKER_REGISTRY_PATH)polkadot_builder:$(CURRENT_DATE)-rust$(RUST_VERSION)-$(ARCHITECTURE) polkadot_builder_push_manifest: docker manifest create $(DOCKER_REGISTRY_PATH)polkadot_builder:$(CURRENT_DATE)-rust$(RUST_VERSION) \ diff --git a/zombienet/docker/Makefile.include/run_zombietest.mk b/zombienet/docker/Makefile.include/run_zombietest.mk index 74a0b9e534..0ccfa9d323 100644 --- a/zombienet/docker/Makefile.include/run_zombietest.mk +++ b/zombienet/docker/Makefile.include/run_zombietest.mk @@ -40,3 +40,25 @@ define run_test fi; \ exit $$TEST_EXIT_CODE endef + +copy_logs_to_host: + @CONTAINER_NAME=$(CONTAINER_NAME); \ + FINISHED_CONTAINER_NAME=$$CONTAINER_NAME-finished; \ + FINISHED_IMAGE_NAME=$$CONTAINER_NAME-finished-image; \ + echo "-- Copying logs from container $$CONTAINER_NAME to host path $(HOST_LOGS_PATH)"; \ + docker commit $$CONTAINER_NAME $$FINISHED_IMAGE_NAME; \ + echo "-- Starting temporary container $$FINISHED_CONTAINER_NAME to copy logs"; \ + docker run -d --name $$FINISHED_CONTAINER_NAME --platform $(PLATFORM) --entrypoint "/bin/bash" $$FINISHED_IMAGE_NAME -c "tail -f /dev/null"; \ + mkdir -p $(HOST_LOGS_PATH); \ + DIRS_TO_COPY=$$(docker exec $$FINISHED_CONTAINER_NAME "/bin/bash" -c "find /tmp/ -type d -name 'zombie-*'"); \ + for DIR in $$DIRS_TO_COPY; do \ + docker cp "$$FINISHED_CONTAINER_NAME:$$DIR/logs" "$(HOST_LOGS_PATH)/$$(basename $$DIR)"; \ + done; \ + docker cp "$$FINISHED_CONTAINER_NAME:/tmp/versions.env" "/tmp/versions.env" ; \ + echo "-- Logs copied to $(HOST_LOGS_PATH)"; \ + echo "-- Runtime cache directory content:"; \ + docker exec $$FINISHED_CONTAINER_NAME "/bin/bash" -c "ls -la /tmp/kagome/runtimes-cache/" ; \ + echo "-- Stop and removing container $$FINISHED_CONTAINER_NAME and image $$FINISHED_IMAGE_NAME"; \ + docker stop $$FINISHED_CONTAINER_NAME; \ + docker rm -f $$FINISHED_CONTAINER_NAME; \ + docker rmi $$FINISHED_IMAGE_NAME diff --git a/zombienet/docker/Makefile.include/versions.mk b/zombienet/docker/Makefile.include/versions.mk index 2e0e95f972..b024df9ef5 100644 --- a/zombienet/docker/Makefile.include/versions.mk +++ b/zombienet/docker/Makefile.include/versions.mk @@ -9,6 +9,9 @@ set_versions: get_versions ifeq ($(POLKADOT_SDK_RELEASE),) $(eval POLKADOT_SDK_RELEASE=$(shell grep 'polkadot_format_version:' polkadot-sdk-versions.txt | cut -d ' ' -f 2)) endif +ifeq ($(ZOMBIENET_RELEASE),) + $(eval ZOMBIENET_RELEASE=$(shell grep 'short_version:' zombienet-versions.txt | cut -d ' ' -f 2)) +endif export POLKADOT_SDK_RELEASE POLKADOT_RELEASE_GLOBAL_NUMERIC=$(shell echo $(POLKADOT_SDK_RELEASE) | sed 's/[^0-9]//g' ) export POLKADOT_RELEASE_GLOBAL_NUMERIC diff --git a/zombienet/docker/Makefile.include/zombie_tester.mk b/zombienet/docker/Makefile.include/zombie_tester.mk index 515865e0e9..f8918eef7d 100644 --- a/zombienet/docker/Makefile.include/zombie_tester.mk +++ b/zombienet/docker/Makefile.include/zombie_tester.mk @@ -1,54 +1,45 @@ -zombie_tester: - if [ -f polkadot-sdk-versions.txt ]; then \ - ZOMBIENET_RELEASE=$$(grep 'short_version:' zombienet-versions.txt | cut -d ' ' -f 2); \ - POLKADOT_SDK_RELEASE=$$(grep 'polkadot_format_version:' polkadot-sdk-versions.txt | cut -d ' ' -f 2); \ - PROJECT_ID=$(PROJECT_ID) \ - docker build \ - --platform $(PLATFORM) \ - --no-cache \ - -t $(DOCKER_REGISTRY_PATH)zombie_tester:$(TESTER_LATEST_TAG) \ - -t $(DOCKER_REGISTRY_PATH)zombie_tester:$${POLKADOT_SDK_RELEASE}_$${ZOMBIENET_RELEASE} \ - --secret id=google_creds,src=$(GOOGLE_APPLICATION_CREDENTIALS) \ - -f zombie_tester.Dockerfile \ - --build-arg BASE_IMAGE=$(OS_IMAGE_NAME) \ - --build-arg BASE_IMAGE_TAG=$(OS_IMAGE_TAG_WITH_HASH) \ - --build-arg PROJECT_ID=$$PROJECT_ID \ - --build-arg RUST_VERSION=$(RUST_VERSION) \ - --build-arg POLKADOT_BINARY_PACKAGE_VERSION="$(POLKADOT_BINARY_PACKAGE_VERSION)" \ - --build-arg ZOMBIENET_RELEASE=$$ZOMBIENET_RELEASE \ - --build-arg POLKADOT_SDK_RELEASE=$$POLKADOT_SDK_RELEASE . ; \ - else \ - echo "One or more files are missing."; \ - fi +zombie_tester: set_versions + docker build --progress=plain --platform $(PLATFORM) \ + --no-cache \ + -t $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-$(ARCHITECTURE) \ + --secret id=google_creds,src=$(GOOGLE_APPLICATION_CREDENTIALS) \ + -f zombie_tester.Dockerfile \ + --build-arg USER_ID=$(USER_ID) \ + --build-arg GROUP_ID=$(GROUP_ID) \ + --build-arg USER_NAME=$(IN_DOCKER_USERNAME) \ + --build-arg BASE_IMAGE=$(OS_IMAGE_NAME) \ + --build-arg BASE_IMAGE_TAG=$(OS_IMAGE_TAG_WITH_HASH) \ + --build-arg PROJECT_ID=$(PROJECT_ID) \ + --build-arg RUST_VERSION=$(RUST_VERSION) \ + --build-arg POLKADOT_BINARY_PACKAGE_VERSION="$(POLKADOT_BINARY_PACKAGE_VERSION)" \ + --build-arg ZOMBIENET_RELEASE=$(ZOMBIENET_RELEASE) \ + --build-arg POLKADOT_SDK_RELEASE=$(POLKADOT_SDK_RELEASE) . -zombie_tester_push: - if [ -f polkadot-sdk-versions.txt ]; then \ - ZOMBIENET_RELEASE=$$(grep 'short_version:' zombienet-versions.txt | cut -d ' ' -f 2); \ - POLKADOT_SDK_RELEASE=$$(grep 'polkadot_format_version:' polkadot-sdk-versions.txt | cut -d ' ' -f 2); \ - docker push $(DOCKER_REGISTRY_PATH)zombie_tester:$${POLKADOT_SDK_RELEASE}_$${ZOMBIENET_RELEASE} ; \ - docker push $(DOCKER_REGISTRY_PATH)zombie_tester:$(TESTER_LATEST_TAG) ; \ - else \ - echo "-- One or more files are missing."; \ - fi +zombie_tester_push: set_versions + docker push $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-$(ARCHITECTURE) -copy_logs_to_host: - @CONTAINER_NAME=$(CONTAINER_NAME); \ - FINISHED_CONTAINER_NAME=$$CONTAINER_NAME-finished; \ - FINISHED_IMAGE_NAME=$$CONTAINER_NAME-finished-image; \ - echo "-- Copying logs from container $$CONTAINER_NAME to host path $(HOST_LOGS_PATH)"; \ - docker commit $$CONTAINER_NAME $$FINISHED_IMAGE_NAME; \ - echo "-- Starting temporary container $$FINISHED_CONTAINER_NAME to copy logs"; \ - docker run -d --name $$FINISHED_CONTAINER_NAME --platform $(PLATFORM) --entrypoint "/bin/bash" $$FINISHED_IMAGE_NAME -c "tail -f /dev/null"; \ - mkdir -p $(HOST_LOGS_PATH); \ - DIRS_TO_COPY=$$(docker exec $$FINISHED_CONTAINER_NAME "/bin/bash" -c "find /tmp/ -type d -name 'zombie-*'"); \ - for DIR in $$DIRS_TO_COPY; do \ - docker cp "$$FINISHED_CONTAINER_NAME:$$DIR/logs" "$(HOST_LOGS_PATH)/$$(basename $$DIR)"; \ - done; \ - docker cp "$$FINISHED_CONTAINER_NAME:/tmp/versions.env" "/tmp/versions.env" ; \ - echo "-- Logs copied to $(HOST_LOGS_PATH)"; \ - echo "-- Runtime cache directory content:"; \ - docker exec $$FINISHED_CONTAINER_NAME "/bin/bash" -c "ls -la /tmp/kagome/runtimes-cache/" ; \ - echo "-- Stop and removing container $$FINISHED_CONTAINER_NAME and image $$FINISHED_IMAGE_NAME"; \ - docker stop $$FINISHED_CONTAINER_NAME; \ - docker rm -f $$FINISHED_CONTAINER_NAME; \ - docker rmi $$FINISHED_IMAGE_NAME +zombie_tester_push_manifest: + docker manifest create $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE) \ + --amend $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-amd64 \ + --amend $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-arm64 && \ + docker manifest create $(DOCKER_REGISTRY_PATH)zombie_tester:$(TESTER_LATEST_TAG) \ + --amend $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-amd64 \ + --amend $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-arm64 && \ + docker manifest push $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE) && \ + docker manifest push $(DOCKER_REGISTRY_PATH)polkadot_builder:$(TESTER_LATEST_TAG) + +zombie_tester_all_arch: set_versions + $(MAKE) zombie_tester PLATFORM=linux/amd64 ARCHITECTURE=amd64 && \ + $(MAKE) zombie_tester_push PLATFORM=linux/amd64 ARCHITECTURE=amd64 && \ + $(MAKE) zombie_tester PLATFORM=linux/arm64 ARCHITECTURE=arm64 && \ + $(MAKE) zombie_tester_push PLATFORM=linux/arm64 ARCHITECTURE=arm64 && \ + $(MAKE) zombie_tester_push_manifest + +zombie_tester_image_info: set_versions + @echo "---------------------------------" + @echo ZOMBIE_TESTER_IMAGE: $(DOCKER_REGISTRY_PATH)zombie_tester:$(TESTER_LATEST_TAG) + @echo ZOMBIE_TESTER_AMD64_IMAGE: $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-amd64 + @echo ZOMBIE_TESTER_ARM64_IMAGE: $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE)-arm64 + +zombie_tester_check_tag: + @docker manifest inspect $(DOCKER_REGISTRY_PATH)zombie_tester:$(POLKADOT_SDK_RELEASE)_$(ZOMBIENET_RELEASE) > /dev/null 2>&1 && echo "true" || echo "false" diff --git a/zombienet/docker/tester-entrypoint.sh b/zombienet/docker/tester-entrypoint.sh new file mode 100644 index 0000000000..69b74d43a2 --- /dev/null +++ b/zombienet/docker/tester-entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -eo pipefail + +install_packages kagome-dev=$KAGOME_PACKAGE_VERSION kagome-dev-runtime +echo "KAGOME_DEV_VERSION=`apt-cache policy kagome-dev | grep 'Installed:' | awk '{print $2}'`" +echo "KAGOME_DEV_RUNTIME_VERSION=`apt-cache policy kagome-dev-runtime | grep 'Installed:' | awk '{print $2}'`" + +sed -i '1s/^/#/' /etc/apt/sources.list.d/kagome.list + +exec gosu $USER_NAME "$@" diff --git a/zombienet/docker/zombie_tester.Dockerfile b/zombienet/docker/zombie_tester.Dockerfile index 266c2e2c65..2cf2f3de68 100644 --- a/zombienet/docker/zombie_tester.Dockerfile +++ b/zombienet/docker/zombie_tester.Dockerfile @@ -20,25 +20,27 @@ ENV AUTHOR=${AUTHOR} LABEL org.opencontainers.image.authors="${AUTHOR}" LABEL org.opencontainers.image.description="Zombienet image" -ARG ZOMBIENET_RELEASE -ENV ZOMBIENET_RELEASE=$ZOMBIENET_RELEASE -ARG POLKADOT_SDK_RELEASE -ENV POLKADOT_SDK_RELEASE=$POLKADOT_SDK_RELEASE +# Use a temporary working directory for root operations +WORKDIR /root/ +SHELL ["/bin/bash", "-xo", "pipefail", "-c"] +# Copy the install_packages script and set executable permissions COPY install_packages /usr/sbin/install_packages RUN chmod 0755 /usr/sbin/install_packages -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - -RUN groupadd --gid 10000 nonroot && \ - useradd --home-dir /home/nonroot \ - --create-home \ - --shell /bin/bash \ - --gid nonroot \ - --groups nonroot \ - --uid 10000 nonroot +# Set Polkadot SDK release environment variable and install required packages +ARG ZOMBIENET_RELEASE +ENV ZOMBIENET_RELEASE=$ZOMBIENET_RELEASE +ARG POLKADOT_SDK_RELEASE +ENV POLKADOT_SDK_RELEASE=$POLKADOT_SDK_RELEASE -WORKDIR /home/nonroot/ +# Setup enterprise repository and install required packages +ARG REGION +ENV REGION=$REGION +ARG PROJECT_ID +ENV PROJECT_ID=$PROJECT_ID +ARG POLKADOT_BINARY_PACKAGE_VERSION +ENV POLKADOT_BINARY_PACKAGE_VERSION=$POLKADOT_BINARY_PACKAGE_VERSION RUN install_packages \ wget \ @@ -47,22 +49,6 @@ RUN install_packages \ gnupg2 \ curl - -RUN mkdir -p /home/nonroot/bin - -WORKDIR /home/nonroot/bin - -ENV PATH="/home/nonroot/bin:${PATH}" - -RUN wget -q https://github.com/paritytech/zombienet/releases/download/$ZOMBIENET_RELEASE/zombienet-linux-x64 && \ - chmod +x zombienet-linux-x64 && \ - ln -s /home/nonroot/bin/zombienet-linux-x64 /home/nonroot/bin/zombienet - -# Setup enterprise repository - -ARG REGION -ENV REGION=$REGION - RUN curl -fsSL https://${REGION}-apt.pkg.dev/doc/repo-signing-key.gpg | \ gpg --dearmor -o /usr/share/keyrings/${REGION}-apt-archive-keyring.gpg @@ -75,9 +61,6 @@ RUN echo "deb [signed-by=/usr/share/keyrings/${REGION}-apt-archive-keyring.gpg] RUN install_packages apt-transport-artifact-registry -ARG PROJECT_ID -ENV PROJECT_ID=$PROJECT_ID - RUN echo "deb [signed-by=/usr/share/keyrings/europe-north1-apt-archive-keyring.gpg] \ ar+https://${REGION}-apt.pkg.dev/projects/${PROJECT_ID} kagome-apt main" | \ tee -a /etc/apt/sources.list.d/kagome.list @@ -85,29 +68,36 @@ RUN echo "deb [signed-by=/usr/share/keyrings/europe-north1-apt-archive-keyring.g RUN sed -i 's|^\(\s*\)# *Service-Account-JSON ".*";|\1Service-Account-JSON "/root/.gcp/google_creds.json";|' \ /etc/apt/apt.conf.d/90artifact-registry -ARG POLKADOT_BINARY_PACKAGE_VERSION -ENV POLKADOT_BINARY_PACKAGE_VERSION=$POLKADOT_BINARY_PACKAGE_VERSION - +# Install Polkadot RUN mkdir -p /root/.gcp RUN --mount=type=secret,id=google_creds,target=/root/.gcp/google_creds.json \ - install_packages polkadot-binary=${POLKADOT_BINARY_PACKAGE_VERSION} && \ - sed -i '1s/^/#/' /etc/apt/sources.list.d/kagome.list - -RUN echo "Polkadot Version:" && ./polkadot --version && \ - echo "Polkadot Parachain Version:" && ./polkadot-parachain --version && \ - echo "Zombienet Version:" && ./zombienet version && \ - echo "Polkadot Execute Worker Version:" && ./polkadot-execute-worker --version && \ - echo "Polkadot Prepare Worker Version:" && ./polkadot-prepare-worker --version && \ + install_packages polkadot-binary=${POLKADOT_BINARY_PACKAGE_VERSION} + +# Install Zombienet +RUN ARCHITECTURE=$(uname -m); \ + if [ "$ARCHITECTURE" = "x86_64" ]; then \ + ARCHITECTURE="x64"; \ + elif [ "$ARCHITECTURE" = "aarch64" ]; then \ + ARCHITECTURE="arm64"; \ + else \ + echo "-- Unsupported architecture: $ARCHITECTURE"; exit 1; \ + fi && \ + echo "-- Downloading zombienet v${ZOMBIENET_RELEASE} for ${ARCHITECTURE}" && \ + wget -q https://github.com/paritytech/zombienet/releases/download/$ZOMBIENET_RELEASE/zombienet-linux-${ARCHITECTURE} && \ + mv zombienet-linux-${ARCHITECTURE} /usr/local/bin/zombienet && \ + chmod +x /usr/local/bin/zombienet + +# Check installed versions +RUN echo "Polkadot Version:" && polkadot --version && \ + echo "Polkadot Parachain Version:" && polkadot-parachain --version && \ + echo "Zombienet Version:" && zombienet version && \ + echo "Polkadot Execute Worker Version:" && polkadot-execute-worker --version && \ + echo "Polkadot Prepare Worker Version:" && polkadot-prepare-worker --version && \ echo "Malus Version:" && malus --version && \ echo "Adder Collator Version:" && adder-collator --version && \ echo "Undying Collator Version:" && undying-collator --version -RUN ln -s /home/nonroot/bin/zombienet-linux-x64 /usr/local/bin/zombienet && \ - ln -s /home/nonroot/bin/polkadot /usr/local/bin/polkadot && \ - ln -s /home/nonroot/bin/polkadot-parachain /usr/local/bin/polkadot-parachain && \ - ln -s /home/nonroot/bin/polkadot-execute-worker /usr/local/bin/polkadot-execute-worker && \ - ln -s /home/nonroot/bin/polkadot-prepare-worker /usr/local/bin/polkadot-prepare-worker - +# Install required packages RUN install_packages \ gpg \ gpg-agent \ @@ -123,3 +113,26 @@ RUN install_packages \ ssh \ libgcc-s1 \ zlib1g + +# Create non-root user and switch to it +ARG USER_ID=1000 +ARG GROUP_ID=1000 +ARG USER_NAME=builder +ENV USER_ID=${USER_ID} +ENV GROUP_ID=${GROUP_ID} +ENV USER_NAME=${USER_NAME} + +# Create group with the specified GID, and user with the specified UID. Switch to the user. +RUN groupadd -g ${GROUP_ID} ${USER_NAME} && \ + useradd -m -d /home/${USER_NAME} -u ${USER_ID} -g ${USER_NAME} ${USER_NAME} + +WORKDIR /home/${USER_NAME}/workspace + +# Install kagome on the startup +ARG KAGOME_PACKAGE_VERSION +ENV KAGOME_PACKAGE_VERSION=${KAGOME_PACKAGE_VERSION} + +COPY tester-entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod 0755 /usr/local/bin/entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]