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/