JavaRush /Java Blog /Random-ID /Kami menerapkan penerapan aplikasi - "Proyek Java dari A ...

Kami menerapkan penerapan aplikasi - "Proyek Java dari A hingga Z"

Dipublikasikan di grup Random-ID
Halo semua. Kami melanjutkan rangkaian artikel tentang penulisan proyek Anda. “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 1

Sortir cabangnya

Yang penting, agar tidak tersesat di cabang dan urutannya di repositori, saya memutuskan untuk mengganti namanya dengan menambahkan awalan STEP_{number} . Misalnya, kami memiliki tiga cabang selain cabang utama:
  • JRTB-0
  • JRTB-2
  • JRTB-3
Anda tidak akan langsung mengerti mana yang harus diikuti setelahnya. Jadi saya akan mengganti namanya sebagai berikut:
  • STEP_1_JRTB-0 - langkah pertama
  • STEP_2_JRTB-2 - langkah kedua
  • STEP_3_JRTB-3 - langkah ketiga
Begitu seterusnya untuk artikel-artikel selanjutnya. Untuk mengganti nama cabang, buka halaman repositori , temukan kotak cabang , ikuti: “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 2Di ​​bawah setiap cabang, klik pensil dan ganti nama cabang: “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 3Dan sebagai hasilnya kita mendapatkan: “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 4Ngomong-ngomong, semua orang yang berlangganan saluran telegram saya ditemukan segera keluar bahwa saya mengganti nama cabang.

Sedikit tentang Docker

Apa itu Docker? Singkatnya, ini adalah alat yang dengannya Anda dapat dengan cepat dan aman menyebarkan (menyebarkan) aplikasi, menciptakan infrastruktur tertutup untuk aplikasi tersebut, yang hanya diperlukan untuk aplikasi tersebut. Ini masih sulit, saya mengerti. Secara umum, Docker dapat dipahami sebagai platform pengembangan tempat Anda dapat bekerja dengan cepat dan efisien. Docker dapat dipahami sebagai program yang berjalan di server. Program ini memiliki kemampuan untuk menyimpan container dengan aplikasi. Apa itu wadah? Ini adalah infrastruktur terpisah di mana Anda dapat menambahkan semua yang Anda butuhkan. Misalnya, untuk aplikasi Java kita memerlukan JRE untuk menjalankan aplikasinya, containernya akan memiliki ini, kita memerlukan beberapa perangkat lunak lain - kita dapat menambahkan ini. Atau mungkin kita membutuhkan Linux dan container servlet Tomcat. Ini juga bisa dilakukan. Kontainer dibuat berdasarkan gambar: yaitu, ini adalah templat khusus yang berisi semua yang diperlukan untuk membuat kontainer Docker. Bagaimana cara membuat gambar ini? Dalam kasus kita, kita perlu membuat Dockerfile di root proyek yang menjelaskan apa yang seharusnya ada di dalam container. Karena kami tidak ingin mengekspos token bot di mana pun, kami harus meneruskannya setiap kali kami ingin menerapkan aplikasi. Anda dapat membaca lebih lanjut tentang topik ini di sini dan di sini .

Kami menulis JRTB-13

Kita perlu menyiapkan proses penerapan yang cepat dan mudah untuk aplikasi kita ke server. Artinya, untuk mesin yang bekerja 24/7. Mari kita gunakan Docker sebagai dasar. Namun tidak ada tugas dalam daftar kami yang bertanggung jawab untuk menambahkan fungsi ini. Entah kenapa saya melewatkannya saat membuatnya. Tidak masalah, kami akan membuatnya sekarang. Kami pergi ke tab pembuatan masalah di GitHub dan pilih Permintaan Fitur: “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 5Tambahkan deskripsi tugas, kriteria penerimaannya, atur proyek mana yang termasuk dalam masalah ini dan Anda dapat membuat masalah baru: “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 6Sekarang, untuk menunjukkan bahwa tugas telah selesai diterima untuk bekerja, ubah status tugas dari To do on In Progress: “Proyek Java dari A hingga Z”: Implementasi penerapan aplikasi - 7Ini akan menjadi artikel yang sulit. Jika ada kendala, tulis di kolom komentar: Saya akan memantau dan menjawabnya sesuai kemampuan saya. Ini akan menjadi Dukungan Pelanggan kecil :D

Membuat Dockerfile

