Skip to content

About

Lightweight CI/CD pipeline server with a built-in agent — integrates with Gitea, GitHub, and GitLab for automated builds and deployments.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Woodpecker CI

Build Status Last Commit OCI Pulls

Lightweight CI/CD pipeline server with a built-in agent — integrates with Gitea, GitHub, and GitLab for automated builds and deployments.

Port 8000
Registry ghcr.io/daemonless/woodpecker
Source https://github.com/woodpecker-ci/woodpecker
Website https://woodpecker-ci.org/

Version Tags

Tag Description Best For
latest Upstream Binary. Built from official release. Most users — recommended.

Parts

Service Image Role
woodpecker-server ghcr.io/daemonless/woodpecker:latest docs
woodpecker-agent ghcr.io/daemonless/woodpecker:latest docs

Prerequisites

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.

Deployment

Podman Compose

1. Save as .env and fill in what is empty:

# Woodpecker CI for FreeBSD (Daemonless)
# Copy to .env and edit. Forge settings (WOODPECKER_GITEA=true,
# WOODPECKER_GITEA_URL, client id/secret ...) go in here too; the server reads
# this file. See https://woodpecker-ci.org/docs/administration/configuration/server

# External URL of this server (what browsers and the forge use)
WOODPECKER_HOST=http://localhost:8000

# Shared secret between server and agent. Change this, e.g. `openssl rand -hex 32`
WOODPECKER_AGENT_SECRET=change-me-to-a-long-random-string

# Where data lives on the host
SERVER_DATA_LOCATION=/containers/woodpecker/server
AGENT_DATA_LOCATION=/containers/woodpecker/agent

# Timezone (TZ identifier)
# TZ=UTC

2. Save as compose.yaml:

name: woodpecker

services:
  woodpecker-server:
    image: ghcr.io/daemonless/woodpecker:latest
    container_name: woodpecker-server
    restart: unless-stopped
    network_mode: host
    environment:
      - WOODPECKER_SERVER_ENABLE=true
      - WOODPECKER_HOST=${WOODPECKER_HOST}
      - WOODPECKER_DATABASE_DRIVER=sqlite3
      - WOODPECKER_DATABASE_DATASOURCE=/config/woodpecker.sqlite
      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
      - PUID=1000
      - PGID=1000
      - TZ=${TZ:-UTC}
    env_file:
      - .env
    volumes:
      - ${SERVER_DATA_LOCATION}:/config
    ports:
      - "8000:8000"
      - "9000:9000"

  woodpecker-agent:
    image: ghcr.io/daemonless/woodpecker:latest
    container_name: woodpecker-agent
    restart: unless-stopped
    network_mode: host
    depends_on:
      - woodpecker-server
    environment:
      - WOODPECKER_AGENT_ENABLE=true
      - WOODPECKER_SERVER=localhost:9000
      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
      - PUID=1000
      - PGID=1000
      - TZ=${TZ:-UTC}
    volumes:
      - ${AGENT_DATA_LOCATION}:/config

Then run podman-compose up -d.

AppJail Director

.env:

# .env

DIRECTOR_PROJECT=woodpecker
WOODPECKER_SERVER_ENABLE=true
WOODPECKER_HOST=http://localhost:8000
WOODPECKER_DATABASE_DRIVER=sqlite3
WOODPECKER_DATABASE_DATASOURCE=/config/woodpecker.sqlite
WOODPECKER_AGENT_SECRET=change-me-to-a-long-random-string
PUID=1000
PGID=1000
TZ=UTC
SERVER_DATA_LOCATION=/containers/woodpecker/server
AGENT_DATA_LOCATION=/containers/woodpecker/agent
WOODPECKER_AGENT_ENABLE=
WOODPECKER_GITEA=
WOODPECKER_GITEA_URL=

appjail-director.yml:

# appjail-director.yml

options:
  - alias:
  - ip4_inherit:
