From 1571f2a25edbc4dbb182942f68d8086c21f4c45e Mon Sep 17 00:00:00 2001 From: Adam Montgomery Date: Fri, 14 Nov 2025 16:11:07 -0700 Subject: [PATCH] Add in the app and workflow --- .gitea/workflows/build-container.yaml | 31 +++++++++++++ Containerfile | 13 ++++++ main.go | 67 +++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 .gitea/workflows/build-container.yaml create mode 100644 Containerfile create mode 100644 main.go diff --git a/.gitea/workflows/build-container.yaml b/.gitea/workflows/build-container.yaml new file mode 100644 index 0000000..00909fd --- /dev/null +++ b/.gitea/workflows/build-container.yaml @@ -0,0 +1,31 @@ +name: Build Cat Web App Container + +on: + push: + branches: + - main + +jobs: + build: + runs-on: gitea-runner + steps: + - name: Checkout code + run: | + git clone https://gitea.montgomeryspot.com/myorg/myrepo.git + cd myrepo + + - name: Build container image + run: | + cd myrepo + podman build -f Containerfile -t myorg/catapp:latest . + + # Optional: Push to registry +# - name: Push to registry +# env: +# REGISTRY_USER: ${{ secrets.REGISTRY_USER }} +# REGISTRY_PASS: ${{ secrets.REGISTRY_PASS }} +# run: | +# podman login myregistry.example.com -u $REGISTRY_USER -p $REGISTRY_PASS +# podman tag myorg/catapp:latest myregistry.example.com/myorg/catapp:latest +# podman push myregistry.example.com/myorg/catapp:latest + diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..a7862ea --- /dev/null +++ b/Containerfile @@ -0,0 +1,13 @@ +# Stage 1: Build the Go binary +FROM golang:1.21-alpine AS builder +WORKDIR /app +COPY . . +RUN go build -o catapp . + +# Stage 2: Minimal runtime image +FROM alpine:latest +WORKDIR /app +COPY --from=builder /app/catapp . +EXPOSE 8080 +CMD ["./catapp"] + diff --git a/main.go b/main.go new file mode 100644 index 0000000..433df9f --- /dev/null +++ b/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" + "html/template" +) + +type CatAPIResponse []struct { + URL string `json:"url"` +} + +var tpl = template.Must(template.New("index").Parse(` + + + + +Random Cat Meme + + + +

Random Cat Meme

+ + + + +`)) + +func main() { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + tpl.Execute(w, nil) + }) + + http.HandleFunc("/cat", func(w http.ResponseWriter, r *http.Request) { + resp, err := http.Get("https://api.thecatapi.com/v1/images/search") + if err != nil { + http.Error(w, "Failed to fetch cat image", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + var catResp CatAPIResponse + if err := json.NewDecoder(resp.Body).Decode(&catResp); err != nil { + http.Error(w, "Failed to decode API response", http.StatusInternalServerError) + return + } + + if len(catResp) == 0 { + http.Error(w, "No cat image found", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"url": catResp[0].URL}) + }) + + log.Println("Starting server on :8080") + log.Fatal(http.ListenAndServe(":8080", nil)) +} +