From f04924d6be9baab8696e53a2dde1f08cb0f23e3d Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 27 Jul 2025 01:26:44 +0000 Subject: [PATCH] docker: Extract complement logs on failure. docker: Sort config options used during complement. Signed-off-by: Jason Volk --- .github/workflows/test.yml | 19 ++++++-- docker/Dockerfile.complement | 89 +++++++++++++++++++----------------- docker/bake.sh | 9 ---- docker/complement.sh | 53 +++++++++++++++++---- src/core/log/console.rs | 4 +- src/main/logging.rs | 2 + 6 files changed, 109 insertions(+), 67 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4c2edf74..60188bd5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -203,7 +203,8 @@ jobs: run: | docker/complement.sh - - name: Extract + - if: success() || failure() && steps.execute.outcome == 'failure' + name: Extract id: extract env: name: complement_tester__${{matrix.sys_name}}__${{matrix.sys_version}}__${{matrix.sys_target}} @@ -213,13 +214,23 @@ jobs: cid=$(cat "$name") docker cp "$cid:/usr/src/complement/new_results.jsonl" tests/test_results/complement/test_results.jsonl - - name: Upload - id: upload + - if: success() || failure() && steps.execute.outcome == 'failure' + name: Upload New Results + id: upload-result uses: actions/upload-artifact@v4 with: - name: test_results-${{matrix.feat_set}}-${{matrix.sys_name}}-${{matrix.sys_target}}.jsonl + name: complement_results-${{matrix.feat_set}}-${{matrix.sys_name}}-${{matrix.sys_target}}.jsonl path: ./tests/test_results/complement/test_results.jsonl + - if: failure() && steps.execute.outcome == 'failure' + name: Upload Failure Output + id: upload-output + uses: actions/upload-artifact@v4 + with: + name: complement_output-${{matrix.feat_set}}-${{matrix.sys_name}}-${{matrix.sys_target}}.jsonl + path: ./complement.jsonl + if-no-files-found: ignore + - name: Accept id: accept run: | diff --git a/docker/Dockerfile.complement b/docker/Dockerfile.complement index 5c576960..4ef24d99 100644 --- a/docker/Dockerfile.complement +++ b/docker/Dockerfile.complement @@ -66,49 +66,50 @@ COPY --from=source /usr/src/tuwunel/tests/test_results/complement/test_results.j COPY < new_results.jsonl; - wc -l old_results.jsonl new_results.jsonl; - diff -w -y -t --width=275 --suppress-common-lines old_results.jsonl new_results.jsonl; + jq -s -c "sort_by(.Test, .Timestamp)[] | $jq_out" < output.jsonl > full_output.jsonl; EOF -RUN echo $(tr -d '\n' < uwu.sh) > uwu.sh +RUN echo $(tr -d '\n' < uwu.sh) > uwu.sh && chmod a+x uwu.sh ENTRYPOINT ["/bin/bash", "/usr/src/complement/uwu.sh"] diff --git a/docker/bake.sh b/docker/bake.sh index 28b31b3c..682c1cb3 100755 --- a/docker/bake.sh +++ b/docker/bake.sh @@ -63,15 +63,6 @@ rocksdb_opt_level=3 rocksdb_portable=1 git_checkout="HEAD" use_chef="true" -complement_count=1 -complement_skip="TestPartialStateJoin.*" -complement_skip="${complement_skip}|TestRoomDeleteAlias/Pa.*/Can_delete_canonical_alias" -complement_skip="${complement_skip}|TestUnbanViaInvite.*" -complement_skip="${complement_skip}|TestToDeviceMessagesOverFederation/stopped_server" -complement_skip="${complement_skip}|TestLogin/parallel/POST_/login_as_non-existing_user_is_rejected" -complement_skip="${complement_skip}|TestThreadReceiptsInSyncMSC4102" -complement_skip="${complement_skip}|TestRoomCreate/Parallel/POST_/createRoom_makes_a_room_with_a_topic_and_writes_rich_topic_representation" -complement_skip="${complement_skip}|TestRoomCreate/Parallel/POST_/createRoom_makes_a_room_with_a_topic_via_initial_state_overwritten_by_topic" set +a ############################################################################### diff --git a/docker/complement.sh b/docker/complement.sh index 08818b63..8d9d12a5 100755 --- a/docker/complement.sh +++ b/docker/complement.sh @@ -15,6 +15,19 @@ default_sys_name="debian" default_sys_target="x86_64-v1-linux-gnu" default_sys_version="testing-slim" +default_run=".*" +run="${1:-$default_run}" + +skip="" +skip="TestPartialStateJoin.*" +skip="${skip}|TestRoomDeleteAlias/Pa.*/Can_delete_canonical_alias" +skip="${skip}|TestUnbanViaInvite.*" +skip="${skip}|TestToDeviceMessagesOverFederation/stopped_server" +skip="${skip}|TestLogin/parallel/POST_/login_as_non-existing_user_is_rejected" +skip="${skip}|TestThreadReceiptsInSyncMSC4102" +skip="${skip}|TestRoomCreate/Parallel/POST_/createRoom_makes_a_room_with_a_topic_and_writes_rich_topic_representation" +skip="${skip}|TestRoomCreate/Parallel/POST_/createRoom_makes_a_room_with_a_topic_via_initial_state_overwritten_by_topic" + set -a cargo_profile="${cargo_profile:-$default_cargo_profile}" feat_set="${feat_set:-$default_feat_set}" @@ -30,12 +43,21 @@ set +a ############################################################################### +envs="" +envs="$envs -e complement_verbose=${complement_verbose:-0}" +envs="$envs -e complement_count=${complement_count:-1}" +envs="$envs -e complement_parallel=${complement_parallel:-16}" +envs="$envs -e complement_shuffle=${complement_shuffle:-0}" +envs="$envs -e complement_timeout=${complement_timeout:-1h}" +envs="$envs -e complement_skip=${complement_skip:-$skip}" +envs="$envs -e complement_run=${run}" + set -x tester_image="complement-tester--${sys_name}--${sys_version}--${sys_target}" testee_image="complement-testee--${cargo_profile}--${rust_toolchain}--${rust_target}--${feat_set}--${sys_name}--${sys_version}--${sys_target}" name="complement_tester__${sys_name}__${sys_version}__${sys_target}" sock="/var/run/docker.sock" -arg="--name $name -v $sock:$sock --network=host $tester_image ${testee_image}" +arg="--name $name -v $sock:$sock --network=host $envs $tester_image ${testee_image}" set +x if test "$CI_VERBOSE_ENV" = "true"; then @@ -45,21 +67,32 @@ fi docker rm -f "$name" 2>/dev/null -trap 'set +x; date; echo -e "\033[1;41;37mERROR\033[0m"' ERR +arg="-d $arg" +cid=$(docker run $arg) if test "$CI" = "true"; then - arg="-d $arg" - cid=$(docker run $arg) -else - arg="--rm -a stdout -a stderr $arg" - docker run $arg - exit $? + echo -n "$cid" > "$name" fi -echo -n "$cid" > "$name" +output_src="$cid:/usr/src/complement/full_output.jsonl" +output_dst="complement.jsonl" +extract_output() { + docker cp "$output_src" "$output_dst" +} -trap 'docker container stop $cid; set +x; date; echo -e "\033[1;41;37mERROR\033[0m"' INT +result_src="$cid:/usr/src/complement/new_results.jsonl" +result_dst="tests/test_results/complement/test_results.jsonl" +extract_results() { + docker cp "$result_src" "$result_dst" +} + +trap 'extract_output; set +x; date; echo -e "\033[1;41;37mERROR\033[0m"' ERR +trap 'docker container stop $cid; extract_output' INT docker logs -f "$cid" docker wait "$cid" 2>/dev/null +extract_results +git diff -U0 --color --shortstat "$result_dst" | (grep "$run" || true) + +git diff --quiet --exit-code "$result_dst" echo -e "\033[1;42;30mACCEPT\033[0m" diff --git a/src/core/log/console.rs b/src/core/log/console.rs index d5f03227..c91c0728 100644 --- a/src/core/log/console.rs +++ b/src/core/log/console.rs @@ -73,7 +73,9 @@ impl ConsoleFormat { #[must_use] pub fn new(config: &Config) -> Self { Self { - _compact: fmt::format().compact(), + _compact: fmt::format() + .compact() + .with_ansi(config.log_colors), full: Format::::default() .with_thread_ids(config.log_thread_ids) diff --git a/src/main/logging.rs b/src/main/logging.rs index d8b9a77a..10f53543 100644 --- a/src/main/logging.rs +++ b/src/main/logging.rs @@ -29,6 +29,8 @@ pub(crate) fn init( .map_err(|e| err!(Config("log", "{e}.")))?; let console_layer = fmt::Layer::new() + .with_ansi(config.log_colors) + .with_thread_ids(config.log_thread_ids) .with_span_events(console_span_events) .event_format(ConsoleFormat::new(config)) .fmt_fields(ConsoleFormat::new(config))