Hugo static and Gitlab-ci

Build this blog

Dikarenakan sudah mulai bingung dan gabut di depan laptop (stuck ngoprek soalnya). Mulailah iseng buat bikin blog tapi yang agak rumit ga sekedar klik n run. Awalnya dulu sempat tertarik dengan Jekyll - static site dengan bahasa Ruby. Ngulik-ngulik lagi dan ternyata ada static site yang basic bahasanya menggunakan bahasa GO (agak interest sih).

Hugo combine with Docker

Fase ini sudah mulai mencoba dev hugo secara lokal di laptop, dan memikirkan gimana kalau Hugo-nya di pack ke dalam bentuk container dengan docker ?. Cari-cari dari Dockerhub dan menemukan image ini monachus/hugo . Baca-baca dokumentasi yang lumayan lengkap di reponya, dengan susunan tree project yang sama seperti di link tersebut. Berikut merupakan contoh Dockerfile yang digunakan untuk build hugo and docker.

FROM alpine:3.12.0

# Install pygments (for syntax highlighting) 
RUN apk add --update --no-cache git asciidoctor libc6-compat libstdc++ ca-certificates

# Configuration variables
ENV HUGO_VERSION 0.74.3
ENV SITE_DIR '/usr/share/blog'

# Download and install hugo
RUN wget -O - https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.tar.gz | tar -xz -C /tmp \
    && mkdir -p /usr/local/sbin \
    && mv /tmp/hugo /usr/local/sbin/hugo \
    && rm -rf /tmp/hugo_${HUGO_VERSION}_Linux-64bit.tar.gz \
    && rm -rf /tmp/LICENSE.md \
    && rm -rf /tmp/README.md

WORKDIR ${SITE_DIR}

# Expose default hugo port
EXPOSE 1313

# Automatically build site
ADD site/ ${SITE_DIR}
RUN hugo -d /usr/share/nginx/html/

# By default, serve site
ENV HUGO_BASE_URL http://localhost:1313
CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0

Automate with Gitlab-ci

Source code repository yang digunakan dalam project ini adalah Gitlab. Karena di Gitlab sendiri untuk free-usernya dapat membuat private repo dan mempunyai fitur CI/CD didalamnya. Fitur CI/CD yang ada di dalam Gitlab ini yang dimanfaatkan untuk membangun blog ini sampai ke deploy ke VPS. Alur pipelinenya seperti ini : Pipeline

Jadi ketika ada commit dan push ke dalam repo Gitlab, maka akan men-trigger si Gitlab runner untuk melakukan job yang sudah di set atau di tentukan di dalam file .gitlab-ci.yml.

Contoh .gitlab-ci.yml

image: docker:stable
services:
  - docker:dind
variables:
  DOCKER_TAG: <your repository>
stages:
  - build-image-push
  - deploy-to-server
docker build:
  stage: build-image-push
  only:
    - master
  script:
    - docker info
    - docker build -t $DOCKER_TAG .
    - echo "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USERNAME" --password-stdin
    - docker push $DOCKER_TAG && docker image rm $DOCKER_TAG
deploy:
  stage: deploy-to-server
  image: alpine:latest
  before_script:
    - apk update && apk add openssh-client bash sshpass
  script:
    - ./deploy.sh

Dari script .gitlab-ci.yml diatas, terdapat 2 stages yaitu build-image-push dan deploy-to-server dan ketika di menu CI/CD Gitlab 2 stages tersebut berubah menjadi 2 jobs. Jadi dalam 1 Pipeline terdapat 2 Jobs. pipelinenjobs

Thanks!