“Gua gabisa docker…”

Fannyah Dita Cahya
PPL cewe semua!
Published in
4 min readApr 17, 2019

Yak itu kalimat pertama yang muncul saat dikenalkan dengan docker pada suatu siang di kelas yang dipimpin oleh Pak Adin. Kenapa gabisa? Ya.. intinya laptop saya jadoel tidak memenuhi persyaratan masuk geng Windows 10 Pro. Hiks, sad.

gemes, cek deh di https://www.docker.com/

Apa itu Docker?

Docker adalah platform untuk mempermudah developers untuk membuat, men-deploy, dan menjalankan aplikasi. Docker dapat membantu developers untuk mengembangkan suatu proyek. Developers dapat memberi tahu apa saja yang dibutuhkan untuk menjalankan suatu program yang dibuat. Bahasa pemrograman, dependencies, dan sebagainya. Jadi hal ini dapat menyelaraskan development team, segala perbedaan OS, text editor, dan lain-lain.

Istilah pada Docker

  • Docker Image

template yang akan digunakan pada docker container. Template ini dibuat berdasarkan dockerfile seperti contoh di bawah ini.

# Dockerfile 
# FROM directive instructing base image to build upon
FROM python:3.5-slim
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code
RUN pip install -r requirements.txt
COPY . /code COPY start.sh /code CMD ["./start.sh"]
  • Docker Container

Container akan berjalan diatas image, sehingga setiap perubahan yang disimpan pada continer akan membentuk layer baru di atas base image.

https://www.docker.com/resources/what-container

Nah, hal ini berbeda dengan cara kerja Virtual Machine. Virtual Machine akan mangalokasikan OS untuk mengerjakan 1 aplikasi, sementara untuk Docker Container menggunakan 1 Host — shared — OS. Hal ini akan menghemat resource.

Membuat container baru dapat dilakukan dengan menjalankan perintah berikut :

docker build -t registry.docker.ppl.cs.ui.ac.id/pplb3/db-baru:latest .
#push image
docker push registry.docker.ppl.cs.ui.ac.id/pplb3/db-baru:latest
#run
docker run -it -p 22301:22302 registry.docker.ppl.cs.ui.ac.id/pplb3/db-baru:latest
  • docker-compose.yml : adalah yang akan mengatur bagaimana container bekerja. Sederhananya, kita berikan list perintah apa saja yang harus si docker ini lakukan agar supaya program yang kita buat berjalan dengan sempurna.
version: '2'services:
db:
image: registry.docker.ppl.cs.ui.ac.id/pplb3/postgres:latest
ports:
- "22301:5432"
web:
environment:
- SECRET_KEY=!1&^)#v8uy(1_8)1e!9kx$fp306*6183f-5^r&(twq7@_umre0
- DJANGO_ENV=STAGING
- DB_HOST=152.118.201.222
- DB_NAME=postgres
- DB_USER=docker
- DB_PASS=docker
- DB_PORT=22301
- DB_URL=django.db.backends.postgresql
image: registry.docker.ppl.cs.ui.ac.id/pplb3/api-development:latest
command: ./start.sh
ports:
- "22300:22302"
depends_on:
- db
  • Docker Registry : tempat disimpannya image yang dibuat.

DEPLOYMENT

Nah, Deployment bisa dilakukan secara manual atau dari gitlab. Jadi pengen cerita, suatu hari di sprint 2 kami pernah sempat pusing sendiri. Karena setelah beberapa minggu docker tidak bermasalah, suatu ketika kami (aka geng kosong Hadlina Rahmadinni Firandra Savitri) membuat perubahan pada models sehingga bentuk table dan tipe data yang disimpan berbeda dari sebelumnya. Hal ini ternyata “mengotak-atik” docker sehingga bentuk models local dan yang sudah di deploy berbeda. WUSHHH, kurang dari 6 jam menuju sprint review hal ini masih menjadi masalah yang utama karena… ya gimana apa yang mau di deliver, hiks sedih. Akhirnya, keputusan yang dibuat adalah, kita deploy secara manual. Caranya adalah dengan :

docker build -t  . registry.docker.ppl.cs.ui.ac.id/pplb3/<nama-image>:latest
docker push registry.docker.ppl.cs.ui.ac.id/pplb3/<nama-image>:latest

Tapi kalau sekarang udah normal lagi, jadinya deployment akan dikerjakan otomatis oleh gitlab. Tinggal bikin .gitlab-ci.yml sekali untuk selamanya.

stages:
- build
- test
- staging
- development

variables:
ANDROID_COMPILE_SDK: "27"
ANDROID_BUILD_TOOLS: "28.0.2"
ANDROID_SDK_TOOLS: "4333796"

assembleDebug:
image: openjdk:8-jdk
stage: build
before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export ANDROID_HOME=$PWD/android-sdk-linux
- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
- set -o pipefail
script:
- cd sumbangin_android
- chmod +x ./gradlew
- ./gradlew clean assembleDebug
artifacts:
paths:
- $CI_PROJECT_DIR/sumbangin_android/app/build/outputs/apk/
except:
- master
- sit_uat

assembleRelease:
image: openjdk:8-jdk
stage: build
before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export ANDROID_HOME=$PWD/android-sdk-linux
- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
- set -o pipefail
script:
- cd sumbangin_android
- chmod +x ./gradlew
- ./gradlew clean assembleRelease
artifacts:
paths:
- $CI_PROJECT_DIR/sumbangin_android/app/build/outputs/apk/
only:
- sit_uat

testBackend:
image: python:latest
stage: test
script:
- pip3 install -r requirements.txt
- cd sumbangin_backend
- python3 manage.py makemigrations api
- python3 manage.py migrate api
- python3 manage.py collectstatic
- coverage run --include='api/*' manage.py test
- coverage report -m

testAndroid:
image: jangrewe/gitlab-ci-android
stage: test
script:
- cd sumbangin_android
- chmod +x ./gradlew
- ./gradlew clean jacocoTestReport
- awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, "instructions covered"; if (instructions == 0){ print "100% covered" } else { print 100*covered/instructions, "% covered" }}' app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.csv
dependencies:
- assembleDebug
- assembleRelease

staging:
image: docker:stable
only:
- sit_uat
services:
- docker:dind
tags:
- build
- docker
stage: staging
script:
- cd sumbangin_backend
- docker build --no-cache -t registry.docker.ppl.cs.ui.ac.id/pplb3/api-staging:latest .
- docker push registry.docker.ppl.cs.ui.ac.id/pplb3/api-staging:latest

development:
image: docker:stable
services:
- docker:dind
tags:
- build
- docker
stage: development
except:
- master
- sit_uat
script:
- cd sumbangin_backend
- docker build --no-cache -t registry.docker.ppl.cs.ui.ac.id/pplb3/api-development:latest .
- docker push registry.docker.ppl.cs.ui.ac.id/pplb3/api-development:latest

Semangat! ❤

--

--