3 min read

Deploy Mudah dengan bantuan Watchtower

Beberapa waktu lalu ingin belajar mengenai “devops”, walau terlalu keren kalau disebut devops. Intinya sekadar ingin kalau push code di git, di server keganti, itu aja dulu cukup. Awalnya pake cara sederhana pakai git pull, alurnya seperti berikut:

1. git clone dulu di server
2. Simpan ssh key/ .pem di environtment gitlab ( saya pakai gitlab )
3. bikin gitlab-ci.yml
4. bikin script jika ada commit ke master si gitlab ssh ke server dan pull kode

Terus kata teman itu kurang bagus kalau ssh-ssh ke server gitu, kenapa gak kodenya dijadikan image docker terus pakai watchtower untuk deteksi perubahan image, jadi gak perlu ssh ke server. Kurang lebih sarannya begitu.

Docker image

Pertama buat dulu docker image dari aplikasi yang akan dibuat, dan simpan di root aplikasi, ini contoh Dockerfile aplikasi Django saya:

FROM python:3.6-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir -p /code

WORKDIR /code 
COPY requirements.txt /code 
RUN pip install --upgrade pip
RUN \
  apk add --no-cache postgresql-libs bash && \
  apk add --no-cache --virtual .build-deps postgresql-dev gcc musl-dev && \
  pip install --no-cache-dir -r requirements.txt && \
  apk --purge del .build-deps


# copy current dir's content to container's WORKDIR root i.e. all the contents of the web app
COPY . /code/

Selanjutnya silahkan push ke repo.

Gitlab Container Registry

Ternyata gitlab memiliki layanan container registry yang lumayan besar, kapasitas 10 giga, padahal akun saya free, bandingkan dengan di aws yang free cuma diberi kapasitas 500 mega saja.

Pertama agar bisa berkomunikasi dengan gitlab kita perlu login dahulu:

$ docker login registry.gitlab.com

Silahkan login dengan username dan password gitlab terdaftar.

Membuat image

Untuk membuat image yang ada di repo gunakan perintah berikut:

docker build -t registry.gitlab.com/username/repo .

Menyimpan di Registry

Untuk menyimpan hasil image tadi gunakan perintah berikut:

docker push registry.gitlab.com/username/repo

Untuk melihat layanan image kita, buka repo lihat di bagian menu samping ada menu package -> container registry, kita akan menemukan image yang telah dibuat tadi di halaman ini:

Watchtower

Untuk mengetahui apa itu watchtower silahkan kunjungi saja website resminya saya di sini hanya menggunakan wtachtower untuk media auto deploy.

Saya menggunkana docker-compose agar lebih mudah, dan tentu saja ini digabung dengan aplikasi django saya, berikut kurang lebih isi dari docker-compose saya

```
version: '3.6'

services:
  db:
    image: postgres:10-alpine
    environment:
      - POSTGRES_DB=nama-database
      - POSTGRES_USER=user-database
      - POSTGRES_PASSWORD=password-database
    ports:
      - 5432:5432
    volumes:
      - ./db/postgre:/var/lib/postgresql/data
  web:
    image: registry.gitlab.com/username/repo:latest
    command: >
      bash -c "python manage.py migrate &&
      gunicorn myproject.wsgi -b 0.0.0.0:8000"
    ports:
      - 80:8000
    environment:
      - DEBUG=1
      - SECRET_KEY=key-django
      - DATABASE_ENGINE=django.db.backends.postgresql_psycopg2
      - DATABASE_NAME=database-name
      - DATABASE_USER=database-user
      - DATABASE_PASSWORD=password-database
      - DATABASE_HOST=db
      - DATABASE_PORT=5432
    depends_on:
      - db
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /path/to/docker/config.json:/config.json
    command: --interval 30
```

Simpan docker-compose ini di server, lalu jalankan dengan perintah.

docker-compose up -d

Karena watchtower akan mengambil image terbaru dari registry yang disediakan, jangan lupa di server untuk login terlebih dahulu akun docker nya ke registry yang terdaftar.

Gitlab Runner (CI/CD)

Agar setiap perubahan di master auto deploy ke server maka kita perlu tambahkan berkas .gitlab-ci.yml di root repo, dengan adanya berkas ini secara otomatis akan menjalankan fitur CI/CD dari gitlab.

Isi dari .gitlab-ci.yml

stages:
  - build

building:
  stage: build
  image: docker:stable
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t registry.gitlab.com/username/repo .
    - docker push registry.gitlab.com/username/repo  
  only:
    - master

Variable $CI_REGISTRY_USER, $CI_REGISTRY_PASSWORD, dan $CI_REGISTRY itu adalah variable yang sudah disiapkan gitlab, gak perlu konfig apa-apa lagi. Perintah selanjutnya hanya pengulangan dari yang di atas. Kode di atas hanya dieksekusi saat ada perubahan ke branch master.

Untuk mengetes silahkan lakukan perubahan apapun dan commit ke master, jika berhasil image di server akan diperbaharui dengan image yang terbaru.

Referensi:
https://forum.gitlab.com/t/push-docker-image-to-gitlab-registry-from-gitlab-ci/16288/3
https://containrrr.github.io/watchtower/usage-overview/