Apa itu file buruh pelabuhan? Untuk Docker, ini adalah skrip (petunjuk langkah demi langkah) tentang cara membuat image untuk container Docker. Agar aplikasi kita berfungsi, kita memerlukan JDK, versi 11. Artinya, kita perlu menemukan image buruh pelabuhan JDK 11 dan menambahkannya ke image kita. Ini mirip dengan cara kita menambahkan ketergantungan ke memori. Docker memiliki DockerHub untuk tujuan ini . Untuk mengunduh gambar secara lokal, Anda harus mendaftar di sana. Setelah registrasi, ayo cari JDK11. Dari apa yang saya temukan, ini wadahnya: adoptopenjdk/openjdk11 . Deskripsi container ini memiliki apa yang diperlukan untuk dockerfile:
FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Mari kita perbaiki folder tempat kita mengambil file jar. Kami memilikinya di folder target setelah kami menjalankan tugas mvn package maven. Sebelum melakukan semua ini, berdasarkan cabang utama yang diperbarui, kami membuat yang baru untuk tugas kami: STEP_4_JRTB-13 . Sekarang kamu bisa bekerja. Di root proyek, buat file tanpa ekstensi Dockerfile dan tambahkan yang berikut ini di dalamnya:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Baris pertama adalah dasar gambarnya - adopsiopenjdk/openjdk11. Baris kedua adalah menambahkan argumen ke gambar bernama JAR_FILE, yang terletak di folder target. Selain itu, folder saat ini ditentukan oleh lokasi Dockerfile. Baris ketiga - salin toples proyek kita ke gambar buruh pelabuhan. Baris terakhir pada dasarnya berisi array yang dibuat dari perintah di terminal, yang dipisahkan oleh spasi. Artinya, pada akhirnya yang berikut ini akan dieksekusi: “java -jar /app.jar” Untuk menjaga rahasia token bot, saat memulai penampung kita perlu meneruskan dua variabel - nama bot dan tokennya. Untuk melakukan ini, kami akan menulis kueri yang akan meluncurkan proyek kami dengan variabel. Dan bagaimana cara melakukannya? Anda perlu mencarinya di Google: ini tautan pertama dengan deskripsi normal. Apa yang ingin kita lakukan? Kami memiliki dua variabel dalam file application.properties yang kami definisikan di sana:
  • bot.nama pengguna
  • bot.token
Saya ingin menjalankan wadah buruh pelabuhan dan meneruskan nilai saya di sana setiap saat sehingga tidak ada yang bisa melihat nilai-nilai ini. Saya tahu bahwa di SpringBoot, variabel lingkungan yang disetel saat proyek jar diluncurkan akan diutamakan daripada variabel yang ada di file application.properties. Untuk meneruskan variabel dalam permintaan, Anda perlu menambahkan konstruksi berikut: -D{variable name}=”{variable value}” . Kami tidak menambahkan kurung kurawal ;) Kami akan menerima permintaan yang akan meluncurkan aplikasi kami dengan nilai yang telah ditentukan sebelumnya - nama dan token bot: java -jar -Dbot.username=”test.javarush.community_bot” -Dbot. token=”dfgkdjfglkdjfglkdjfgk” *.jar Sekarang kita perlu meneruskan variabel-variabel ini ke dalam wadah buruh pelabuhan. Ini adalah variabel lingkungan. Untuk memastikan kedepannya database kita berfungsi dengan lancar dan tanpa masalah pada aplikasi kita, kita akan menggunakan docker-compose. Ini adalah alat terpisah di mana Anda dapat mengatur pekerjaan, startup, dan ketergantungan antar container. Dengan kata lain, ini adalah add-on di atas Docker untuk mengelola container dari satu infrastruktur. Selain itu, sebelum menjalankan docker-compose, kita perlu memastikan bahwa kita telah menarik semua perubahan kode dari server, membuat aplikasi, dan menghentikan versi lama. Untuk ini kita akan menggunakan skrip bash. Wah… Kedengarannya sulit, saya setuju. Namun menyiapkan penerapan aplikasi selalu merupakan proses yang membosankan dan rumit. Oleh karena itu, kami memiliki skema yang cukup bagus:
  1. Mari kita jalankan skrip bash.
  2. Skrip bash menjalankan penulisan buruh pelabuhan.
  3. Docker-compose meluncurkan container docker dengan aplikasi kita.
  4. Kontainer Docker menjalankan aplikasi kita.
