Added Docker image support with CD pipeline for PyPI and container registry publishing.
CI / Formatting (push) Successful in 6s
CI / Linting (push) Successful in 4s
CI / Tests (Python 3.12) (push) Successful in 19s
CI / Tests (Python 3.13) (push) Successful in 20s
CI / Tests (Python 3.14) (push) Successful in 17s
CI / Type Checking (push) Successful in 8s
CI / Spelling (push) Successful in 5s
CD / Publish Package (push) Successful in 23s
CD / Publish Image (push) Successful in 55s

This commit is contained in:
2026-03-04 16:26:02 -05:00
parent 7bb1c67735
commit 05daa6c218
4 changed files with 159 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# CI / repo metadata
.gitea/
.gitmodules
docs/
# Development / IDE
.venv/
venv/
.idea/
.vscode/
*.swp
*.swo
# Runtime data (bind-mounted, not baked in)
data/
logs/
modules/
config.yaml
# Build artifacts
dist/
build/
*.egg-info/
__pycache__/
*.py[cod]
# Tests and quality tooling
tests/
.coverage
.pytest_cache/
# AI assistant files
CLAUDE.md
AGENTS.md
# Docker build files
Dockerfile
.dockerignore
+63
View File
@@ -0,0 +1,63 @@
name: CD
on:
push:
tags: ["v*"]
jobs:
publish-package:
name: Publish Package
runs-on: logaldeveloper-archlinux
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Cache uv packages
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/.cache/uv
key: uv-${{ hashFiles('uv.lock') }}
- name: Install dependencies
run: uv sync
- name: Build package
run: uv build
- name: Publish package
run: uv publish
env:
UV_PUBLISH_TOKEN: ${{ secrets.REGISTRY_PASSWORD }}
publish-image:
name: Publish Image
runs-on: logaldeveloper-archlinux
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
with:
driver-opts: network=host
- name: Log in to Gitea Container Registry
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
with:
registry: git.logal.dev
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push image
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
with:
context: .
network: host
push: true
tags: |
git.logal.dev/logaldeveloper/owlbot:${{ gitea.ref_name }}
git.logal.dev/logaldeveloper/owlbot:latest
+42
View File
@@ -0,0 +1,42 @@
FROM git.logal.dev/logaldeveloper/ci-base:latest AS build
ENV UV_LINK_MODE=copy \
UV_PYTHON_DOWNLOADS=never \
UV_PROJECT_ENVIRONMENT=/app/.venv
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --no-dev --frozen --no-install-project
COPY . .
RUN uv sync --no-dev --frozen --no-editable
FROM archlinux:base
LABEL org.opencontainers.image.title="Owlbot" \
org.opencontainers.image.description="A modular, event-driven chat bot for Owncast" \
org.opencontainers.image.url="https://git.logal.dev/LogalDeveloper/Owlbot" \
org.opencontainers.image.source="https://git.logal.dev/LogalDeveloper/Owlbot" \
org.opencontainers.image.documentation="https://git.logal.dev/LogalDeveloper/Owlbot/wiki" \
org.opencontainers.image.vendor="Logan Fick" \
org.opencontainers.image.authors="Logan Fick" \
org.opencontainers.image.licenses="Apache-2.0" \
org.opencontainers.image.base.name="archlinux:base"
RUN echo 'Server = https://mirrors.logal.dev/archlinux/$repo/os/$arch' > /etc/pacman.d/mirrorlist \
&& pacman -Syu --noconfirm ffmpeg python \
&& yes | pacman -Scc
RUN useradd --uid 1000 --user-group --create-home owlbot
WORKDIR /app
COPY --from=build --chown=owlbot:owlbot /app/.venv /app/.venv
RUN mkdir -p data modules \
&& chown owlbot:owlbot /app /app/data /app/modules
ENV PATH="/app/.venv/bin:$PATH"
USER owlbot
VOLUME ["/app/data", "/app/modules"]
EXPOSE 8081
ENTRYPOINT ["owlbot"]
CMD ["--host", "0.0.0.0"]
+16
View File
@@ -0,0 +1,16 @@
services:
owlbot:
image: git.logal.dev/logaldeveloper/owlbot:latest
restart: unless-stopped
ports:
- "8081:8081"
volumes:
# Copy config.example.yaml to config.yaml and fill in your values.
- ./config.yaml:/app/config.yaml:ro
# Place custom module files in this directory.
- ./modules:/app/modules
# Persistent storage for module data.
- data:/app/data
volumes:
data: