Skip to content

ci: bump actions to Node 24 runtime#2609

Merged
tvi merged 1 commit into
mainfrom
t/fix-ci-actions
May 10, 2026
Merged

ci: bump actions to Node 24 runtime#2609
tvi merged 1 commit into
mainfrom
t/fix-ci-actions

Conversation

@tvi
Copy link
Copy Markdown
Contributor

@tvi tvi commented May 10, 2026

GitHub Actions runners are deprecating Node 20 (forced Node 24 default on June 2nd, 2026; Node 20 removed on September 16th, 2026). Update the affected actions:

  • docker/setup-buildx-action: v3 -> v4 (Node 24)
  • docker/build-push-action: v6 -> v7 (Node 24)
  • codecov/codecov-action: v5 -> v6 (Node 24)
  • codecov/test-results-action@v1 has been deprecated by Codecov and has no Node 24 release. Its functionality has been folded into codecov/codecov-action; migrate the existing test-results uploads to codecov/codecov-action@v6 with 'report_type: test_results'.

v6 of codecov-action and v7 of the docker actions require Actions Runner v2.327.1+, which is already provided by the ubuntu-24.04 / ubuntu-latest runners used in these workflows.

GitHub Actions runners are deprecating Node 20 (forced Node 24 default
on June 2nd, 2026; Node 20 removed on September 16th, 2026). Update the
affected actions:

- docker/setup-buildx-action: v3 -> v4 (Node 24)
- docker/build-push-action: v6 -> v7 (Node 24)
- codecov/codecov-action: v5 -> v6 (Node 24)
- codecov/test-results-action@v1 has been deprecated by Codecov and has
  no Node 24 release. Its functionality has been folded into
  codecov/codecov-action; migrate the existing test-results uploads to
  codecov/codecov-action@v6 with 'report_type: test_results'.

v6 of codecov-action and v7 of the docker actions require Actions Runner
v2.327.1+, which is already provided by the ubuntu-24.04 / ubuntu-latest
runners used in these workflows.
@codecov
Copy link
Copy Markdown

codecov Bot commented May 10, 2026

❌ 10 Tests Failed:

