Dari judulnya sudah lumayan berat, setidaknya harus punya pengetahuan dasar tentang teknologi container dan linux. Tapi jangan takut, follow a long saja.
Buat yang belum tahu tentang container dan linux, bisa cari di google dengan docker atau docker container. Ya sudah banyak yang bahas di google maupun YouTube, berbeda jika kita kembali ke tahun 2014 😆.
Daftar Isi:
Motivasi
di lokal komputer Saya jalan atau di komputer Saya bisa anonim
Pernah dengar ucapan ini? pernah ya. Nah, dengan docker tidak ada lagi ucapan seperti ini.
Mempersiapkan tools untuk build React Native seperti Android, nodejs hingga environment variable sesuai kebutuhan. Semua sudah terintegrasi dalam satu wadah Docker Image.
Alternatif
Cobalah googling pasti akan ketemu official docker android untuk react native terbitan react native community. Saya baru tahu ini ketika ingin buat postingan ini 😅. Docker Image yang Saya buat ini untuk React Native versi 0.65.1.
Saya sudah buat docker image sesuai kebutuhan di project saya. Dan jika kalian coba pull image terbitan react native community dan wow fantastis! ukuran image-nya 11 GB-an cuy. Jadi, balik lagi sesuai kebutuhan.
Kesulitan
Ketika membuat ini cari-cari bahan di google dan comot sana-sini, coba dan gagal itu sudah pasti, terutama ketika awal-awal itu lama sekali build image nya sekitar satu jam-an lah di komputer Saya, karena berbanding lurus dengan koneksi internet dan kecepatan komputer. Apalagi kalau gagal karena ada yang salah, ya sudah extra 1 jam lagi 😆.
Dockerfile
Langsung saja ya isi Dockerfile-nya
FROM ubuntu:20.04 # set ARG to bypass dialog error \ # "debconf: unable to initialize frontend: Dialog \ # debconf: (TERM is not set, so the dialog frontend is not usable.) \ # debconf: falling back to frontend: Readline Configuring tzdata" \ # when installing git ARG DEBIAN_FRONTEND=noninteractive ARG TZ=Asia/Jakarta ARG NODE_VERSION=14.x ARG SDK_VERSION=7583922 ARG NDK_VERSION=21.4.7075529 ARG CMAKE_VERSION=3.10.2.4988404 ARG ANDROID_VERSION=android-31 ARG ANDROID_BUILD_TOOLS_VERSION=30.0.2 RUN apt update && apt install -y curl && \ curl -sL https://deb.nodesource.com/setup_${NODE_VERSION} | bash - && \ apt -y install gcc g++ make && \ curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt update && apt -y install yarn && \ apt install -y nodejs openjdk-8-jre-headless python3 RUN apt install -y expect git openjdk-8-jdk-headless wget unzip vim && \ wget https://dl.google.com/android/repository/commandlinetools-linux-${SDK_VERSION}_latest.zip RUN mkdir -p Android/Sdk && unzip commandlinetools-linux-${SDK_VERSION}_latest.zip -d Android/Sdk/cmdline-tools && \ mv Android/Sdk/cmdline-tools/cmdline-tools Android/Sdk/cmdline-tools/latest ENV ANDROID_HOME="$HOME/Android/Sdk" ENV PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest" ENV PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin" ENV PATH="$PATH:$ANDROID_HOME/platform-tools" RUN yes | sdkmanager --sdk_root=${ANDROID_HOME} "tools" RUN sdkmanager "platform-tools" "platforms;${ANDROID_VERSION}" "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" # If you use react-native-reanimated or react-native-mmkv-storage then install ndk & cmake RUN sdkmanager --install "ndk;${NDK_VERSION}" RUN sdkmanager --install "cmake;${CMAKE_VERSION}" RUN sdkmanager --licenses CMD ["/bin/sh"]
Pahami statement kodenya ya, terutama bagian RUN
nya. bandingkan dengan Image terbitan react native community diatas. Pasti ada ilmu yang di sana. Di sini tidak ada bahasan ya bagaimana cara build image dari Dockerfile.
NOTE: Sesuaikan versi di ARG
statement sesuai kebutuhan, misal react native diatas versi 0.65.1 bisa jadi beda dan perlu disesuaikan.
CI/CD
Continous Integration jadi lebih mudah dan Continous Delivery jadi lebih cepat dengan menggunakan docker semua jadi otomatis. Saya Menggunakan Docker Image tersebut di Jenkins server untuk project yang sedang berjalan. Kenapa kok Saya tidak pakai Image dari react native community? Alasannya, sudah terlanjur buat 😁. Dan hasil ukuran Image-nya juga jauh lebih kecil hanya 6 GB-an (masih perlu optimasi lagi 👍). Selain bloated , project yang sedang dikerjakan tidak membutuhkan sebagian besar yang ada didalam Image dari react native community, contoh buck
, watchman
. Apalagi storage Jenkins yang cuma 50GB. Jenkins ini tidak hanya build react native saja, ada aplikasi lainnya, jadi mesti bagi-bagi alokasi penyimpanan.
Penutup
Dockerfile yang Saya cantumkan bisa dimodifikasi dan dioptimasi sesuai kebutuhan, juga bisa sebagai base Image. Karena kita tahu Docker Image itu berlapis-lapis (layering). Contoh, jika kalian pakai fastlane sebagai CI/CD kalian butuh bundler
atau kasus lain kalian butuh buck
atau watchman
. Cukup buat Dockerfile lagi dengan base Dockerfile tadi. Intinya hasil Image dari Dockerfile tadi sebagai bare minimum yang bisa di extend kedepannya.
Hasil Docker Image-nya juga sudah Saya terbitkan ke docker hub pribadi. Dan Saya taruh juga di Github repository Saya.