Dan sekarang kita perlu memastikan bahwa dua variabel - nama bot dan tokennya - berpindah dari titik 1 ke titik 4. Dan agar kedua variabel ini digunakan saat meluncurkan aplikasi java kita. Mari kita beralih dari akhir ke awal. Kita sudah mengetahui perintah apa yang perlu dijalankan untuk memulai jarnik. Oleh karena itu, kami akan mengonfigurasi Dockerfile sehingga ia belajar menerima dua variabel dan meneruskannya ke permintaan. Untuk melakukan ini, mari kita kurangi Dockerfile ke bentuk berikut:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
Anda dapat melihat bahwa kami menambahkan dua baris dan memperbarui ENTRYPOINT. Garis:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
mendeklarasikan variabel di dalam file encoder. Secara default, mereka memiliki nilai yang ditentukan. Jika, saat membuat gambar dari file docker ini, variabel lingkungan dengan nama seperti itu diteruskan, nilainya akan berbeda. Dan di ENTRYPOINT kami menambahkan beberapa elemen lagi yang akan membaca variabel lingkungan berikut:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Di sini Anda dapat melihat bahwa di dalam baris, menggunakan konstruksi ${}, nilai BOT_NAME dan BOT_TOKEN akan diteruskan. Selanjutnya kita perlu mengajarkan cara menerima dan meneruskan variabel-variabel ini ke penulisan buruh pelabuhan.

Buat buruh pelabuhan-compose.yml

Sebaiknya Anda membaca tentang format YAML secara terpisah, jika tidak, artikel tersebut akan berkembang pesat. Bagi kami, ini hanyalah deskripsi lain dari variabel bertipe .properties. Hanya di properti yang ditulis melalui titik, tetapi di YAML hal ini dilakukan sedikit lebih indah. Misalnya saja seperti ini. Dua variabel di .properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Tapi di .yaml (sama dengan .yml) akan menjadi seperti ini:
javarush:
	telegram:
		bot:
		  name: ivan
		  token: pupkin
Opsi kedua lebih indah dan mudah dimengerti. Spasinya harus persis seperti yang ditunjukkan di atas. Mari kita terjemahkan application.properties dan application.yml kita. Pertama, Anda perlu membuatnya. Di root proyek, buat file docker-compose.yml dan tulis yang berikut ini di sana:
version: '3.1'

services:
 jrtb:
   build:
     context: .
   environment:
     - BOT_NAME=${BOT_NAME}
     - BOT_TOKEN=${BOT_TOKEN}
   restart: always
Baris pertama adalah versi pembuatan buruh pelabuhan. services: mengatakan bahwa semua baris berikut setelah ini (akan digeser) mengacu pada layanan yang sedang kita konfigurasi. Kami hanya memiliki satu sejauh ini - aplikasi java bernama jrtb . Dan di bawahnya akan ada semua pengaturannya. Misalnya, build: konteks: . mengatakan bahwa kita akan mencari Dockerfile di direktori yang sama dengan docker-compose.yml. Namun bagian environment: akan bertanggung jawab untuk memastikan bahwa kita meneruskan variabel lingkungan yang diperlukan ke Dockerfile. Hanya apa yang kita butuhkan. Oleh karena itu, kami meneruskan variabel di bawah ini. Docker-compose akan mencarinya di variabel lingkungan operasi server. Mari tambahkan mereka ke skrip bash.

Membuat skrip bash

Langkah terakhir adalah membuat skrip bash. Buat file bernama start.sh di root proyek dan tulis yang berikut di sana:
#!/bin/bash

# Pull new changes
git pull

# Prepare Jar
mvn clean
mvn package

# Ensure, that docker-compose stopped
docker-compose stop

# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2

# Start new deployment
docker-compose up --build -d
Baris pertama diperlukan untuk semua skrip bash: baris pertama tidak akan berfungsi tanpanya. Dan kemudian - hanya serangkaian perintah di terminal yang perlu dijalankan. Saya telah menambahkan komentar di setiap perintah sehingga harus jelas. Satu-satunya hal yang ingin saya jelaskan adalah apa arti $1 dan $2. Ini adalah dua variabel yang akan diteruskan ketika skrip bash diluncurkan. Menggunakan perintah ekspor, mereka akan ditambahkan ke variabel server dan dibaca di docker-compose. Ini berfungsi untuk Ubuntu, mungkin tidak untuk Windows, tapi saya tidak yakin. Sekarang Anda perlu menambahkan skrip stop.sh, yang akan menghentikan pekerjaan. Ini akan berisi beberapa baris:
#!/bin/bash

