init: hello-cicd project setup
Some checks failed
CI/CD Pipeline / build (push) Has been cancelled
CI/CD Pipeline / deploy (push) Has been cancelled

This commit is contained in:
2026-04-14 10:37:48 +02:00
commit 13a5b94ac1
6 changed files with 144 additions and 0 deletions

71
.gitea/workflows/ci.yml Normal file
View File

@@ -0,0 +1,71 @@
# .gitea/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
env:
REGISTRY: git.fpmoz.sum.ba
IMAGE: git.fpmoz.sum.ba/${{ github.repository }}
jobs:
# ── JOB 1: Build i Push Docker image ──────────────────
build:
runs-on: ubuntu-latest
steps:
- name: Checkout koda
uses: actions/checkout@v4
- name: Login u Gitea registry
run: |
echo ${{ secrets.REGISTRY_PASS }} | \
docker login $REGISTRY \
-u ${{ secrets.REGISTRY_USER }} --stdin
- name: Build i Push image
run: |
TAG=${{ github.sha }}
docker build -t $IMAGE:$TAG -t $IMAGE:latest .
docker push $IMAGE:$TAG
docker push $IMAGE:latest
echo $TAG > tag.txt
- name: Spremi image tag
uses: actions/upload-artifact@v4
with:
name: image-tag
path: tag.txt
# ── JOB 2: Deploy na k3s ───────────────────────────────
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout koda
uses: actions/checkout@v4
- name: Preuzmi image tag
uses: actions/download-artifact@v4
with:
name: image-tag
- name: Postavi kubeconfig
run: |
mkdir -p ~/.kube
echo "${{ secrets.KUBE_CONFIG }}" | base64 -d > ~/.kube/config
chmod 600 ~/.kube/config
- name: Update image tag u manifestu
run: |
TAG=$(cat tag.txt)
sed -i "s|image:.*|image: $IMAGE:$TAG|" k8s/deployment.yaml
- name: Deploy na k3s
run: |
kubectl apply -f k8s/
kubectl rollout status deployment/hello-cicd \
-n student-${{ github.actor }} --timeout=120s

14
Dockerfile Normal file
View File

@@ -0,0 +1,14 @@
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENV APP_VERSION=dev
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

28
k8s/deployment.yaml Normal file
View File

@@ -0,0 +1,28 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-cicd
namespace: student-fsusak03
spec:
replicas: 1
selector:
matchLabels:
app: hello-cicd
template:
metadata:
labels:
app: hello-cicd
spec:
imagePullSecrets:
- name: gitea-creds
containers:
- name: hello-cicd
image: git.fpmoz.sum.ba/fsusak03/hello-cicd:latest
ports:
- containerPort: 8000
env:
- name: APP_VERSION
value: "latest"
resources:
requests: {cpu: 50m, memory: 64Mi}
limits: {cpu: 200m, memory: 128Mi}

12
k8s/service.yaml Normal file
View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: hello-cicd-svc
namespace: student-fsusak03
spec:
selector:
app: hello-cicd
ports:
- port: 80
targetPort: 8000
type: NodePort

17
main.py Normal file
View File

@@ -0,0 +1,17 @@
# main.py
from fastapi import FastAPI
import os, datetime
app = FastAPI()
@app.get("/health")
def health():
return {
"status": "ok",
"version": os.getenv("APP_VERSION", "dev"),
"timestamp": datetime.datetime.utcnow().isoformat()
}
@app.get("/")
def root():
return {"poruka": "Zdravo s k3s!", "host": os.uname().nodename}

2
requirements.txt Normal file
View File

@@ -0,0 +1,2 @@
fastapi==0.115.0
uvicorn==0.32.0