Tests completed Failed Passed Skipped
2611 10 2601 5
View the full list of 13 ❄️ flaky test(s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestUpdateNetworkConfig

Flake rate in main: 75.68% (Passed 98 times, Failed 305 times)

Stack Traces | 41s run time
=== RUN   TestUpdateNetworkConfig
=== PAUSE TestUpdateNetworkConfig
=== CONT  TestUpdateNetworkConfig
Executing command dig in sandbox i0h3mucj5btt1azwobzzs
--- FAIL: TestUpdateNetworkConfig (41.02s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false

Flake rate in main: 76.08% (Passed 94 times, Failed 299 times)

Stack Traces | 2.83s run time
=== RUN   TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false
    sandbox_network_update_test.go:372: Command [curl] output: event:{start:{pid:1357}}
    sandbox_network_update_test.go:372: Command [curl] output: event:{end:{exit_code:35  exited:true  status:"exit status 35"  error:"exit status 35"}}
Executing command curl in sandbox i5rg9fzz948xcg37cyr6p
    sandbox_network_update_test.go:372: Command [curl] output: event:{start:{pid:1358}}
    sandbox_network_update_test.go:372: Command [curl] output: event:{end:{exit_code:35  exited:true  status:"exit status 35"  error:"exit status 35"}}
    sandbox_network_update_test.go:391: Command [curl] output: event:{start:{pid:1359}}
    sandbox_network_update_test.go:391: Command [curl] output: event:{data:{stdout:"HTTP/2 302 \r\nx-content-type-options: nosniff\r\nlocation: https://dns.google/\r\ndate: Sun, 10 May 2026 04:33:33 GMT\r\ncontent-type: text/html; charset=UTF-8\r\nserver: HTTP server (unknown)\r\ncontent-length: 216\r\nx-xss-protection: 0\r\nx-frame-options: SAMEORIGIN\r\nalt-svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\n\r\n"}}
    sandbox_network_update_test.go:391: Command [curl] output: event:{end:{exited:true  status:"exit status 0"}}
    sandbox_network_update_test.go:391: Command [curl] completed successfully in sandbox i5rg9fzz948xcg37cyr6p
    sandbox_network_update_test.go:391: 
        	Error Trace:	.../api/sandboxes/sandbox_network_out_test.go:74
        	            				.../api/sandboxes/sandbox_network_update_test.go:60
        	            				.../api/sandboxes/sandbox_network_update_test.go:391
        	Error:      	An error is expected but got nil.
        	Test:       	TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false
        	Messages:   	https://8.8.8.8 should be blocked
--- FAIL: TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false (2.83s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestUpdateNetworkConfig/reset_before_firewall_steps

Flake rate in main: 55.38% (Passed 83 times, Failed 103 times)

Stack Traces | 6.06s run time
=== RUN   TestUpdateNetworkConfig/reset_before_firewall_steps
Executing command curl in sandbox idsm9k1h1u5wbj26bslxh
    sandbox_network_update_test.go:158: Command [curl] output: event:{start:{pid:1309}}
    sandbox_network_update_test.go:158: Command [curl] output: event:{end:{exit_code:28  exited:true  status:"exit status 28"  error:"exit status 28"}}
    sandbox_network_update_test.go:158: 
        	Error Trace:	.../api/sandboxes/sandbox_network_out_test.go:67
        	            				.../api/sandboxes/sandbox_network_update_test.go:58
        	            				.../api/sandboxes/sandbox_network_update_test.go:158
        	Error:      	Received unexpected error:
        	            	command curl in sandbox idsm9k1h1u5wbj26bslxh failed with exit code 28
        	Test:       	TestUpdateNetworkConfig/reset_before_firewall_steps
        	Messages:   	https://8.8.8.8 should be reachable
--- FAIL: TestUpdateNetworkConfig/reset_before_firewall_steps (6.06s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/templates::TestTemplateBuildENV

Flake rate in main: 59.17% (Passed 89 times, Failed 129 times)

Stack Traces | 0s run time
=== RUN   TestTemplateBuildENV
=== PAUSE TestTemplateBuildENV
=== CONT  TestTemplateBuildENV
--- FAIL: TestTemplateBuildENV (0.00s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/templates::TestTemplateBuildENV/ENV_with_multiline_value

Flake rate in main: 60.58% (Passed 82 times, Failed 126 times)

Stack Traces | 23.6s run time
=== RUN   TestTemplateBuildENV/ENV_with_multiline_value
=== PAUSE TestTemplateBuildENV/ENV_with_multiline_value
=== CONT  TestTemplateBuildENV/ENV_with_multiline_value
    build_template_test.go:134: test-ubuntu-env-multiline: [info] Building template iscs800a87cy204068dp/b65d34bd-89ca-4bfa-a4df-d0cb23707b70
    build_template_test.go:134: test-ubuntu-env-multiline: [info] CACHED [base] FROM ubuntu:22.04 [ffd709f131f42dfab282de47a91dd2c139e900c1c11fc574b49b517a05ef0a32]
    build_template_test.go:134: test-ubuntu-env-multiline: [info] CACHED [base] DEFAULT USER user [90bdd4afa342293c931373351bf578872dec9179214ba3e8bf9edba311466213]
    build_template_test.go:134: test-ubuntu-env-multiline: [info] [builder 1/2] ENV MULTILINE line1
        line2
        line3 [e93da3f3765f20eb6407c336b9e4e0b9321d994ec5f6cb547743a2a4070eed23]
    build_template_test.go:134: test-ubuntu-env-multiline: [info] [builder 2/2] RUN [[ $(echo "$MULTILINE" | wc -l) -eq 3 ]] || exit 1 [477610d61cdf858776262d3331809539bcbcf16f706aac18515a57337bae1786]
    build_template_test.go:134: test-ubuntu-env-multiline: [error] Build failed: failed to run command '[[ $(echo "$MULTILINE" | wc -l) -eq 3 ]] || exit 1': exit status 1
    build_template_test.go:374: Build failed: {<nil> failed to run command '[[ $(echo "$MULTILINE" | wc -l) -eq 3 ]] || exit 1': exit status 1 0xc00080af60}
--- FAIL: TestTemplateBuildENV/ENV_with_multiline_value (23.60s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost

Flake rate in main: 58.12% (Passed 160 times, Failed 222 times)

Stack Traces | 0s run time
=== RUN   TestBindLocalhost
=== PAUSE TestBindLocalhost
=== CONT  TestBindLocalhost
--- FAIL: TestBindLocalhost (0.00s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_0_0_0_0

Flake rate in main: 62.66% (Passed 90 times, Failed 151 times)

Stack Traces | 8.7s run time
=== RUN   TestBindLocalhost/bind_0_0_0_0
=== PAUSE TestBindLocalhost/bind_0_0_0_0
=== CONT  TestBindLocalhost/bind_0_0_0_0
Executing command /bin/bash in sandbox ip1vsmphszdg9aw1jlm0i (user: root)
Executing command /bin/bash in sandbox i0vzndgjs65zjs1zjtr42 (user: root)
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1266}}
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_0_0_0_0
        	Messages:   	Unexpected status code 502 for bind address 0.0.0.0
--- FAIL: TestBindLocalhost/bind_0_0_0_0 (8.70s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_::1

Flake rate in main: 64.57% (Passed 90 times, Failed 164 times)

Stack Traces | 7.65s run time
=== RUN   TestBindLocalhost/bind_::1
=== PAUSE TestBindLocalhost/bind_::1
=== CONT  TestBindLocalhost/bind_::1
Executing command /bin/bash in sandbox ip1vsmphszdg9aw1jlm0i
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1263}}
Executing command python in sandbox i54vsamvsxeidotukvsy7
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_::1
        	Messages:   	Unexpected status code 502 for bind address ::1
--- FAIL: TestBindLocalhost/bind_::1 (7.65s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_localhost

Flake rate in main: 64.57% (Passed 90 times, Failed 164 times)

Stack Traces | 7.69s run time
=== RUN   TestBindLocalhost/bind_localhost
=== PAUSE TestBindLocalhost/bind_localhost
=== CONT  TestBindLocalhost/bind_localhost
Executing command python in sandbox ix81zcjiqwxii9cu8x8ip
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1265}}
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_localhost
        	Messages:   	Unexpected status code 502 for bind address localhost
Executing command python in sandbox i9yzupj8ftyd26hc1gzgi
--- FAIL: TestBindLocalhost/bind_localhost (7.69s)
github.com/e2b-dev/infra/tests/integration/internal/tests/orchestrator::TestSandboxMemoryIntegrity

Flake rate in main: 65.16% (Passed 100 times, Failed 187 times)

Stack Traces | 73.5s run time
=== RUN   TestSandboxMemoryIntegrity
=== PAUSE TestSandboxMemoryIntegrity
=== CONT  TestSandboxMemoryIntegrity
    sandbox_memory_integrity_test.go:26: Build completed successfully
--- FAIL: TestSandboxMemoryIntegrity (73.51s)
github.com/e2b-dev/infra/tests/integration/internal/tests/orchestrator::TestSandboxMemoryIntegrity/tmpfs_hash

Flake rate in main: 66.79% (Passed 90 times, Failed 181 times)

Stack Traces | 25.9s run time
=== RUN   TestSandboxMemoryIntegrity/tmpfs_hash
=== PAUSE TestSandboxMemoryIntegrity/tmpfs_hash
=== CONT  TestSandboxMemoryIntegrity/tmpfs_hash
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{start:{pid:1251}}
Executing command bash in sandbox iwpl4o1fax85jbtoaeay2 (user: root)
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stdout:"Total memory: 985 MB\nUsed memory before tmpfs mount: 183 MB\nFree memory before tmpfs mount: 801 MB\nMemory to use in integrity test (80% of free, min 64MB): 640 MB\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"640+0 records in\n640+0 records out\n671088640 bytes (671 MB, 640 MiB) copied, 3.20714 s, 209 MB/s\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\tCommand being timed: \"dd if=/dev/urandom of=/mnt/testfile bs=1M count=640\"\n\tUser time (seconds): 0.00\n\tSystem time (seconds): 3.18\n\tPercent of CPU this job got: 99%\n\tElapsed (wall clock) time (h:mm:ss or m:ss): 0:03.21\n\tAverage shared text size (kbytes): 0\n\tAverage unshared data size (kbytes): 0\n\tAverage stack size (kbytes): 0\n\tAverage total size (kbytes): 0\n\tMaximum resident set size (kbytes): 2600\n\tAverage resident set size (kbytes): 0\n\tMajor (requiring I/O) page faults: 3\n\tMinor (reclaiming a frame) page faults: 342\n\tVoluntary context switches: 4\n\tInvoluntary context switches: 33\n\tSwaps: 0\n\tFile system inputs: 176\n\tFile system outputs: 0\n\tSocket messages sent: 0\n\tSocket messages received: 0\n\tSignals delivered: 0\n\tPage size (bytes): 4096\n\tExit status: 0\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stdout:"Used memory after tmpfs mount and file fill: 830 MB\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{end:{exited:true status:"exit status 0"}}
    sandbox_memory_integrity_test.go:70: Command [bash] completed successfully in sandbox ilo5xb5wb9gmn3hxpk3ac
Executing command bash in sandbox ilo5xb5wb9gmn3hxpk3ac (user: root)
    sandbox_memory_integrity_test.go:74: Command [bash] output: event:{start:{pid:1267}}
    sandbox_memory_integrity_test.go:74: Command [bash] output: event:{data:{stdout:"997f591e798c69a5f0a1f751c704000b93077c646f77a1f613fa8fbfb3a37f14\n"}}
    sandbox_memory_integrity_test.go:74: Command [bash] output: event:{end:{exited:true status:"exit status 0"}}
    sandbox_memory_integrity_test.go:74: Command [bash] completed successfully in sandbox ilo5xb5wb9gmn3hxpk3ac
Executing command bash in sandbox ilo5xb5wb9gmn3hxpk3ac (user: root)
    sandbox_memory_integrity_test.go:99: Command [bash] output: event:{start:{pid:1271}}
    sandbox_memory_integrity_test.go:100: 
        	Error Trace:	.../tests/orchestrator/sandbox_memory_integrity_test.go:100
        	Error:      	Received unexpected error:
        	            	failed to execute command bash in sandbox ilo5xb5wb9gmn3hxpk3ac: invalid_argument: protocol error: incomplete envelope: unexpected EOF
        	Test:       	TestSandboxMemoryIntegrity/tmpfs_hash
--- FAIL: TestSandboxMemoryIntegrity/tmpfs_hash (25.88s)
github.com/e2b-dev/infra/tests/integration/internal/tests/proxies::TestSandboxAutoResumeViaProxy

Flake rate in main: 54.04% (Passed 91 times, Failed 107 times)

Stack Traces | 18.1s run time
=== RUN   TestSandboxAutoResumeViaProxy
=== PAUSE TestSandboxAutoResumeViaProxy
=== CONT  TestSandboxAutoResumeViaProxy
    auto_resume_test.go:97: [Status code: 502] Response body: {"sandboxId":"i155tcmjcko6qdcndb98w","message":"The sandbox is running but port is not open","port":8000,"code":502}
    auto_resume_test.go:97: [Status code: 502] Response body: {"sandboxId":"i155tcmjcko6qdcndb98w","message":"The sandbox is running but port is not open","port":8000,"code":502}
    auto_resume_test.go:116: 
        	Error Trace:	.../tests/proxies/auto_resume_test.go:116
        	Error:      	Received unexpected error:
        	            	Get "http://localhost:3002": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
        	Test:       	TestSandboxAutoResumeViaProxy
--- FAIL: TestSandboxAutoResumeViaProxy (18.12s)
Executing command cat in sandbox iecd927uw4x9fodaa5u7v (user: root)
github.com/e2b-dev/infra/tests/integration/internal/tests/proxies::TestSandboxWithTrafficAccessTokenAutoResumeViaProxy

Flake rate in main: 54.04% (Passed 91 times, Failed 107 times)

Stack Traces | 18.9s run time
=== RUN   TestSandboxWithTrafficAccessTokenAutoResumeViaProxy
=== PAUSE TestSandboxWithTrafficAccessTokenAutoResumeViaProxy
=== CONT  TestSandboxWithTrafficAccessTokenAutoResumeViaProxy
    traffic_access_token_test.go:263: [Status code: 502] Response body: {"sandboxId":"ib30kfpeflm87j3ij2u8h","message":"The sandbox is running but port is not open","port":8080,"code":502}
    traffic_access_token_test.go:263: [Status code: 502] Response body: {"sandboxId":"ib30kfpeflm87j3ij2u8h","message":"The sandbox is running but port is not open","port":8080,"code":502}
    traffic_access_token_test.go:292: 
        	Error Trace:	.../tests/proxies/traffic_access_token_test.go:292
        	Error:      	Received unexpected error:
        	            	Get "http://localhost:3002": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
        	Test:       	TestSandboxWithTrafficAccessTokenAutoResumeViaProxy
--- FAIL: TestSandboxWithTrafficAccessTokenAutoResumeViaProxy (18.90s)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The version v4 for docker/setup-buildx-action and version v7 for docker/build-push-action do not exist in the official repositories. Bumping to non-existent versions will cause the workflow to fail as the actions cannot be resolved.

Comment thread .github/actions/start-services/action.yml
Comment thread .github/actions/start-services/action.yml
Copy link
Copy Markdown

@claude claude Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — straightforward action version bumps for Node 24 compatibility, with the documented codecov/test-results-action → codecov-action migration applied consistently.

Extended reasoning...

Overview

The PR bumps four GitHub Actions to their Node 24-compatible major versions across CI workflow files:

  • docker/setup-buildx-action@v3 → v4
  • docker/build-push-action@v6 → v7
  • codecov/codecov-action@v5 → v6
  • codecov/test-results-action@v1 (deprecated) replaced by codecov/codecov-action@v6 with report_type: test_results

Security risks

None. Changes are limited to action version pinning and an input field rename, all using official, well-known publishers (docker, codecov). No secrets handling, permissions, or workflow trigger semantics are altered.

Level of scrutiny

Low. Pure CI config maintenance prompted by the upcoming Node 20 deprecation in GitHub Actions. The migration of test-results-actioncodecov-action@v6 with report_type: test_results matches Codecov's documented migration path and is applied consistently in all three places (integration_tests.yml, pr-tests.yml, pr-tests-arm64.yml). Token, files, flags, and disable_search inputs are preserved.

Other factors

Runner requirement (Actions Runner v2.327.1+) is satisfied by the ubuntu-24.04/ubuntu-latest/self-hosted runners already in use, as called out in the PR description. The bug hunting system found no issues. Low blast radius — failures here would surface immediately as CI failures rather than affecting production.

@tvi tvi merged commit d224a77 into main May 10, 2026
52 checks passed
@tvi tvi deleted the t/fix-ci-actions branch May 10, 2026 04:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants