diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d784b8b2..877dd658 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -110,12 +110,35 @@ jobs: NU_VERSION=0.102.0 ARCH=$(uname -m | sed 's/x86_64/x86_64/;s/aarch64/aarch64/') NU_TARBALL="nu-${NU_VERSION}-${ARCH}-unknown-linux-gnu" - curl -fsSL "https://github.com/nushell/nushell/releases/download/${NU_VERSION}/${NU_TARBALL}.tar.gz" \ - | tar -xz -C /usr/local/bin --strip-components=1 "${NU_TARBALL}/nu" + # Download to a file. Do not pipe into tar. + # + # A piped curl reports a network failure as `gzip: stdin: unexpected + # end of file`. The step then takes its exit code from tar. A dropped + # connection therefore reads as a corrupt archive. + # + # A jazzy leg showed this. `curl: (56) Connection died` produced + # `tar: Error is not recoverable` and exit 2. + # + # `--retry` alone does not cover a connection reset mid-transfer. + # `--retry-all-errors` does. + curl -fsSL --retry 5 --retry-delay 2 --retry-all-errors \ + -o nu.tar.gz \ + "https://github.com/nushell/nushell/releases/download/${NU_VERSION}/${NU_TARBALL}.tar.gz" + tar -xzf nu.tar.gz -C /usr/local/bin --strip-components=1 "${NU_TARBALL}/nu" + rm -f nu.tar.gz - name: Install ROS dependencies run: | + # Name `ros--rclcpp` explicitly. apt then upgrades the copy + # baked into the image. Every other package here comes from the + # repository. If the image is stale, the two disagree on ABI. The + # mismatch then corrupts memory instead of failing to link. + # + # #303 carries the diagnosis: the version pair, the valgrind trace and + # the hypotheses it ruled out. Keep them there. A version number in a + # comment goes stale, and a stale comment is worse than none. apt-get install -y \ + ros-${{ matrix.distro }}-rclcpp \ ros-${{ matrix.distro }}-example-interfaces \ ros-${{ matrix.distro }}-rmw-zenoh-cpp \ ros-${{ matrix.distro }}-demo-nodes-cpp \ @@ -125,6 +148,48 @@ jobs: ros-${{ matrix.distro }}-nav-msgs \ protobuf-compiler + # An interop run tests hiroz against a specific set of ROS binaries. + # Nothing recorded which ones. + # + # When the lyrical leg started to fail, the logs could not answer the + # first question: what changed? A re-run replaces the job's log. The + # inputs of the last good run had therefore already gone. See #303. + # + # Recording them costs a second. It makes any two runs comparable. It + # also ruled out three hypotheses in #303. + - name: Record what this run tests against + run: | + echo "::group::Environment under test" + echo "distro: ${{ matrix.distro }}" + echo "image: ${{ matrix.image }} (floating tag — see versions below)" + grep -E '^(NAME|VERSION)=' /etc/os-release || true + # The core libraries come first. They are the point. + # + # apt installs the four application packages below from the + # repository on every run. Those packages therefore always read as + # current. Only the core libraries carry the image-versus-repository + # skew that caused #303. + # + # A list of the application packages alone would report "nothing + # changed" for the exact failure this step must explain. + echo "--- ROS core libraries (where image/repo skew shows up) ---" + dpkg-query -W -f='${Package} ${Version}\n' \ + "ros-${{ matrix.distro }}-rclcpp" \ + "ros-${{ matrix.distro }}-rcl" \ + "ros-${{ matrix.distro }}-rmw" \ + "ros-${{ matrix.distro }}-rcutils" \ + "ros-${{ matrix.distro }}-rcpputils" \ + "ros-${{ matrix.distro }}-rosidl-runtime-c" 2>&1 || true + echo "--- ROS packages under test ---" + dpkg-query -W -f='${Package} ${Version}\n' \ + "ros-${{ matrix.distro }}-rmw-zenoh-cpp" \ + "ros-${{ matrix.distro }}-demo-nodes-cpp" \ + "ros-${{ matrix.distro }}-example-interfaces" \ + "ros-${{ matrix.distro }}-action-tutorials-cpp" 2>&1 || true + echo "--- C runtime (glibc detects the heap corruption in #303) ---" + dpkg-query -W -f='${Package} ${Version}\n' libc6 2>&1 || true + echo "::endgroup::" + - name: Fix broken rmw_zenoh_cpp config for Kilted if: matrix.distro == 'kilted' run: |