@@ -0,0 +1,49 @@
|
|||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: harbor.furynrage.com
|
||||||
|
IMAGE: harbor.furynrage.com/demo-app/app
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to Zot
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Compute tag
|
||||||
|
id: tag
|
||||||
|
run: echo "sha=$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Build & push
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE }}:${{ steps.tag.outputs.sha }}
|
||||||
|
${{ env.IMAGE }}:latest
|
||||||
|
|
||||||
|
- name: Trivy scan
|
||||||
|
uses: aquasecurity/trivy-action@0.24.0
|
||||||
|
with:
|
||||||
|
image-ref: ${{ env.IMAGE }}:${{ steps.tag.outputs.sha }}
|
||||||
|
format: table
|
||||||
|
severity: CRITICAL,HIGH
|
||||||
|
exit-code: '0' # для демо не падаем, только репорт
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
FROM golang:1.22-alpine AS build
|
||||||
|
WORKDIR /src
|
||||||
|
COPY go.mod ./
|
||||||
|
RUN go mod download
|
||||||
|
COPY *.go ./
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o /out/app .
|
||||||
|
|
||||||
|
FROM gcr.io/distroless/static-debian12:nonroot
|
||||||
|
COPY --from=build /out/app /app
|
||||||
|
EXPOSE 8080
|
||||||
|
USER nonroot
|
||||||
|
ENTRYPOINT ["/app"]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# demo-app (template для Gitea repo)
|
||||||
|
|
||||||
|
Это template-копия. На Gitea Actions нужно работать в **Gitea**, поэтому:
|
||||||
|
|
||||||
|
1. В Gitea (https://git.furynrage.com) создай repo `admin/demo-app` (private или public).
|
||||||
|
2. Локально:
|
||||||
|
```bash
|
||||||
|
mkdir ~/demo-app-gitea && cd ~/demo-app-gitea
|
||||||
|
git init
|
||||||
|
cp -r ~/Desktop/Personal/developer-platform/apps/demo-app/. .
|
||||||
|
git add . && git commit -m "init"
|
||||||
|
git remote add origin https://git.furynrage.com/admin/demo-app.git
|
||||||
|
git push -u origin main
|
||||||
|
```
|
||||||
|
(basic auth — admin + пароль из `.secrets-gitea-admin.txt`)
|
||||||
|
3. В Gitea → Settings → Secrets and Variables → Actions добавь:
|
||||||
|
- `REGISTRY_USER` = `ci-pusher`
|
||||||
|
- `REGISTRY_PASSWORD` = из `.secrets-zot.txt`
|
||||||
|
4. Push в `main` → workflow `.gitea/workflows/build.yml` запустится автоматически.
|
||||||
|
|
||||||
|
Результат:
|
||||||
|
- образ `harbor.furynrage.com/demo-app/app:<sha>` появится в Zot UI
|
||||||
|
- Trivy scan покажется в logs job'а
|
||||||
|
- ArgoCD Image Updater подхватит новый тег и задеплоит в namespace `demo-app`
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var version = os.Getenv("APP_VERSION")
|
||||||
|
|
||||||
|
type status struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if version == "" {
|
||||||
|
version = "dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
_ = json.NewEncoder(w).Encode(status{Status: "ok", Version: version})
|
||||||
|
})
|
||||||
|
|
||||||
|
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
_, _ = w.Write([]byte("ok"))
|
||||||
|
})
|
||||||
|
|
||||||
|
addr := ":8080"
|
||||||
|
log.Printf("listening on %s, version=%s", addr, version)
|
||||||
|
log.Fatal(http.ListenAndServe(addr, nil))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user