Add CI #1
36
.gitea/workflows/build.yaml
Normal file
36
.gitea/workflows/build.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Build and deploy
|
||||
run-name: 🚀
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
Build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Login to container registry
|
||||
uses: https://github.com/docker/login-action@v3
|
||||
with:
|
||||
registry: https://git.vanespen.dev
|
||||
username: ${{ secrets.USERNAME }}
|
||||
password: ${{ secrets.PASSWORD }}
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- name: Set up Docker Buildx
|
||||
uses: https://github.com/docker/setup-buildx-action@v3
|
||||
- name: Build and push
|
||||
uses: https://github.com/docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
pull: true
|
||||
no-cache: true
|
||||
tags: "git.vanespen.dev/evanespen/blog:latest"
|
||||
- name: Setup Kubectl
|
||||
run: |
|
||||
mkdir ~/.kube
|
||||
echo '${{ secrets.KUBECONFIG }}' > ~/.kube/config
|
||||
export COMMIT_REF=$(git rev-parse HEAD)
|
||||
echo $COMMIT_REF
|
||||
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
|
||||
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
|
||||
sed -i "s/COMMIT_REF/$COMMIT_REF/g" argo.template.yaml
|
||||
/usr/local/bin/kubectl apply --validate=false -f argo.template.yaml
|
||||
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
FROM archlinux as builder
|
||||
|
||||
RUN pacman -Syy \
|
||||
&& pacman -S --noconfirm go dart-sass icu
|
||||
|
||||
COPY . /app
|
||||
WORKDIR /app
|
||||
|
||||
RUN go run .
|
||||
|
||||
FROM nginx:alpine
|
||||
|
||||
RUN rm -rf /usr/share/nginx/html/
|
||||
|
||||
COPY --from=builder /app/build/ /usr/share/nginx/html/
|
||||
|
||||
EXPOSE 80
|
||||
@@ -54,7 +54,7 @@ This is a personal blog built with Go, using the go-org library to parse Org-mod
|
||||
- [ ] footer
|
||||
- [ ] resume page
|
||||
- [ ] contact page
|
||||
- [ ] responsive
|
||||
- [X] responsive
|
||||
- [ ] RSS
|
||||
- [ ] favicon
|
||||
- [ ] search
|
||||
|
||||
43
argo.template.yaml
Normal file
43
argo.template.yaml
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: AppProject
|
||||
metadata:
|
||||
name: blog
|
||||
namespace: argocd
|
||||
spec:
|
||||
description: Project for the blog application
|
||||
sourceRepos:
|
||||
- https://git.vanespen.dev/evanespen/blog
|
||||
destinations:
|
||||
- namespace: blog
|
||||
server: https://kubernetes.default.svc
|
||||
clusterResourceWhitelist:
|
||||
- group: "*"
|
||||
kind: "*"
|
||||
namespaceResourceWhitelist:
|
||||
- group: "*"
|
||||
kind: "*"
|
||||
syncWindows: []
|
||||
roles: []
|
||||
|
||||
---
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: blog-argo
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: blog
|
||||
source:
|
||||
repoURL: "https://git.vanespen.dev/evanespen/blog"
|
||||
targetRevision: COMMIT_REF
|
||||
path: "k8s"
|
||||
destination:
|
||||
server: "https://kubernetes.default.svc"
|
||||
namespace: blog
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
syncOptions:
|
||||
- CreateNamespace=true
|
||||
@@ -1,3 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
export BLOG_ENV=dev
|
||||
watchexec --restart -w ./ --no-process-group -- go run .
|
||||
|
||||
47
k8s/deploy.yaml
Normal file
47
k8s/deploy.yaml
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: blog-pod
|
||||
namespace: blog
|
||||
labels:
|
||||
app: blog-pod
|
||||
spec:
|
||||
containers:
|
||||
- name: blog-container
|
||||
image: git.vanespen.dev/evanespen/blog:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: blog-service
|
||||
namespace: blog
|
||||
spec:
|
||||
selector:
|
||||
app: blog-pod
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
type: ClusterIP
|
||||
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: blog-ingressroute
|
||||
namespace: blog
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
- match: Host(`vanespen.dev`)
|
||||
kind: Rule
|
||||
services:
|
||||
- name: blog-service
|
||||
port: 80
|
||||
tls:
|
||||
certResolver: letsencrypt_dns
|
||||
14
parse.go
14
parse.go
@@ -27,6 +27,7 @@ type Post struct {
|
||||
Content *org.Document // Parsed content of the post
|
||||
ReadTime uint8 // Estimated reading time in minutes
|
||||
Hero string // URL path to the hero image for the post
|
||||
Draft bool // Is the article a draft (will not be rendered if so)
|
||||
}
|
||||
|
||||
// listPosts reads the posts directory and returns a slice of Post structs.
|
||||
@@ -49,7 +50,13 @@ func listPosts() ([]Post, error) {
|
||||
if err != nil {
|
||||
log.Println("[!] Unable to parse ", filePath)
|
||||
} else {
|
||||
posts = append(posts, post)
|
||||
if post.Draft {
|
||||
if os.Getenv("BLOG_ENV") == "dev" {
|
||||
posts = append(posts, post)
|
||||
}
|
||||
} else {
|
||||
posts = append(posts, post)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,6 +110,10 @@ func parseOrg(filePath string) (Post, error) {
|
||||
slug := orgData.Get("SLUG")
|
||||
tags := strings.Split(orgData.Get("TAGS"), ", ")
|
||||
hero := path.Join("/medias", orgData.Get("HERO"))
|
||||
draft := true
|
||||
if orgData.Get("DRAFT") == "false" {
|
||||
draft = false
|
||||
}
|
||||
|
||||
date, _ := time.Parse("2006-01-02", dateStr)
|
||||
ts := date.Unix()
|
||||
@@ -123,5 +134,6 @@ func parseOrg(filePath string) (Post, error) {
|
||||
Content: orgData,
|
||||
ReadTime: uint8(readTime),
|
||||
Hero: hero,
|
||||
Draft: draft,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -48,13 +48,13 @@ func compileSCSS() (string, error) {
|
||||
|
||||
transpiler, err := godartsass.Start(godartsass.Options{})
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Fatal("cannot start transpiler: ", err)
|
||||
}
|
||||
|
||||
css, err := transpiler.Execute(args)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Fatal("cannot compile SCSS: ", err)
|
||||
}
|
||||
|
||||
log.Println("CSS compiled")
|
||||
|
||||
Reference in New Issue
Block a user