Request an exact quote
CI/CD & DevOps migration path

From Jenkins to Woodpecker CI

Trading Jenkins' plugin maintenance and Groovy pipelines for container-native Woodpecker CI, converting pipelines to YAML, replacing plugins with steps, and migrating without freezing delivery.

Effort
Low
Est. timeline
~9 wks
Woodpecker CI model
Free (open source)
Open source
Yes
▶ Model your savings in the interactive calculator

Jenkins is free and ubiquitous, so this migration is not about a license, it is about maintenance burden. Plugin sprawl and version conflicts, Groovy pipelines and shared libraries that only one person fully understands, a steady stream of plugin security advisories, and the upkeep of controllers and agents all add up to real engineering time. Woodpecker CI, a lightweight, container-native CI engine (a community fork of Drone), takes the opposite approach: every step runs in a container, pipelines are simple YAML in the repo, and there is no plugin ecosystem to patch. If your Jenkins use is mostly “run these steps in containers on push”, Woodpecker is a clean, low-overhead replacement.

From installed plugins to container images

The shift that matters: in Jenkins, capability comes from installed plugins; in Woodpecker, capability comes from container images. Need Node, Go, Terraform, a Docker build, a cloud CLI? You reference an image that already has it instead of installing and maintaining a plugin. That single change is why the maintenance curve flattens, and it is also the main thing your pipeline conversion has to internalise.

Converting pipelines

Each repo gets a .woodpecker.yml describing its pipeline. The conversion from a Jenkinsfile is mostly mechanical once you map the concepts:

JenkinsWoodpecker
stages { stage('x') { steps { … } } }steps: with named entries
agent { docker { image '…' } }image: on each step
plugin step (e.g. withCredentials)secrets: referenced by the step
post { always { … } }a step with when: conditions
shared librarya reusable image or a small script in-repo

Groovy logic that did real branching is the part that needs thought, push it into scripts the step runs, rather than trying to recreate a Turing-complete pipeline in YAML. If a pipeline is mostly Groovy glue, that’s a signal it was doing too much in Jenkins; simplifying it is part of the win.

Retiring plugins one by one

Plugin sprawl is the tax you are leaving behind, so it pays to inventory it deliberately. List the plugins each pipeline actually invokes, then sort them into three piles. Tool plugins (a language runtime, a linter, a cloud CLI) map to an image that already carries the tool. Orchestration plugins (conditional execution, retries, notifications) map to step conditions, when: blocks, or a few lines of script. Exotic plugins that did something bespoke are the ones to question: often the cleanest conversion is to not carry the behavior across at all. Every plugin you retire is one fewer advisory to track and one fewer version conflict to untangle.

Standing up the server and moving secrets

Woodpecker is a server plus one or more agents, connected to your forge over OAuth. Stand up the server first, then register agents on compute that has a working container runtime. Credentials move out of the Jenkins credential store into Woodpecker secrets, scoped per org or repo, and are referenced explicitly by the steps that need them. This explicitness is a feature: it surfaces which jobs really depend on which secret, information that a shared Jenkins credential store tends to obscure. Keep secrets out of the committed YAML without exception.

A migration that doesn’t freeze delivery

  1. Stand up Woodpecker, the server plus one or more agents, and connect it to your forge (it integrates with Gitea/Forgejo, GitHub, GitLab).
  2. Move secrets out of Jenkins credentials into Woodpecker secrets (org/repo scoped); never inline them in YAML.
  3. Pilot one repo: add its .woodpecker.yml and run it in parallel with the existing Jenkins job, same triggers, compare outputs and artifacts.
  4. Convert in waves, simplest repos first, leaving the gnarliest Groovy pipelines until you understand the pattern.
  5. Freeze, then retire Jenkins, stop creating new Jenkins jobs once a repo is migrated, and decommission the controller after the last job moves.

