Compare commits

...

2 Commits

Author SHA1 Message Date
b3d6e53e58 Merge pull request 'Add in the app and workflow' (#1) from initial-app into main
Some checks failed
Build Cat Web App Container / build (push) Has been cancelled
Reviewed-on: #1
2025-11-14 23:15:58 +00:00
1571f2a25e Add in the app and workflow 2025-11-14 16:11:07 -07:00
3 changed files with 111 additions and 0 deletions

View File

@@ -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

13
Containerfile Normal file
View File

@@ -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"]

67
main.go Normal file
View File

@@ -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(`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Random Cat Meme</title>
<script>
async function getCat() {
const res = await fetch('/cat');
const data = await res.json();
document.getElementById('catImage').src = data.url;
}
</script>
</head>
<body>
<h1>Random Cat Meme</h1>
<img id="catImage" src="" style="max-width:500px; display:block; margin-bottom:10px;">
<button onclick="getCat()">Get a new cat</button>
</body>
</html>
`))
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))
}