feat: initial mdBook setup with CI/CD
Some checks failed
books / docker (push) Failing after 16s
books / deploy (push) Has been skipped

- mdBook structure
- Multi-image Docker build
- Deploy to books.softwarehuset.com
This commit is contained in:
Djohn 2026-02-07 11:03:35 +01:00
parent 98d32b5f16
commit f8d7067ea0
No known key found for this signature in database
11 changed files with 231 additions and 0 deletions

77
.forgejo/workflows/ci.yml Normal file
View file

@ -0,0 +1,77 @@
# books
name: books
on:
push:
branches: [main]
pull_request:
env:
REGISTRY: code.core.ci/softwarehuset
IMAGES: |
./Dockerfile|books|.
jobs:
docker:
name: docker
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to registry
run: echo "${{ secrets.FORGEJO_TOKEN }}" | docker login code.core.ci -u djohn --password-stdin
- name: Build & Push images
run: |
set -e
if [ "${{ github.event_name }}" = "pull_request" ]; then
TAG="pr-${{ github.event.number }}"
else
TAG="${{ github.sha }}"
fi
IS_MAIN="${{ github.ref == 'refs/heads/main' }}"
echo "${{ env.IMAGES }}" | grep -v '^[[:space:]]*$' | while IFS='|' read -r dockerfile image context; do
dockerfile=$(echo "$dockerfile" | xargs)
image=$(echo "$image" | xargs)
context=$(echo "$context" | xargs)
[ -z "$dockerfile" ] && continue
FULL_IMAGE="${{ env.REGISTRY }}/${image}"
echo "🐳 Building: ${FULL_IMAGE}:${TAG}"
docker build -f "${dockerfile}" -t "${FULL_IMAGE}:${TAG}" "${context}"
docker push "${FULL_IMAGE}:${TAG}"
if [ "$IS_MAIN" = "true" ]; then
docker tag "${FULL_IMAGE}:${TAG}" "${FULL_IMAGE}:latest"
docker push "${FULL_IMAGE}:latest"
fi
done
deploy:
name: deploy
needs: [docker]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
container:
image: bitnami/kubectl:1.31
steps:
- name: Checkout
env:
TOKEN: ${{ secrets.FORGEJO_TOKEN }}
run: |
cd /tmp && git clone --depth=1 "https://djohn:${TOKEN}@code.core.ci/${{ github.repository }}.git" repo
- name: Deploy
env:
KUBECONFIG_DATA: ${{ secrets.KUBE_CONFIG }}
run: |
echo "$KUBECONFIG_DATA" | base64 -d > /tmp/kubeconfig
export KUBECONFIG=/tmp/kubeconfig
cd /tmp/repo/k8s/prod
kubectl kustomize . | kubectl apply -f -
kubectl -n books set image deployment/books web=${{ env.REGISTRY }}/books:${{ github.sha }}
kubectl -n books rollout status deployment/books --timeout=120s

20
Dockerfile Normal file
View file

@ -0,0 +1,20 @@
# Build stage
FROM rust:1.75-alpine AS builder
RUN apk add --no-cache musl-dev
RUN cargo install mdbook --version 0.4.40
WORKDIR /book
COPY book.toml .
COPY src/ src/
RUN mdbook build
# Runtime stage
FROM nginx:alpine
COPY --from=builder /book/book /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

13
book.toml Normal file
View file

@ -0,0 +1,13 @@
[book]
title = "Softwarehuset Books"
authors = ["Softwarehuset"]
language = "da"
src = "src"
[build]
build-dir = "book"
[output.html]
default-theme = "light"
preferred-dark-theme = "navy"
git-repository-url = "https://code.core.ci/softwarehuset/books"

38
k8s/base/deployment.yaml Normal file
View file

@ -0,0 +1,38 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: books
spec:
replicas: 1
selector:
matchLabels:
app: books
template:
metadata:
labels:
app: books
spec:
containers:
- name: web
image: books
ports:
- containerPort: 80
resources:
requests:
memory: "32Mi"
cpu: "10m"
limits:
memory: "64Mi"
cpu: "100m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5

23
k8s/base/ingress.yaml Normal file
View file

@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: books
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: traefik
tls:
- hosts:
- books.softwarehuset.com
secretName: books-tls
rules:
- host: books.softwarehuset.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: books
port:
number: 80

View file

@ -0,0 +1,17 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- ingress.yaml
labels:
- pairs:
app: books
includeSelectors: true
images:
- name: books
newName: code.core.ci/softwarehuset/books
newTag: latest

10
k8s/base/service.yaml Normal file
View file

@ -0,0 +1,10 @@
apiVersion: v1
kind: Service
metadata:
name: books
spec:
ports:
- port: 80
targetPort: 80
selector:
app: books

View file

@ -0,0 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: books
resources:
- ../base

7
src/README.md Normal file
View file

@ -0,0 +1,7 @@
# Softwarehuset Books
Dokumentation og guides fra Softwarehuset.
## Indhold
- **Guides** - Kom i gang med vores projekter

7
src/SUMMARY.md Normal file
View file

@ -0,0 +1,7 @@
# Summary
[Introduction](./README.md)
# Guides
- [Getting Started](./getting-started.md)

12
src/getting-started.md Normal file
View file

@ -0,0 +1,12 @@
# Getting Started
Velkommen til Softwarehuset.
## Forudsætninger
- Git
- Docker
## Næste skridt
Udforsk vores repos på [code.core.ci/softwarehuset](https://code.core.ci/softwarehuset).