Website review
This review may include AI-generated content and is not individually verified. Domain, certificate and other facts come from the observed data on this page.
What is Woodpecker CI?
Woodpecker CI is an open-source continuous integration and delivery (CI/CD) engine that runs your build, test, and deployment pipelines inside Docker containers. It is designed to be simple to set up but extensible: when a plain Docker image isn't enough for a pipeline step, you can write plugins to add functionality.
The container-based approach is the key design choice. Each pipeline step executes in its own container, which keeps builds isolated and reproducible, and means anything you can package as a Docker image can become a step in your workflow. Woodpecker also supports multiple workflows per project, and those workflows can depend on one another, so you can model sequences like "build, then test, then deploy" or fan out into parallel jobs.
Who it tends to suit
- Teams that already think in Docker and want CI configuration that maps cleanly onto containers.
- Self-hosters who want to run CI on their own infrastructure rather than a hosted service.
- Projects that need custom pipeline behavior and are willing to build small plugins for it.
Trade-offs to weigh
- Because it is self-hosted and open-source, you (or your team) are responsible for running and maintaining the server and runners.
- Plugin-based extensibility is powerful but means non-standard steps require extra work compared with a large marketplace of ready-made actions.
- If you want a fully managed service with zero operational overhead, a hosted CI product will usually be less effort.
A useful next step
Pick one small repository and try modeling its current build as a single Woodpecker workflow with two or three container steps. If the steps map cleanly to images you already use, Woodpecker is likely a good fit; if you find yourself needing many custom plugins for basic tasks, that's a signal to compare it against alternatives such as GitHub Actions or GitLab CI/CD before committing.
How does Woodpecker CI compare to other CI/CD tools like Jenkins or GitLab CI?
Woodpecker CI positions itself as a lightweight, container-native alternative to heavier CI/CD platforms. Its own description emphasizes three things: it is open-source and free, it executes pipeline steps in Docker containers, and it supports plugins and multiple interdependent workflows. Compared with Jenkins and GitLab CI, the main differences are in setup effort, ecosystem breadth, and how tightly the tool is bound to a code-hosting platform.
How the three differ in practice
| Aspect | Woodpecker CI | Jenkins | GitLab CI |
|---|---|---|---|
| Execution model | Docker containers for pipeline steps | Agents with plugins; containers optional | Runners executing jobs, often in containers |
| Extensibility | Plugins built as container images | Very large plugin ecosystem | CI/CD components, templates and integrations |
| Configuration | Pipeline defined per project, supports multiple workflows | Jobs defined in Jenkinsfiles or UI | .gitlab-ci.yml in the repository |
| Platform fit | Standalone, works with common Git hosts | Standalone, host-agnostic | Deepest integration with GitLab itself |
| Typical trade-off | Simpler and lighter, smaller ecosystem | Maximum flexibility, more maintenance | Convenient if you already use GitLab |
What this means for different teams
For a small team already comfortable with Docker, Woodpecker's container-based steps and plugin model keep pipelines portable and easy to reason about. The multi-workflow support is useful when a project needs separate pipelines that depend on one another, such as build, then test, then deploy.
Jenkins remains the choice when you need to orchestrate unusual environments, legacy build tools, or a very specific plugin that only exists there. The cost is operational: someone has to maintain the controller and agents.
GitLab CI is strongest when your repositories already live on GitLab, because configuration, runners and permissions are managed in one place. If you use GitLab but want a lighter runner model, comparing Woodpecker's container steps against GitLab runners is a reasonable exercise.
A practical next step
Pick one real pipeline from your current setup, such as "build, run tests, push an image." Rewrite it in Woodpecker's model and note how many plugins or custom scripts you needed. If the answer is "one or two container images," Woodpecker is likely a good fit; if it is "a dozen third-party plugins," Jenkins or GitLab CI may save you more time. You can review the project and its documentation at Woodpecker CI.
How do I install and set up Woodpecker CI for my project?
Woodpecker CI is a self-hosted, container-based CI/CD engine, so "installation" means two things: running the Woodpecker server and agent on a machine you control, then connecting it to your Git repository. It is free and open source, and pipeline steps run as Docker containers, which is what makes setup feel familiar if you already write Dockerfiles or Compose files.
The setup path
- Pick a host. A small VPS or an internal server is typical. You need Docker (or a compatible container runtime) available, since pipeline steps execute in containers.
- Choose your Git forge. Woodpecker integrates with Git hosting providers; you enable OAuth on the forge side and give Woodpecker the client ID and secret so it can read repositories and report build status.
- Run the server. The server handles the web UI, API, and scheduling. You expose it on a domain with TLS, and configure the forge connection and a shared secret for agents.
- Run at least one agent. The agent does the actual work: it receives pipeline jobs from the server and launches the container steps. You can run agents on the same machine or add more later for capacity.
- Activate a repository. In the Woodpecker UI, enable the repo you want to build. From that point, pushes and pull requests trigger pipelines.
- Add a pipeline file. Commit a
.woodpecker.yml(or the equivalent file name in your chosen configuration) to the repository root describing your steps, for example install dependencies, run tests, build an image.
A concrete first pipeline
A minimal starting point for a typical web project looks like this in shape: a step that pulls a language runtime image, a step that installs dependencies, and a step that runs the test command. Once that is green, add a step that builds and pushes a container image, and a deploy step that runs only on your main branch. Woodpecker's multi-workflow support lets you split these into separate workflows that can depend on one another, so a deploy workflow can wait for a test workflow to succeed.
Decisions worth making early
| Decision | Why it matters |
|---|---|
| Where the server runs | Public reachability is needed for forge webhooks; internal-only hosts require extra networking work |
| How many agents | One agent is fine to start; more agents mean parallel jobs and less queueing |
| Docker socket access | Steps that build images often need it, but it widens what a pipeline can do on the host |
| Secrets handling | Registry credentials and deploy keys belong in Woodpecker secrets, not in the pipeline file |
When this fits, and when it doesn't
Woodpecker suits teams that want CI on their own hardware, want to avoid per-minute billing, and are comfortable running a service. The trade-off is that you own upgrades, backups, agent capacity, and uptime. If nobody on the team wants to maintain a server, a hosted CI service will be less work.
For exact commands, environment variables, and forge-specific OAuth steps, follow the official documentation at Woodpecker CI rather than adapting instructions written for other CI systems.
How do I create and configure a pipeline in Woodpecker CI?
A Woodpecker pipeline is defined in a YAML file named .woodpecker.yml (or .woodpecker.yaml) placed in the root of your repository. Each step in the pipeline runs inside a Docker container, so configuring a pipeline mostly means choosing an image and listing the commands that step should execute.
The basic shape of a pipeline
A minimal pipeline has a pipeline block, one or more named steps, and for each step an image and a commands list:
pipeline:
test:
image: node:20
commands:
- npm install
- npm test
Woodpecker reads this file when a relevant event occurs in the repository, then schedules each step as a container. Steps run in the order you list them; if a command fails, the pipeline stops by default.
Events, conditions and multiple workflows
You control when a pipeline runs with conditions rather than a separate config file per branch. A step or whole pipeline can be limited to events such as push, pull_request, tag or manual. This is the usual way to separate "run tests on every pull request" from "build and publish an image only on tags."
Woodpecker also supports multiple workflows in one file. Each workflow is its own block with its own steps, and workflows can depend on each other, so you can express things like "deploy only after both the test and lint workflows succeed." That is the feature to reach for when a single linear list of steps becomes hard to read.
Extending steps with plugins
If a plain Docker image is not enough, you can use or write a plugin. Plugins are themselves container images that receive settings from your YAML, which keeps common tasks (publishing, notifications, caching, deployments) short in the pipeline file instead of a long shell script. This is the main extensibility path described for the project.
A practical first setup
- Add
.woodpecker.ymlto the repository root with one step that installs dependencies and runs your test command. - Push a branch and open a pull request to confirm the pipeline is triggered and the container runs.
- Add a condition so heavier steps (builds, deploys) only run on tags or on the default branch.
- Split unrelated concerns into separate workflows once the file grows, and use workflow dependencies to keep ordering correct.
- Move repeated shell logic into a plugin or a shared script when the same block appears in several pipelines.
Choosing between approaches
| Approach | Best for | Trade-off |
|---|---|---|
| Single pipeline, several steps | Small projects, one clear build-and-test path | Gets long and slow as the project grows |
| Conditions on steps | Branch- or tag-specific behaviour | Conditions can become hard to trace in a large file |
| Multiple workflows with dependencies | Parallel jobs, staged deploys | More structure to maintain and reason about |
| Plugins | Reusable tasks across projects | You depend on the plugin's image and its settings |
If you are evaluating whether Woodpecker fits your team, the deciding factor is usually how much you value a lightweight, container-based engine you can self-host and extend, versus a hosted service with a larger built-in marketplace. For the exact syntax of conditions, workflow dependencies and plugin settings, check the project's documentation at Woodpecker CI before writing a large config, since these details are version-sensitive.
How can I write a custom plugin for Woodpecker CI?
Write a plugin as a Docker container that reads Woodpecker's environment variables, does one job, and exits with a status code: 0 for success, non-zero for failure. Woodpecker runs each pipeline step as a container, so anything you can package as an image can be a plugin.
What a Woodpecker plugin actually is
There is no separate plugin SDK or registration step described on Woodpecker CI. A plugin is a Docker image your pipeline calls as a step. Woodpecker injects configuration through environment variables, so your container's entrypoint reads those variables and performs the task.
Practical steps
- Write a small program or shell script that reads its settings from environment variables (for example
PLUGIN_MESSAGE,PLUGIN_WEBHOOK_URL). - Package it in a Dockerfile with an
ENTRYPOINTthat runs your script. - Publish the image to a registry your Woodpecker instance can pull from.
- Reference it in
.woodpecker.ymlas a step, passing settings assettings:keys, which Woodpecker maps toPLUGIN_*variables. - Test with a dry run or a throwaway branch, and make failures loud via exit codes and stderr output.
Design decisions that matter
- Statelessness: keep the container self-contained; don't rely on files persisting between steps unless you use a shared workspace volume.
- Secrets: read tokens from Woodpecker secrets rather than baking them into the image.
- Idempotency: a retried step should be safe to run twice, especially if it posts comments or deploys.
- Log clarity: log the action and the outcome, but never the secret values.
- Image size: a slim base image speeds up every pipeline run that uses the plugin.
Example shape
steps:
- name: notify
image: your-registry/woodpecker-notify:1.0.0
settings:
webhook_url: https://example.com/hook
message: "Build finished"
Woodpecker turns webhook_url into PLUGIN_WEBHOOK_URL inside the container.
When this is the right approach
Build a custom plugin when an existing image doesn't cover your task, when you need your own credentials or API logic, or when several projects should share the same step. If a shell command in a standard image already does the job, a one-line step is simpler and easier to maintain.
Next step: scaffold the smallest possible plugin — a container that prints its PLUGIN_* variables — run it once, then add real logic.
How does Woodpecker CI handle multiple workflows and dependencies between them?
Woodpecker CI supports multiple workflows per project, and those workflows can be set to depend on one another. The project describes this as a core capability: you can “easily create multiple workflows for your project” and they “can even depend on each other.” That means a pipeline can be split into separate units rather than one long sequence, with execution order controlled where needed.
In practice, this matters when a project has distinct stages that should not all run together or all block each other. A typical setup might separate build, test, and deploy into different workflows, then let deploy wait on the earlier ones. Because Woodpecker runs pipeline steps in Docker containers, each workflow can use the image and tooling its stage needs, and plugins can extend what a step does when a plain image is not enough.
A useful way to think about the trade-off:
- One workflow: simplest to read and debug, but every step runs in one chain, so a slow or failing early step holds up everything after it.
- Multiple independent workflows: faster feedback because they can run in parallel, but you must manage more configuration and decide what happens when one fails.
- Multiple dependent workflows: gives you ordered stages and clear gates, but adds coordination complexity and can lengthen total run time when dependencies are strict.
For a concrete scenario: a small web app might use one workflow for linting and unit tests that run in parallel, then a separate deploy workflow that depends on both. If the tests fail, deploy never starts. If you only need a quick check on a pull request, independent workflows give you results sooner.
Next step: sketch your pipeline as stages, mark which stages truly must wait for others, and group only those into dependent workflows. Keep everything else parallel. The Woodpecker docs are the right place to confirm the exact syntax for defining workflows and their dependencies before you commit to a structure.
User reviews (0)