Release 1.1.7
Release 1.1.6
Release 1.1.5
Version 1.1.4
Release-engineering hotfix for 1.1.3, which was published without binary artifacts (#320). Same code as 1.1.3 — only CI/release workflow changes.
Bug Fixes
- restore release binaries (#321) — fixes #320. The 1.1.3 GitHub release was created manually before the release workflow ran, so
ncipollo/release-actionhitalready_existsand silently skipped binary upload. Workflow now setsallowUpdates: trueandartifactErrorsFailBuild: trueto fail loudly on upload errors.
CI / Dependencies
- bump
actions/upload-artifactv4 → v7,github/codeql-actionv3 → v4 (#318)
Compatibility
No code changes vs 1.1.3. Drop-in replacement for users who couldn't install 1.1.3.
Version 1.1.3
Highlights
This patch release lands the modularity refactor (#319) — a deep cleanup of CLI wiring, chaos command plumbing, and runtime adapters. No public CLI behavior changes; existing scripts and flags continue to work. The refactor removes long-standing duplication, paves the way for a future urfave/cli v3 migration, and wires up the previously unreachable --limit flag on netem/iptables parent commands.
Fixes
--limitnow works onnetemandiptables— the parsers always read--limitbut the flag was never declared on either parent command, so user-supplied values silently became0. The flag is now wired up and respected.- Sidecar create errors include the failing image name — previously the error template duplicated the tool name (
tc,iptables) instead of the image, making debugging pull/registry issues harder. - tc/iptables sidecar cleanup tolerates already-completed removals — graceful SIGTERM during a chaos action no longer surfaces spurious errors when Podman has already reaped the sidecar.
stop/pauseactions report both primary and restart/unpause errors — when restart-after-stop or unpause-after-pause fails, both errors are returned rather than silently dropping one.- Stop CLI rejects zero
--durationearlier in parsing instead of letting it reach the runtime.
Refactor (internal)
chaos.RunOnContainersfanout helper consolidates the list → random-pick → parallel/serial → collect-errors pattern that was duplicated across all 15 chaos action implementations. New chaos actions can no longer drift from the canonical shape.- Generic
NewAction[P]CLI builder collapses the 17 chaoscmd/*.gofiles into a uniform shape (flag list + typedParamParser[P]+CommandFactory[P]). - Request value objects replace long positional arg lists on fat interface methods:
NetemRequest,IPTablesRequest,StressRequest/StressResult,RemoveOpts. Mock signatures updated accordingly. cliflags.Flagsadapter decouples chaos parsers fromurfave/cliv1, isolating the future v3 migration to a single file.pkg/runtime/podmanpackage documents the Docker SDK embedding invariant and the cgroup leaf-naming gotchas (libpod-<id>.scope/container).util.ValidateInterfaceNamecentralizes the network-interface regex previously duplicated acrossnetemandiptablesparsers.cmd/main.gosplit into 5 focused per-concern files (each ≤ 200 LOC):main.go,runtime.go,logging.go,flags.go,commands.go.pkg/runtime/docker/sidecar.goconsolidates tc and iptables sidecar lifecycle (create → start → exec → force-remove) into one helper. SidecarStopSignal: "SIGKILL"skips Podman's 10-second SIGTERM grace window.- Containerd runtime split per concern:
client.go,api.go,container.go,task.go,commands.go,cgroup.go,sidecar.go,netem.go,iptables.go,stress.go,stress_sidecar.go(every production file ≤ 250 LOC).
Tests and CI
- Local integration tests now run inside runtime VMs — Docker/containerd in Colima, Podman in
podman machine. The bats suite runs on a real kernel against real sockets instead of a fragile macOS-side proxy. - stress-ng image pinned to
0.20.01in tests and CI prepull steps. Floating:latestleft stale 0.20.00 cached locally, which lacks/cg-injectand silently skipped the inject-cgroup test. The contract is now enforced (fail, notskip). - Unit coverage gains:
pkg/chaos69% → 98.5%,pkg/chaos/lifecycle82.6% → 100%. Adds focused tests forParseGlobalParams, lifecycle constructors, and thecontext.WithoutCancelcleanup path that runs on SIGTERM during stop/pause.
Compatibility
- No API or CLI breaking changes. All existing
pumbainvocations continue to work. - Docker SDK pinned at
v28.5.2; containerd SDK v2; Go 1.26;urfave/cliv1 (v3 migration deferred).
Release 1.1.2
Patch release focused on conservative dependency maintenance.
- Aligned the OpenTelemetry OTLP trace HTTP exporter with OTel 1.43.0.
- Refreshed test/build container images: bats 1.13.0 and Alpine 3.23.
- Kept the Docker SDK pinned at 28.5.2 to preserve compatibility with commonly deployed Docker daemons.
Release 1.1.1
Pumba 1.1.1
This patch release is a structural hardening release. It keeps the CLI behavior and runtime features from 1.1.0 intact, while cleaning up the internals that route chaos actions to Docker, containerd, and Podman.
The main result: runtime selection is now explicit, command construction is shared instead of copied across every action, and Docker runtime code is split into smaller files that match the behavior they implement. Boring on the surface. Exactly where this kind of change should be boring.
Highlights
Explicit runtime wiring
Pumba no longer relies on hidden global runtime state for chaos command execution. The CLI now builds a runtime factory once and passes it through command builders explicitly. This makes Docker, containerd, and Podman support easier to reason about and reduces the risk of accidentally coupling future runtime work to Docker-only assumptions.
Shared chaos command builder
Lifecycle, network emulation, iptables, and stress commands now use a common generic action builder. The old command files had the same shape repeated over and over: parse flags, build params, construct command, run it. That repetition is now centralized, with tests covering the shared behavior.
Cleaner package boundaries
Container lifecycle chaos actions now live under pkg/chaos/lifecycle instead of the old Docker-named package. The old name was misleading: kill, stop, pause, remove, exec, and restart are runtime-agnostic actions, not Docker-specific ones.
Request objects for netem and iptables
The netem and iptables runtime interfaces now take request objects instead of long positional argument lists. This makes call sites harder to misuse and gives sidecar image/pull settings a proper home alongside the action request.
Docker runtime split
The former Docker runtime monolith has been split by responsibility:
- client setup
- HTTP transport
- inspection
- lifecycle operations
- exec handling
- sidecar cleanup
- netem
- iptables
- stress
- cgroup resolution
- image pulls
No behavior change is intended here; the goal is smaller, testable units and less scrolling through a swamp.
CI and test hardening
This release also fixes two CI issues found while preparing the release:
make test-coveragenow runs under Bash, matching its use ofpipefail.- A flaky Docker stress test now waits for attach cleanup before asserting mock expectations.
Compatibility
- CLI behavior is intended to remain compatible with 1.1.0.
- Existing Docker, containerd, and Podman runtime behavior is intended to remain unchanged.
- This is mostly an internal architecture release, but it reduces risk for future runtime and CLI work.
Validation
Before release:
- Unit tests passed.
- Lint passed.
- Coverage test target passed.
- PR CI passed across lint, CodeQL, Docker integration, containerd integration, and Podman integration jobs.
Release 1.1.0
Pumba 1.1.0
First-class Podman runtime support plus dependency/lint/security hardening.
Podman runtime (#315)
New --runtime podman alongside docker and containerd. Pumba reuses the Docker SDK against Podman's Docker-compat socket and overrides only what diverges.
- Socket auto-detect:
$CONTAINER_HOST,$PODMAN_SOCK,podman machine inspect,/run/podman/podman.sock,$XDG_RUNTIME_DIR/podman/podman.sock. Override with--podman-socket. - Rootful required for netem/iptables/stress. Rootless is detected at client init from
Info.SecurityOptionsand fails fast with guidance (podman machine set --rootfulon macOS, rootful systemd unit on Linux). Rootless support is out of scope. - Cgroup resolution: parent/leaf derived host-side from
/proc/<pid>/cgroupof the target (Podman's defaultcgroupns=privatehides ancestry from inside). Pumba must run on the same kernel as the targets — on macOS, inside thepodman machineVM (same pattern as containerd-in-Colima). - Stress modes: both default child-cgroup and
--inject-cgroupsidecar modes work. The resolver handles Podman's nestedlibpod-<id>.scope/container/leaf (cgroup v2 "no internal processes" rule) and SELinux (label=disable). - Exec fix: switched all
ContainerExecStartcallsites toContainerExecAttach+ drain + inspect — Podman's compat API rejects emptyExecStartOptions{}that Docker accepts. - Sidecar cleanup: cleanup uses
context.WithoutCancel(ctx)with a 15 s timeout so SIGTERM to pumba during tc exec no longer leaks sidecars or leaves qdiscs on the target netns. SidecarStopSignal: SIGKILLto avoid Podman's 10 stail -fSIGTERM wait.
10 new bats suites under tests/podman_*.bats (lifecycle, stop/pause/rm, netem, iptables, stress, sidecar, combined, exec, global flags, error handling) and ~90% unit coverage on pkg/runtime/podman.
Maintenance (#311)
- Go 1.26 deps bumped: containerd v2.2.3, hcsshim v0.14.1, OpenTelemetry v1.43, grpc v1.80.0, docker/go-connections v0.7.0, plus x/{net,sync,sys,text}.
- GitHub Actions bumped to latest stable majors (checkout v6, setup-go v6, upload-artifact v7, build-push-action v7, etc.).
- Lint tightened: 47 → 65 active linters in
.golangci.yaml(noctx, contextcheck, fatcontext, perfsprint, testifylint, modernize, intrange, …). Fixes applied: cleanup contexts usecontext.WithoutCancel(ctx)with a timeout; Docker HTTP transport now honorsctxviaDialer.DialContext; 9fmt.Errorf→errors.Newcleanups. - Supply-chain hardening: Docker image builds flipped to
provenance: true+sbom: true. Image shipsFROM scratchwith staticCGO_ENABLED=0binary;govulncheckruns in CI. - Security & community files:
SECURITY.md(private vuln reporting), Dependabot (grouped weekly PRs), OpenSSF Scorecard workflow, issue/PR templates, CODEOWNERS, CODE_OF_CONDUCT.
Full Changelog: 1.0.6...1.1.0
Release 1.0.6
Pumba 1.0.6
Re-release of 1.0.5 to refresh published artifacts. No source changes since 1.0.5.
See the 1.0.5 notes for the underlying fix (gosec G118 / golangci-lint 2.11+).
Full Changelog: 1.0.5...1.0.6
1.0.5
Bug Fixes
- Fix golangci-lint 2.11+ checks (gosec G118, nolintlint) (#306)
- Move
defer cancel()inside goroutines so each goroutine owns its context lifecycle - Fix pre-existing closure capture bug in
iptables/loss.gowherectxwas reassigned each iteration but captured by closure - Remove stale
//nolint:revivedirective onpkg/util/util.go
- Move