For years I’ve been using my private git server. I started with Gogs, then moved to Gitea, and soon I’m updating to Forgejo. Initially, I only used it to store some non-public repositories (as private repos on GitHub were not free back then). However, for quite some time now, I’ve been using it to store the configuration of my personal servers. As a result, I needed a CI/CD system, and that’s where Woodpecker comes in.

Currently, I’m using an unreleased version of Woodpecker because of its support for native Kubernetes agents. Previously, running the agent as a pod, spinning job containers in Docker on the host caused some networking errors that I didn’t bother fixing since I knew that native support was coming soon.

K8s-agent configuration for k3s

Using it on k3s cluster, without any fancy PV driver, I only needed to specify storage class and disable RWX mode as it is not supported with local-path

1
2
WOODPECKER_BACKEND_K8S_STORAGE_CLASS: "local-path"
WOODPECKER_BACKEND_K8S_STORAGE_RWX: "false"

Simple job

Woodpecker YAML pipeline configuration format is simple, with only a few options, but it is (mostly) enough for my needs.

There is support for secrets stored in woodpecker, and I can limit jobs to specific branches/events. The only missing feature for me is the option to require user consent to proceed with pipeline. Although there is event: manual, but it’s only effective when pipeline was manually triggered.

Example pipeline to build hugo blog site:

1
2
3
4
5
6
7
pipeline:
  hugo-build:
    group: hugo
    image: klakegg/hugo:alpine-ci
    directory: src/
    commands:
      - hugo