Compare commits

...

8 Commits

Author SHA1 Message Date
b5d9e10786 Merge branch 'main' of gitea.montgomeryspot.com:adam/cat-memes
All checks were successful
Build Cat Web App Container / build (push) Successful in 14s
2025-11-14 16:50:30 -07:00
cd11a4113f Add go.mod 2025-11-14 16:48:31 -07:00
e6c65689ab Update .gitea/workflows/build-container.yaml
Some checks failed
Build Cat Web App Container / build (push) Failing after 2s
2025-11-14 23:43:35 +00:00
442a22b07b Update .gitea/workflows/build-container.yaml
Some checks failed
Build Cat Web App Container / build (push) Has been cancelled
2025-11-14 23:37:34 +00:00
50f6ea7fad Update .gitea/workflows/build-container.yaml
Some checks failed
Build Cat Web App Container / build (push) Failing after 26s
2025-11-14 23:25:36 +00:00
eebb31becb Update .gitea/workflows/build-container.yaml
Some checks failed
Build Cat Web App Container / build (push) Has been cancelled
2025-11-14 23:20:28 +00:00
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
4 changed files with 114 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
name: Build Cat Web App Container
on:
push:
branches:
- main
jobs:
build:
runs-on: podman
steps:
- name: Checkout code
run: |
git clone https://gitea.montgomeryspot.com/adam/cat-memes.git
cd cat-memes
- name: Build container image
run: |
cd cat-memes
podman build -f Containerfile -t adam/cat-memes: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"]

3
go.mod Normal file
View File

@@ -0,0 +1,3 @@
module catapp
go 1.21

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))
}