Blog Update

Tulisan ini merupakan update lanjutan dari tulisan sebelumnya tentang bagaimana blog ini dibuat, notes ini merupakan kumpulan dari beberapa pencapain dalam Research n Dev pengembangan pada blog ini, Well mungkin bisa disebut pembaharuan blog dengan versi v.2.0 (Rofl! hahaha).

Berikut dibawah ini merupakan beberapa daftar notes perubahanya :

Pembaharuan Dockerfile

Bagian pertama lebih tepatnya tentang pembaharuan artifactory dari container yang secara pribadi berusaha menekan besarnya ukuran dari kontainer. Dari menggunakan base image keluarga debian:*^slim sampai proses penulisan yang dibuat secara multistage (kombinasi dari base builder alpine dan final write images menggunakan nginx:alpine). Dockerfile yang ditulis sebelumnya menggunakan base image yang terinspirasi dari monachus/hugo dan memakan ukuran sekitar ~150 MB++. Menurut dari laman dokumentasi Docker, salah satu cara terbaik menekan ukuran adalah dengan metode multistage dan mungkin kalian dapat mencari contoh untuk proses contoh penulisan multistage seperti dari blog.callr.tech , Hugo and Nginx multi-stage build Dockerfile .

Setelah mengimplementasikan multistage dan benar ukuranya turun drastis menjadi sekitar ~15MB (CMIIW lupa), namun yang menjadi sisi agak idealisme sendiri adalah 2 buah base image tersebut masih asli bawaan dari official dan tidak bisa melakukan tricky things!. Demi somethings tersebut, penulis memutuskan untuk tidak menggunakan multistage (bisa, namun mager kustomisasinya) dengan cara melakukan minify di tingkat file, direktori dan penambahan file .dockerignore agar file yang mungkin bersifat private dan bloat tidak ikut ke dalam proses build kontainernya. Dibawah ini merupakan isi file .dockerignore

.git
.gitignore
LICENSE
VERSION
README.md
Changelog.md
Makefile
docker-compose.yml
docs
public/

Kemudian untuk Dockerfile

FROM alpine:3.12.1
# Configuration variables
ENV HUGO_VERSION 0.78.2
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/ --minify
# By default, serve site
ENV HUGO_BASE_URL http://localhost:1313
CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0 --appendPort=false --disableFastRender --disableKinds=sitemap --disableLiveReload --minify
# A place where I write tricky and nothingtodo here!
---

Dan berikut ukuran dari kontainer setelah di build dengan ukuran akhir 19.07MB.

ss-dockerfile

Pembaharuan proses CI/CD

Salah satu hal yang berpengaruh ketika ukuran artifactory kontainer yang besar adalah kemungkinan lama juga proses building kontainer tersebut. Dari pembahasan bagian pertama diatas, menurut penulis dengan penerapan menggunakan base image alpine dan pengaplikasian .dockerignore sudah cukup. Bagian kedua ini adalah tweaking pada CI/CD dengan pengaplikasian fitur caching pada GitlabCI yang katanya dapat mempercepat proses build karena memanfaatkan sistem cache lapisan kontainer yang sudah dibuat sebelumnya.

Penambahan tweaking pada tahap deploy dalam kasus ini menyesuaikan dari perubahan sisi akses ssh ke Virtual Private Server dimana sebelum melakukan eksekusi deployment script, mengerjakan instalasi ssh client dan mendaftarkan kunci privat milik VPS. Berikut dibawah ini contoh file .gitlab-ci.yaml

stages:
  - build-image-push
  - deploy-to-server

docker build:
  stage: build-image-push
  only:
    - master
  script:
    - echo "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USERNAME" --password-stdin $CI_REGISTRY
    - docker pull $DOCKER_TAG_CACHE || true
    ## Add Cache
    - docker build --cache-from $DOCKER_TAG_CACHE -f Dockerfile-alp -t $DOCKER_TAG .
    - docker push $DOCKER_TAG && docker image rm $DOCKER_TAG_CACHE
    
deploy:
  stage: deploy-to-server
  image: ubuntu
  ## Add sec's things
  before_script:
    - 'which ssh-agent || ( apt-get update -qq && apt-get install -qq openssh-client sshpass -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIV_KEY")
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  script:
    - ./deploy.sh

Pembaharuan runtime pada Docker Engine

Tahap terakhir salah satu yang menjadi concern penulis ngulik saat ini adalah tentang runtime pada dunia kontainer dan mungkin akan bersambung ke tulisan-tulisan selanjutnya. Runtime yang digunakan untuk menjalankan kontainer blog ini adalah gVisor dan so far menambah kinerja konsumsi ram sekitar ~100MB pada VPS 🤣🤣🤣🤣.

$ cat inspect.json | jq | grep runsc
      "Runtime": "runsc",

Thanks!