Gotchas worth flagging

  • Build agents and Docker. Steps run in containers, so agents need a working container runtime and enough resources; size them for your concurrency.
  • Artifact and caching patterns differ. Jenkins archived artifacts and workspace caches map to Woodpecker volumes/caches or an external store (S3), design this rather than assuming workspace persistence.
  • Approvals and complex orchestration. Multi-pipeline gating and manual approvals are simpler in Woodpecker than in Jenkins; if you relied on heavy plugins for this, validate the equivalent early.
  • Scale ceiling. Woodpecker is deliberately lean. For very large, matrixed, multi-team estates, confirm it meets your concurrency and governance needs before committing the whole org.

Is the trade worth it?

Jenkins → Woodpecker trades a plugin-and-Groovy maintenance tax for container-native YAML pipelines that are far cheaper to keep running. Map plugins to images, push Groovy logic into scripts, and convert repo by repo while running both in parallel so delivery never stops. The payoff isn’t a license line, it’s reclaimed engineering time and a smaller security surface, so weigh it as operational cost-to-run in the calculator above, and keep Jenkins only where its heavier orchestration is genuinely required.

Tooling & automation for this path

Convert Jenkinsfile/Groovy pipelines to per-repo .woodpecker.yml; deploy the Woodpecker server and agents; move credentials to secrets; replace plugins with containerized steps; run pipelines in parallel before retiring the controller.

Primary references: official Woodpecker CI documentation ↗ and the Jenkins documentation ↗ , always verify version-specific behavior against them before you migrate.

Frequently asked questions

My Jenkinsfile uses a plugin for X. What replaces it in Woodpecker?

Woodpecker has no plugin registry; capability comes from container images instead. A plugin that provided a tool (a cloud CLI, a scanner, a build system) is replaced by a step that runs an image already containing that tool. A plugin that provided pure orchestration usually becomes a small script or a step condition. If a plugin was doing something exotic, that is a signal to simplify rather than to recreate it faithfully.

How do I convert Groovy logic and shared libraries in a Jenkinsfile?

Straightforward stages and steps map cleanly onto Woodpecker's steps and images. Real Groovy branching, loops, and shared-library calls should be pushed into scripts that a step runs, rather than reconstructed in YAML, which is not meant to be a programming language. Where a pipeline was mostly Groovy glue, treat the conversion as a chance to trim what Jenkins was doing too much of.

Where do Jenkins credentials go, and how do steps read them?

Move credentials out of the Jenkins credential store into Woodpecker secrets, scoped per org or per repo, and never inline them in the committed .woodpecker.yml. Steps reference them explicitly rather than having them ambiently available as withCredentials often did. Auditing which jobs actually needed which credential is a useful side effect of the move.

Can I migrate off Jenkins without freezing my delivery pipeline?

Yes, and you should. Add a repo's .woodpecker.yml alongside its existing Jenkins job and run both on the same triggers, comparing outputs and artifacts until Woodpecker is consistently green. Convert repos in waves, simplest first, and only decommission the Jenkins controller after the last job has moved. At no point does delivery depend on the migration being finished.

Model your 3-year cost

Pre-filled for Jenkins → Woodpecker CI; adjust every figure with your own numbers. Estimates are illustrative, not vendor quotes, see our methodology.

Sized at 200 users, cost is computed on this.
Stay on Jenkins (3yr)
$3,000
Move to Woodpecker CI (3yr + migration)
$37,800
Projected extra cost
$34,800 (1160%)
Payback period
1080.0 mo
Build a decision report from these numbers:

Illustrative, editable figures, not vendor pricing (defaults reviewed May 2026).

Request a vendor-accurate Woodpecker CI quote

A guided builder that turns your estimates into a requirements report (RFQ) you can send to a vendor, partner, or distributor for a binding quote, then feed the real prices back into the calculator above. How our estimates work.

  1. 1Size it
  2. 2Requirements
  3. 3Your details
  4. 4Channels & export

How big is your Jenkins estate?

Count the people who need accounts or seats. Not sure? Enter rough numbers, the distributor confirms exact counts later.

200 users
Default mid-size assumption (200 users)