diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..c2473d9 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -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 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..08141cf --- /dev/null +++ b/Dockerfile @@ -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 diff --git a/README.md b/README.md index 7a38140..3a7ede2 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/argo.template.yaml b/argo.template.yaml new file mode 100644 index 0000000..8b0d4c8 --- /dev/null +++ b/argo.template.yaml @@ -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 diff --git a/build-dev.sh b/build-dev.sh index e120402..2183f08 100755 --- a/build-dev.sh +++ b/build-dev.sh @@ -1,3 +1,4 @@ #!/bin/bash +export BLOG_ENV=dev watchexec --restart -w ./ --no-process-group -- go run . diff --git a/build.sh b/build.sh index a1be35d..6bda2da 100755 --- a/build.sh +++ b/build.sh @@ -1,3 +1,4 @@ #!/bin/bash +rm -rf build go run . diff --git a/k8s/deploy.yaml b/k8s/deploy.yaml new file mode 100644 index 0000000..b2bd37e --- /dev/null +++ b/k8s/deploy.yaml @@ -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 diff --git a/parse.go b/parse.go index 2025c4e..ee266d2 100644 --- a/parse.go +++ b/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 } diff --git a/styles.go b/styles.go index d08153e..b86d47c 100644 --- a/styles.go +++ b/styles.go @@ -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")