Lightweight CI

Lightweight Self-Hosted CI Systems

Drone 203,393 popularized pipelines that run every step in its own container. After version 0.8 its license changed from Apache 2.0 to a proprietary one; Drone is now managed by Harness 11,207 under the PolyForm Small Business license, and github.com/drone/drone redirects to Harness's open-source platform, github.com/harness/harness (https://github.com/harness/harness 38,450 ). In April 2019 the community forked Drone 0.8 as Woodpecker CI 438,520 (github.com/woodpecker-ci/woodpecker (https://github.com/woodpecker-ci/woodpecker 7,918 ), Apache-2.0, v3.18.1 of 8 September 2026): a small Go server that talks to Gitea 3,896 , Forgejo 16,221 , GitHub 29 , GitLab 377 or Bitbucket 2,046 , and agents that run each step in a container. Gitea and Forgejo Actions (Gitea and Forgejo) are the other lightweight choice, reusing GitHub Actions 29 ' YAML.

Woodpecker's command-line tool can run a pipeline file locally with no server, which makes it easy to try on BookNest:

.woodpecker.yaml: a PostgreSQL service and one Node.js stepYAML
services:
  - name: db
    image: postgres:18
    environment:
      POSTGRES_USER: booknest
      POSTGRES_PASSWORD: booknest
      POSTGRES_DB: booknest
steps:
  - name: test
    image: node:24-alpine
    environment:
      PGHOST: db
    commands:
      - npm ci --no-audit --no-fund
      - until nc -z db 5432; do sleep 1; done
      - npm test
Running the pipeline with woodpecker-cli execShell
cd ~/v5-ch5/work/g13/wp     # BookNest's main (git archive) plus .woodpecker.yaml
start=$SECONDS
docker run --rm --name l2-woodpecker --group-add $(stat -c %g /var/run/docker.sock) \
  -v /var/run/docker.sock:/var/run/docker.sock -v "$PWD":"$PWD" -w "$PWD" \
  woodpeckerci/woodpecker-cli:v3.18.1 exec .woodpecker.yaml 2>&1 | grep '^\[test' | cut -c1-90
echo "took $((SECONDS - start)) s"
Output
[test:L0:0s] + npm ci --no-audit --no-fund
...
[test:L2:2s] added 82 packages in 3s
[test:L3:2s] + until nc -z db 5432; do sleep 1; done
[test:L4:2s] + npm test
...
[test:L17:3s] ✔ GET / serves the static front end (13.217701ms)
[test:L18:3s] ℹ tests 9
...
[test:L20:3s] ℹ pass 9
...
took 7 s

The same nine tests passed in 7 seconds on the shared 4-CPU host, PostgreSQL 1,289 included. The pipeline file is plain YAML without Groovy or plugins, and the CLI image is 100 MB. The trade-off is the ecosystem: Woodpecker's plugins are simply container images, with no equivalent of Jenkins 8,793 ' matrix security, shared libraries or thousands of integrations.