services:
  woodpecker:
    name: woodpecker
    options:
      - container: 'args:--pull'
      - expose: '8000:8000 proto:tcp'
      - expose: '9000:9000 proto:tcp'
    oci:
      user: root
      environment:
        - WOODPECKER_SERVER_ENABLE: !ENV '${WOODPECKER_SERVER_ENABLE}'
        - WOODPECKER_HOST: !ENV '${WOODPECKER_HOST}'
        - WOODPECKER_DATABASE_DRIVER: !ENV '${WOODPECKER_DATABASE_DRIVER}'
        - WOODPECKER_DATABASE_DATASOURCE: !ENV '${WOODPECKER_DATABASE_DATASOURCE}'
        - WOODPECKER_AGENT_SECRET: !ENV '${WOODPECKER_AGENT_SECRET}'
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - SERVER_DATA_LOCATION: !ENV '${SERVER_DATA_LOCATION}'
        - AGENT_DATA_LOCATION: !ENV '${AGENT_DATA_LOCATION}'
        - WOODPECKER_AGENT_ENABLE: !ENV '${WOODPECKER_AGENT_ENABLE}'
        - WOODPECKER_GITEA: !ENV '${WOODPECKER_GITEA}'
        - WOODPECKER_GITEA_URL: !ENV '${WOODPECKER_GITEA_URL}'
    volumes:
      - woodpecker: /config
  woodpecker-agent:
    name: woodpecker_agent
    options:
      - from: ghcr.io/daemonless/woodpecker:latest
      - template: !ENV '${PWD}/template.conf'
    oci:
      environment:
        - WOODPECKER_AGENT_ENABLE: "true"
        - WOODPECKER_SERVER: "localhost:9000"
        - WOODPECKER_AGENT_SECRET: !ENV '${WOODPECKER_AGENT_SECRET}'
        - PUID: "1000"
        - PGID: "1000"
        - TZ: !ENV '${TZ}'
    volumes:
      - agent_data: /config
volumes:
  woodpecker:
    device: '/containers/woodpecker'
  agent_data:
    device: !ENV '${AGENT_DATA_LOCATION}'

Makejail:

# Makejail

ARG tag=latest

OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/woodpecker:${tag}

Save the files above, then run appjail-director up.

Warning

Exposing ports in AppJail means that your service can be reached from remote hosts. If that is not your intention, do not expose the ports and communicate with the service using the jail's IPv4 address or hostname assigned by the virtual network.

To avoid exposing ports, just remove the expose option in your appjail-director.yml or from your command-line arguments.

Access at: http://localhost:8000

Parameters

Environment Variables

Variable Default Description
WOODPECKER_SERVER_ENABLE true Enable Woodpecker Server (true/false)
WOODPECKER_HOST http://localhost:8000 The external URL of this server, e.g. https://ci.example.com
WOODPECKER_DATABASE_DRIVER sqlite3 Database driver (sqlite3 or postgres)
WOODPECKER_DATABASE_DATASOURCE /config/woodpecker.sqlite Database connection string or file path
WOODPECKER_AGENT_SECRET change-me-to-a-long-random-string Shared secret for server-agent communication
PUID 1000
PGID 1000
TZ UTC Timezone for the containers
SERVER_DATA_LOCATION /containers/woodpecker/server Path to store the server's data (database, logs)
AGENT_DATA_LOCATION /containers/woodpecker/agent Path to store the agent's data
WOODPECKER_AGENT_ENABLE `` Enable Woodpecker Agent (true/false)
WOODPECKER_GITEA `` Enable Gitea authentication (true/false)
WOODPECKER_GITEA_URL `` The URL of the Gitea server

Volumes

Path Description
/config Data directory (database, logs)

Ports

Port Protocol Description
8000 TCP Server Web UI/API
9000 TCP GRPC (Server/Agent communication)

Architectures: amd64 User: bsd (UID/GID via PUID/PGID, defaults to 1000:1000) Base: FreeBSD 15.1


Need help? Join our Discord community.

About

Lightweight CI/CD pipeline server with a built-in agent — integrates with Gitea, GitHub, and GitLab for automated builds and deployments.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages