GitHub

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-action hit already_exists and silently skipped binary upload. Workflow now sets allowUpdates: true and artifactErrorsFailBuild: true to fail loudly on upload errors.

CI / Dependencies

  • bump actions/upload-artifact v4 → v7, github/codeql-action v3 → 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

  • --limit now works on netem and iptables — the parsers always read --limit but the flag was never declared on either parent command, so user-supplied values silently became 0. 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/pause actions 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 --duration earlier in parsing instead of letting it reach the runtime.

Refactor (internal)

  • chaos.RunOnContainers fanout 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 chaos cmd/*.go files into a uniform shape (flag list + typed ParamParser[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.Flags adapter decouples chaos parsers from urfave/cli v1, isolating the future v3 migration to a single file.
  • pkg/runtime/podman package documents the Docker SDK embedding invariant and the cgroup leaf-naming gotchas (libpod-<id>.scope/container).
  • util.ValidateInterfaceName centralizes the network-interface regex previously duplicated across netem and iptables parsers.
  • cmd/main.go split into 5 focused per-concern files (each ≤ 200 LOC): main.go, runtime.go, logging.go, flags.go, commands.go.
  • pkg/runtime/docker/sidecar.go consolidates tc and iptables sidecar lifecycle (create → start → exec → force-remove) into one helper. Sidecar StopSignal: "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.01 in tests and CI prepull steps. Floating :latest left stale 0.20.00 cached locally, which lacks /cg-inject and silently skipped the inject-cgroup test. The contract is now enforced (fail, not skip).
  • Unit coverage gains: pkg/chaos 69% → 98.5%, pkg/chaos/lifecycle 82.6% → 100%. Adds focused tests for ParseGlobalParams, lifecycle constructors, and the context.WithoutCancel cleanup path that runs on SIGTERM during stop/pause.

Compatibility

  • No API or CLI breaking changes. All existing pumba invocations continue to work.
  • Docker SDK pinned at v28.5.2; containerd SDK v2; Go 1.26; urfave/cli v1 (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-coverage now runs under Bash, matching its use of pipefail.
  • 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.SecurityOptions and fails fast with guidance (podman machine set --rootful on macOS, rootful systemd unit on Linux). Rootless support is out of scope.
  • Cgroup resolution: parent/leaf derived host-side from /proc/<pid>/cgroup of the target (Podman's default cgroupns=private hides ancestry from inside). Pumba must run on the same kernel as the targets — on macOS, inside the podman machine VM (same pattern as containerd-in-Colima).
  • Stress modes: both default child-cgroup and --inject-cgroup sidecar modes work. The resolver handles Podman's nested libpod-<id>.scope/container/ leaf (cgroup v2 "no internal processes" rule) and SELinux (label=disable).
  • Exec fix: switched all ContainerExecStart callsites to ContainerExecAttach + drain + inspect — Podman's compat API rejects empty ExecStartOptions{} 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. Sidecar StopSignal: SIGKILL to avoid Podman's 10 s tail -f SIGTERM 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 use context.WithoutCancel(ctx) with a timeout; Docker HTTP transport now honors ctx via Dialer.DialContext; 9 fmt.Errorferrors.New cleanups.
  • Supply-chain hardening: Docker image builds flipped to provenance: true + sbom: true. Image ships FROM scratch with static CGO_ENABLED=0 binary; govulncheck runs 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.go where ctx was reassigned each iteration but captured by closure
    • Remove stale //nolint:revive directive on pkg/util/util.go

Read the original on github.com ↗