# Ensure, that docker-compose stopped
docker-compose stop

# Ensure, that the old application won't be deployed again.
mvn clean
Di sini kita menghentikan pembuatan buruh pelabuhan dan membersihkan jarnik proyek, yang telah ada sejak pembangunan terakhir. Kami melakukan ini untuk memastikan bahwa proyek kami dibangun kembali secara akurat. Ada preseden, itu sebabnya saya menambahkan) Hasilnya, kami mendapatkan 4 file baru:
  • Dockerfile - file untuk membuat gambar aplikasi kita;
  • docker-compose.yml - file dengan pengaturan bagaimana kita akan meluncurkan container kita;
  • start.sh - skrip bash untuk menyebarkan aplikasi kita;
  • stop.sh adalah skrip bash untuk menghentikan aplikasi kita.
Kami juga akan memperbarui versi aplikasi kami dari 0.2.0-SNAPSHOT menjadi 0.3.0-SNAPSHOT. Mari tambahkan deskripsi versi baru ke RELEASE_NOTES dan sedikit perbaiki apa yang ada di sana:
# Catatan Rilis ## 0.3.0-SNAPSHOT * JRTB-13: menambahkan proses penerapan ke proyek ## 0.2.0-SNAPSHOT * JRTB-3: menerapkan pola Perintah untuk menangani perintah Bot Telegram ## 0.1.0-SNAPSHOT * JRTB -2: menambahkan bot telegram rintisan * JRTB-0: menambahkan proyek kerangka SpringBoot
Dan di README kita akan menambahkan paragraf baru yang menjelaskan cara menyebarkan aplikasi kita:
## Deployment Proses Deployment semudah mungkin: Perangkat lunak yang diperlukan: - terminal untuk menjalankan skrip bash - buruh pelabuhan - komposisi buruh pelabuhan untuk menyebarkan aplikasi, beralih ke cabang yang diperlukan dan menjalankan skrip bash: $ bash start.sh ${bot_username} ${bot_token } Itu saja.
Tentu saja semuanya ditulis dalam bahasa Inggris. Seperti biasa, di cabang yang baru kami buat STEP_4_JRTB-13 kami membuat komit baru dengan nama: JRTB-13: mengimplementasikan proses penerapan melalui buruh pelabuhan dan mendorongnya. Saya berhenti memikirkan secara detail hal-hal yang sudah saya uraikan di artikel sebelumnya. Saya tidak melihat gunanya mengulangi hal yang sama. Selain itu, mereka yang menemukan dan melakukannya sendiri tidak akan memiliki pertanyaan apa pun. Ini saya berbicara tentang cara membuat cabang baru, cara membuat komit, cara mendorong komit ke repositori.

Intinya

Hari ini saya telah menunjukkan banyak sekali informasi baru yang perlu dipertimbangkan secara cermat dan diperluas dengan bacaan tambahan. Hal yang paling penting: dengan bantuan SATU perintah (!!!), semua yang diperlukan untuk menyebarkan aplikasi kita akan selesai. Ini sangat keren sehingga saya bahkan tidak bisa memberi tahu Anda. Ya, saya harus menghabiskan banyak waktu dalam dokumentasi Docker untuk memahami cara meneruskan variabel dengan benar. Mulai sekarang, bot telegram akan selalu bekerja pada cabang utama versi terbaru . Tautan ke bot telegram. Saat ini tidak akan ada tautan ke materi yang bagus untuk dibaca: tanggung jawab ada di tangan Anda. Anda perlu belajar mencari informasi. Setiap orang yang berlangganan saluran telegram saya segera mengetahui tentang penerapan bot. Teman-teman, apakah Anda menyukai proyek ini? Beri dia bintang ! Dengan cara ini akan menjadi lebih populer dan lebih banyak orang dapat mempelajari dan mengambil pelajaran darinya. Seperti biasa, saya menyarankan untuk mendaftar di GitHub dan mem-follow akun saya untuk mengikuti seri ini dan proyek lain yang saya kerjakan di sana. Sekarang kita siap untuk menghubungkan database. Artikel selanjutnya akan lebih panjang dan di dalamnya kami akan melakukan semua yang diperlukan untuk bekerja dengan database. Semua deskripsi ada di JRTB-1 .

Daftar semua materi dalam seri ini ada di awal artikel ini.

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION