Java di Cloud: Tutorial Pengaturan Integrasi Berkelanjutan
Diterbitkan: 2022-03-11Tahun demi tahun, kami menjadi saksi evolusi industri TI yang semakin pesat. Sudah lebih dari dua dekade sejak slogan inovatif "Tulis sekali, jalankan di mana saja" menetapkan tingkat harapan yang sama sekali baru bagi komunitas pengembangan perangkat lunak. Dan di sinilah kita hari ini, dengan seperangkat alat yang terus berkembang yang secara kolektif membawa pengembangan Java pada khususnya, dan pengembangan perangkat lunak secara umum, ke alam semesta kemungkinan yang sama sekali baru.
Metodologi seperti Agile, DevOps, dan Continuous Integration and Deployment – bersama dengan evolusi layanan mikro – telah secara kolektif meningkatkan produktivitas proses pengembangan perangkat lunak ke titik di mana mengembangkan perangkat lunak lebih menyenangkan daripada sebelumnya. Memanfaatkan otomatisasi dan menyiapkan seperangkat alat yang benar dapat membuat pengembangan dan pengiriman produk perangkat lunak secara mengejutkan tidak menyakitkan.
Artikel ini akan melihat alam semesta baru ini dari perspektif pengembang Java yang melintasi DevOps dan mencari untuk mengoptimalkan pengembangan dan pengiriman produk secara maksimal.
Saat ini, istilah seperti Spring Boot, Docker, Cloud, Amazon Web Services, Continuous Delivery banyak digunakan tetapi kurang dipahami secara luas. Artikel ini akan mengambil rute termudah untuk menyajikan semua teknologi ini dan menjelaskan istilah-istilah ini, dan membungkusnya dalam bentuk tutorial di mana kami akan mengembangkan perangkat lunak kecil dan mempersiapkannya untuk pengiriman produksi menggunakan semua alat yang disebutkan.
Mengapa Alat Ini?
Sederhanakan Deployment dengan Docker
"Tulis sekali, jalankan di mana saja" adalah terobosan konseptual yang menghasilkan teknologi seperti Java Virtual Machine (JVM) yang memungkinkan kode Anda berjalan di mana saja. Dan sekarang di sinilah kita, beberapa dekade kemudian, dengan sesuatu yang disebut Docker disajikan kepada komunitas TI. Docker adalah alat penahanan di mana Anda dapat menempatkan perangkat lunak Anda dan menjalankannya tanpa rasa sakit, hampir di mana saja Anda inginkan.
Namun, pengembang Java mungkin melihat Docker dan berkata, "Mengapa kami membutuhkannya, kami sudah memiliki JVM, yang dikenal sebagai solusi portabel utama." Tapi apakah itu?
"Tulis sekali, jalankan di mana saja" terdengar bagus, dan dimainkan dengan baik… setidaknya hampir sepanjang waktu. Sampai Anda menemukan beberapa vendor JVM, beberapa versi Java, beberapa sistem operasi, dan berbagai permutasi dan kombinasi dari semua hal di atas. Anda kemudian menemukan diri Anda beralih dari paradigma "Tulis sekali, jalankan di mana saja" yang elegan ke perangkap "Tulis sekali, debug di mana-mana" yang kontra-produktif.
Dan di situlah Docker masuk untuk membantu menyelamatkan hari.
Docker menyederhanakan pengembangan, pengujian, dan pengiriman perangkat lunak. Jika Anda memiliki perangkat lunak yang ingin Anda uji, masukkan ke dalam wadah Docker, dan itu akan berjalan dan tidak sulit untuk menginstal untuk semua pihak yang terlibat.
Percepat Pengembangan dengan Spring Boot
Kurang dari satu dekade setelah slogan "lari di mana saja" diperkenalkan, kerangka Spring muncul di tempat kejadian. Saat ini, ekosistem Spring terus berkembang, dan telah menghasilkan banyak proyek berbasis Spring yang berharga, mungkin yang paling terkenal adalah Spring Boot. Seperti yang dinyatakan di situs web Spring Boot:
Spring Boot memudahkan untuk membuat Aplikasi berbasis Spring kelas produksi yang berdiri sendiri yang dapat Anda jalankan.
Spring Boot memungkinkan Anda menjalankan dan menjalankan aplikasi dalam hitungan menit. Pengembang perangkat lunak dapat fokus pada pengembangan perangkat lunak dan kemudian dapat mengambil manfaat dari alat yang melakukan semua konfigurasi untuk mereka.
Dalam tutorial ini, kita akan menggunakan Spring Boot untuk mengembangkan layanan mikro kita.
Integrasi Berkelanjutan (CI) dengan Jenkins
DevOps adalah gerakan yang berkembang pesat yang mengintegrasikan erat pengembangan perangkat lunak dan tim administrasi sistem, dengan tujuan membuat siklus hidup pengembangan dan pengiriman perangkat lunak semudah, mulus, dan seproduktif mungkin bagi semua pihak yang terlibat: pengembang, sysadmin, penguji, dan akhirnya , pengguna akhir.
Integrasi berkelanjutan (CI), adalah salah satu landasan revolusi DevOps. Idenya adalah bahwa setiap kali pengembang melakukan kode ke repositori kode, itu secara otomatis diuji dan dikemas untuk pengiriman (penyebaran) ke produksi.
CI berjalan seiring dengan:
- Pengiriman Berkelanjutan – Pengiriman otomatis paket yang disiapkan untuk pengujian bisnis pengguna akhir dengan pemicu manual untuk penyebaran produksi.
- Continuous Deployment – Penyebaran otomatis produk yang dikemas langsung ke produksi.
Ada lebih dari beberapa alat yang dapat digunakan untuk mengimplementasikan proses CI. Salah satu yang paling populer adalah Jenkins, alat CI open source. Dengan lebih dari seribu plugin dan komunitas besar di belakangnya, Jenkins adalah pilihan yang mudah ketika mulai berpikir untuk menerapkan integrasi, pengiriman, atau penerapan berkelanjutan.
Dalam tutorial kami, Jenkins akan digunakan untuk mengirimkan produk kami ke cloud, lebih khusus lagi, cloud Amazon (AWS).
Komputasi Awan dengan AWS
Jika Anda memiliki pengalaman sysadmin, bayangkan menghilangkan beberapa kekhawatiran administrasi sistem dari pundak Anda. Anda memiliki beberapa aplikasi; Anda memiliki gagasan tentang berapa banyak sumber daya yang akan mereka butuhkan, tetapi Anda tidak tahu persis ukuran perangkat keras yang Anda perlukan. Anda membuat estimasi, sumber daya dibeli, dan sistem masuk ke produksi. Jika Anda beruntung, Anda akan menemukan bahwa Anda melebih-lebihkan dan memiliki lebih banyak sumber daya daripada yang Anda butuhkan. Tetapi mengingat Hukum Murphy, Anda akan lebih mungkin menemukan bahwa Anda meremehkan persyaratan sumber daya dan akhirnya berebut untuk mendapatkan sedikit lebih banyak memori atau kekuatan pemrosesan di bawah tekanan waktu yang luar biasa. Sebaliknya, jika Anda menerapkan ke cloud, Anda cukup meletakkan sistem Anda di luar sana dan mengukurnya sesuai kebutuhan, dengan fleksibilitas yang ditawarkan oleh penyedia cloud. Dengan cloud, Anda tidak perlu khawatir kehabisan sumber daya sistem, juga tidak perlu khawatir 90 persen memori atau CPU Anda menganggur.
Tentu saja, ada tantangan untuk memutuskan penyedia mana yang akan dipilih. Perang awan masih berlangsung. Clash of Microsoft, Amazon dan Google untuk komputasi masa depan adalah contoh judul yang dapat Anda temukan akhir-akhir ini di berita dunia teknologi. Untuk blog ini, saya telah memilih Amazon Web Services (AWS), sebagian besar berdasarkan popularitas dan pangsa pasarnya saat ini.
Salah satu keunggulan AWS adalah Amazon menawarkan banyak layanan setelah Anda mendaftar:
Dalam tutorial ini kita akan menggunakan dua layanan AWS berikut: Elastic Compute Cloud EC2 (lebih khusus lagi, Amazon EC2 Container Registry, atau Amazon ECR), dan Amazon S3 (Simple Storage Services).
Amazon ECR
Kita perlu menyimpan gambar Docker kita di suatu tempat. Amazon ECR adalah layanan registri AWS Docker terkelola. Seperti yang dinyatakan di situs web Amazon ECR:
…memudahkan developer untuk menyimpan, mengelola, dan menerapkan image container Docker. Amazon ECR terintegrasi dengan Amazon EC2 Container Service (ECS), menyederhanakan pengembangan Anda ke alur kerja produksi. Amazon ECR menghilangkan kebutuhan untuk mengoperasikan repositori kontainer Anda sendiri atau khawatir tentang penskalaan infrastruktur yang mendasarinya.
Amazon S3
Seperti yang disebutkan, aplikasi yang kami kembangkan akan menjadi layanan mikro Boot Musim Semi yang akan mengunggah file ke Amazon S3. Seperti yang dinyatakan di situs web Amazon S3:
…memberikan pengembang dan tim TI penyimpanan cloud yang aman, tahan lama, dan sangat skalabel. Amazon S3 adalah penyimpanan objek yang mudah digunakan, dengan antarmuka layanan web sederhana untuk menyimpan dan mengambil data dalam jumlah berapa pun dari mana saja di web.
Tutorial “Cara” Praktis
Tujuannya adalah untuk mempersiapkan penerapan layanan mikro Boot Musim Semi yang akan mengunggah file ke Amazon S3. Langkah-langkahnya adalah sebagai berikut:
- Kembangkan layanan mikro
- Tentukan proses pembangunan di mana layanan akan di-docker
- Gunakan Bitbucket untuk menghosting repositori kode Git
- Integrasikan Bitbucket dengan Jenkins untuk mengemas aplikasi menggunakan Gradle
- Dorong ke Amazon ECR jarak jauh
Berikut ini adalah tutorial untuk mengatur semua komponen yang dibutuhkan:
- Aplikasi contoh Boot Musim Semi – layanan mikro yang dikemas dan di-docker menggunakan Gradle
- Instalasi Jenkins di server Ubuntu baru
- Integrasi Bitbucket dengan Jenkins melalui webhook
- Konfigurasi pekerjaan Jenkins
- Amazon ECR untuk menyimpan gambar Docker yang berisi aplikasi kami
Prasyarat
Untuk dapat menggunakan sumber daya cloud AWS, kita harus mendaftar di Amazon terlebih dahulu. Dengan mendaftar, kami akan mendapatkan akun dengan manfaat penggunaan Tingkat Gratis langsung, untuk tujuan mengaktifkan pengalaman langsung selama 12 bulan setelah pendaftaran.
Seperti yang disebutkan, dalam tutorial ini kita akan menggunakan Amazon S3 dan Amazon ECR. Untuk keduanya, kita memerlukan kunci akses untuk terhubung ke layanan.
Setelah mendaftar dengan AWS, kami membuka kredensial Keamanan akun kami, di mana kami memilih Kunci akses dan klik "Buat Kunci Akses Baru". Setelah mengklik, kunci dibuat bersama dengan ID-nya. Anda perlu menyimpannya di tempat yang aman, karena kami akan menggunakannya nanti saat mengonfigurasi integrasi AWS Jenkins dan mengembangkan unggahan file S3 kami.
Prasyarat selanjutnya adalah kita membutuhkan ember Amazon S3 (wadah penyimpanan). Layanan Boot Musim Semi kami akan mengunggah dan mengunduh file ke dan dari penyimpanan Amazon S3. Pembuatan bucket cukup sederhana dan hanya membutuhkan beberapa klik. Penjelasan lengkap tentang cara melakukannya disediakan dalam dokumentasi Create a Bucket.
Kami juga akan menggunakan Bitbucket untuk menghosting kode kami dan memicu permintaan ke Jenkins, jadi akun Bitbucket juga diperlukan. Bitbucket adalah opsi yang bagus untuk pengembang, dengan salah satu manfaat utamanya adalah jumlah repositori pribadi yang tidak terbatas yang dapat Anda buat.
Pengembangan Aplikasi
Daripada masuk ke semua detail anotasi Spring dan cara kerjanya, saya malah akan fokus, dari perspektif pengembang murni, pada bagian yang lebih menantang dari keseluruhan penyiapan; yaitu, menginstal dan mengonfigurasi Linux, Jenkins, dan alat lain yang diperlukan untuk CI. Semua contoh kode yang digunakan dalam tutorial ini, termasuk aplikasi microservice Spring Boot, tersedia di repositori Bickbucket untuk proyek tersebut.
Komposisi aplikasi kami sederhana. Kami memiliki titik masuk aplikasi Spring Boot di file StorageWebserviceApplication.java
kami. Logika untuk mengunggah dan mengunduh file ada di StorageService.java
. StorageController.java
adalah pengontrol Istirahat, berisi titik akhir API yang digunakan untuk mengunggah dan mengunduh file. Berikut adalah hierarki proyek:
Kami telah memilih Gradle sebagai alat pembangunan, dan itu akan mengemas aplikasi kami dan menyusun gambar Docker. Jadi selanjutnya, kita akan membahas file build Gradle, komponen layanan, dan Dockerfile.
Untuk dapat menggunakan AWS API, kita perlu menyertakan dependensi dalam file build kita, seperti yang didefinisikan dalam dokumentasi AWS untuk menggunakan Gradle.
Ringkasnya, bagian konfigurasi dependensi AWS dari skrip Gradle kami akan terlihat seperti berikut:
buildscript { ... repositories { mavenCentral() } dependencies { ... classpath("io.spring.gradle:dependency-management-plugin:0.5.4.RELEASE") } } .. apply plugin: "io.spring.dependency-management" dependencyManagement { imports { mavenBom ('com.amazonaws:aws-java-sdk-bom:1.10.47') } } dependencies { .. compile ('com.amazonaws:aws-java-sdk-s3') }
Seperti yang dinyatakan sebelumnya, saat mengunggah file ke Amazon S3, kami melakukannya dengan mengunggah file ke ember S3 .
Untuk terhubung ke bucket, klien Amazon S3 kami harus memiliki kredensial yang disediakan. Kredensial adalah kunci akses yang kita buat sebelumnya. Kami mendefinisikan ID dan nilai kunci akses dalam file application.properties
; kami telah menamai ember kami toptal-s3-example
.
Komponen layanan utama kami sekarang adalah sebagai berikut:
@Service public class StorageService { @Value("${aws.accesKeyId}") private String awsAccessKeyId; @Value("${aws.secretKey}") private String awsSecretKey; @Value("${aws.bucketName}") private String awsBucketName; private AWSCredentials credentials; private AmazonS3 s3client;; @PostConstruct public void init(){ credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKey); s3client = new AmazonS3Client(credentials); } public void uploadFile(MultipartFile file) throws IOException { File fileForUpload = transformMultipartToFile(file); s3client.putObject(new PutObjectRequest(awsBucketName, file.getOriginalFilename(), fileForUpload)); } public InputStream downloadFile(String amazonFileKey) throws IOException { S3Object fetchFile = s3client.getObject(new GetObjectRequest(awsBucketName, amazonFileKey)); InputStream objectData = fetchFile.getObjectContent(); return objectData; } …
StorageService
membaca kredensial dari file application.properties
dan menggunakannya untuk membuat instance objek BasicAWSCredentials
, dan selanjutnya objek AmazonS3Client
. Berikut ini adalah masalah sederhana dalam memanggil putObject
untuk unggahan file dan getObject
untuk unduhan file, pada objek klien Amazon S3.
Kami akan menjalankan layanan di dalam wadah Docker dan, selama proses pembangunan Gradle, kami akan membangun gambar Docker. Kami akan melakukan ini dengan mengkonfigurasi file build.gradle
tambahan, sebagai berikut:
buildscript { ... dependencies { ... classpath('se.transmode.gradle:gradle-docker:1.2') } } ..... apply plugin: 'docker' ... task buildDocker(type: Docker, dependsOn: build) { push = false applicationName = "storageservice" dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } }
Bagian Buildscript
dan apply plugin
cukup standar. Kami juga telah mendefinisikan tugas buildDocker
yang membaca konfigurasi Docker yang disimpan di src/main/docker/Dockerfile
, dan menyalin file JAR ke build Docker.
Dockerfile berisi daftar perintah Docker murni yang dengannya kita akan menyiapkan gambar kita:
FROM frolvlad/alpine-oraclejdk8 ADD storageWebService-0.0.1-SNAPSHOT.jar storageService.jar EXPOSE 8080 CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/storageService.jar"]
Prasyarat untuk menjalankan aplikasi kita adalah menginstal Java Virtual Machine (JVM). Docker menyediakan daftar gambar dengan Java terinstal, dan kami akan memilih salah satu yang terkecil, berdasarkan minimal 5MB Alpine Linux. frolvlad/alpine-oraclejdk8
memiliki semua yang kita butuhkan dan cukup kecil (hanya 170 MB).
Perintah FROM
menetapkan gambar yang disebutkan sebagai dasar di mana kita sendiri akan dibangun. Kami ADD
file JAR yang dibuat ke sistem file kontainer dengan nama storageService.jar
. Selanjutnya, kami mendefinisikan wadah Docker untuk mendengarkan pada port 8080
saat runtime dengan perintah EXPOSE
. Namun, ini tidak akan memungkinkan komunikasi ke 8080
dari host. Ketika gambar selesai, dan kami ingin menjalankannya, kami juga perlu mempublikasikan port pada wadah dengan perintah berikut docker run -p 8080:8080 amazonRepository/storageservice
, di mana amazonRepository
adalah repositori yang akan kami konfigurasikan nanti dalam hal ini tutorial. Dengan CMD
, kami menentukan perintah mana yang akan dieksekusi ketika kami menjalankan wadah. Nilai dalam tanda kurung dari perintah CMD
berarti yang berikut ini akan dieksekusi ketika kita menjalankan wadah:
java -Djava.security.egd=file:/dev/./urandom -jar /storageService.jar
Opsi -Djava.security.egd=file:/dev/./urandom
diperlukan untuk membantu mengurangi penundaan JVM selama startup. Jika dihilangkan, itu akan membuat aplikasi boot sangat lambat karena proses pembuatan nomor acak yang diperlukan selama proses boot.
Ini meringkas bagian "Pengembangan aplikasi". Setelah ini selesai, layanan yang telah kita buat di sini akan secara otomatis dimulai ketika kita menjalankan wadah Docker nanti. Jadi, mari mulai penginstalan dan konfigurasi alat lain yang diperlukan untuk menyiapkan proses integrasi berkelanjutan.
Aplikasi dan Operasi Sistem
Pertama, kita membutuhkan server Linux yang bersih untuk menyiapkan alat Jenkins CI. Perhatikan bahwa instruksi berikut ini khusus untuk Ubuntu 14.04. Ingatlah bahwa instruksi mungkin sedikit berbeda untuk distribusi Linux lainnya. Versi Jenkins yang digunakan adalah 2.7.1 dan layar serta instruksi mungkin sedikit berbeda tergantung pada versi Jenkins yang digunakan.

Jadi, kami pergi ke konsol server Linux kami dan mulai menginstal prasyarat.
Prasyarat JDK
Kita perlu menginstal JDK. Berikut adalah petunjuk untuk menginstal JDK8.
sudo add-apt-repository ppa:webupd8team/java sudo apt-get install python-software-properties sudo apt-get update sudo apt-get install oracle-java8-installer java -version
Instal Docker
Agar Jenkins dapat memicu build Docker, kita perlu menginstal docker-engine
sebagai berikut:
sudo apt-get install apt-transport-https ca-certificates sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D #create a docker list file sudo vi /etc/apt/sources.list.d/docker.list #add the following entry in the docker.list file (change trusty to #the release you are running on if you are running on different, ie. #xenial, precise...): deb https://apt.dockerproject.org/repo ubuntu-trusty main #save and exit the file sudo apt-get update apt-cache policy docker-engine sudo apt-get install docker-engine
Karena sekarang kita telah menginstal mesin Docker, dengan perintah berikut kita akan memulai image Docker hello-world
untuk mengonfirmasi bahwa Docker berfungsi dengan benar.
sudo docker run hello-world
Output gambar Hello-world
akan terlihat sebagai berikut, dan dengan ini, kami dapat mengonfirmasi bahwa mesin berfungsi dengan baik.
Instal Antarmuka Baris Perintah (CLI) AWS
Selanjutnya, kita akan menginstal AWS CLI. Nantinya, dalam konfigurasi pekerjaan Jenkins, kami akan menggunakan CLI untuk menjalankan perintah untuk autentikasi AWS dan push image Docker ke registri container Amazon EC2.
Untuk menginstal AWS CLI, kami mengikuti panduan yang dijelaskan secara detail di dokumentasi Amazon CLI.
Dari dua opsi penginstalan, kami akan memilih penginstalan menggunakan Pip, sistem manajemen paket yang digunakan untuk menginstal dan mengelola program Python. Kami akan menginstal Pip dan AWS CLI hanya dengan menjalankan tiga perintah berikut:
#install Python version 2.7 if it was not already installed during the JDK #prerequisite installation sudo apt-get install python2.7 #install Pip package management for python sudo apt-get install python-pip #install AWS CLI sudo pip install awscli
AWS ECR
Sebagai langkah terakhir dari proses build, kami akan mendorong image Docker kami ke registri container Amazon. Di konsol layanan web Amazon, kami menemukan AWS EC2 Container Service.
Kami memilih submenu Repositori di sebelah kiri dan klik Mulai .
Kami kemudian disajikan dengan layar pertama untuk mengkonfigurasi repositori di mana kami memasukkan nama repositori dan klik tombol Next Step .
Mengklik Langkah Berikutnya kemudian menunjukkan kepada kita layar dengan instruksi tentang cara mendorong gambar ke repositori.
Kami disajikan dengan contoh bagaimana membangun dan mendorong gambar Docker ke registri, tetapi kami tidak perlu khawatir dengan ini sekarang. Dengan ini, kami telah membuat repositori.
Instal dan Konfigurasi Jenkins
Untuk menginstal Jenkins, kita masukkan perintah berikut di shell:
#Download Jenkins key and pipe it to apt-key tool, apt-key command #add will read from input stream, as defined by „–„. When added #apt will be able to authenticate package to be installed. wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - #create a sources list for jenkins sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' #update your local package list sudo apt-get update #install jenkins sudo apt-get install jenkins
Ketika instalasi selesai, Jenkins mulai secara otomatis. Periksa status layanan dengan perintah berikut:
sudo service jenkins status
Jenkins akan terhubung ke repositori Bitbucket Git, dan untuk melakukannya, kita perlu menginstal Git.
#install Git sudo apt-get install git
Jenkins akan memicu proses pembuatan Gradle, di mana gambar Docker akan dibuat. Untuk dapat melakukan ini, pengguna Jenkins perlu ditambahkan ke grup pengguna docker
:
#add Jenkins user to docker user group sudo usermod -aG docker jenkins
Selama proses pembuatan, Jenkins akan mendorong gambar Docker ke Amazon ECR. Untuk mengaktifkan ini, kita perlu mengonfigurasi AWS untuk pengguna Jenkins.
Pertama, kita perlu beralih ke pengguna jenkins
. Untuk melakukannya, kita perlu mengatur kata sandi.
#change Jenkins password sudo passwd jenkins #switch to Jenkins user su – jenkins #configure AWS aws configure
Setelah memasukkan perintah aws configure
, kami mulai memasukkan kunci akses rahasia dan ID kunci yang dihasilkan (ini adalah kredensial yang kami buat sebelumnya dalam proses). Dalam kasus saya, wilayah akun adalah us-west-2
, jadi saya memasukkannya. Kami juga mengatur format output default untuk perintah AWS menjadi JSON.
Sekarang kita dapat melanjutkan untuk mengonfigurasi Jenkins melalui konsol web yang dapat diakses pada port 8080.
Saat kami mengakses URL, kami disajikan dengan layar Memulai berikut.
Seperti yang dinyatakan di layar, kita perlu memasukkan kata sandi. Setelah melakukan ini, wizard pengaturan meminta kita untuk melakukan hal berikut:
- Pilih plugin mana yang akan diinstal - kami akan memilih Instal plugin yang disarankan .
- Buat pengguna admin pertama dengan memasukkan kredensial pengguna
Setelah selesai, klik Simpan dan Selesai . Dengan ini, kami telah menyelesaikan konfigurasi pengaturan Jenkins.
Sebelum kita mulai mendefinisikan pekerjaan build, kita perlu menambahkan beberapa plugin tambahan. Kami akan pergi ke Kelola Jenkins dan klik Kelola plugin . Di tab Tersedia , pertama-tama kita temukan plugin Bitbucket , centang kotak, dan klik Unduh dan instal setelah restart .
Anda kemudian akan disajikan dengan sesuatu seperti layar berikut.
Setelah plugin dipasang, kami mengulangi proses untuk plugin tambahan berikut yang akan diperlukan untuk menyiapkan pekerjaan:
- Plugin gradle
- Plugin langkah membangun Docker
- Plugin lingkungan build kustom Cloudbees Docker
- Plugin Amazon ECR
Plugin langkah build Docker yang kami gunakan akan mengirimkan permintaan ke daemon Docker. Untuk tujuan ini, kita perlu mengaktifkan soket TCP pada port 2375. Untuk melakukannya, kita masukkan file konfigurasi Docker yang terletak di etc/default/docker
.
sudo vi /etc/default/docker
Di sini kita menambahkan baris berikut dalam konfigurasi:
DOCKER_OPTS='-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock'
Kami menyimpan dan keluar dari file dan memulai kembali layanan Docker dan Jenkins.
sudo service docker restart sudo service jenkins restart
Setelah Jenkins reboot, kami pergi ke konsol Jenkins dan, dari Manage Jenkins , kami memilih Configure System .
Kami menemukan bagian pembuat Docker dan masukkan http://localhost:2375
untuk REST API URL, klik Terapkan untuk mengonfirmasi perubahan. Kami kemudian klik Test Connection untuk semoga mengkonfirmasi bahwa semuanya baik-baik saja.
Kami menyimpan konfigurasi dan melanjutkan ke konfigurasi pekerjaan Jenkins.
Konfigurasi Pekerjaan
Kami pergi ke halaman beranda Jenkins dan membuat Item Baru .
Kami memilih proyek Freestyle dan memasukkan nama proyek seperti yang ditunjukkan pada layar berikut:
Mengklik OK , kami disajikan dengan halaman konfigurasi pekerjaan. Kami ingin proyek dibangun pada setiap push ke repositori Bitbucket Git kami. Untuk mencapai ini, pertama-tama kita perlu mendefinisikan repositori yang kita hubungkan.
Langkah 1: Manajemen Kode Sumber
Di bawah manajemen kode sumber, kami memilih Git dan memasukkan URL repositori Bitbucket kami. URL memiliki bentuk https://bitbucket.org/bitbucketUsername/repositoryName
.
Setelah kita memasukkan URL, Jenkins secara otomatis akan mencoba untuk menguji koneksi. Karena kami belum memasukkan kredensial, itu akan menampilkan kesalahan yang menunjukkan bahwa itu tidak dapat terhubung.
Buka daftar drop-down Add , dan klik penyedia Credentials Jenkins .
Kami disajikan dengan layar berikut, di mana kami memasukkan nama pengguna dan kata sandi untuk akun Bitbucket kami.
Setelah menambahkan catatan kredensial baru, kami memastikan untuk memilihnya di drop-down kredensial, dan ini menyelesaikan pengaturan manajemen kode sumber .
Langkah 2: Bangun Pemicu
Periksa Pemicu membangun dari jarak jauh dan menentukan token autentikasi. Pastikan untuk menentukan token yang acak dan aman.
Langkah 3: Bitbucket Webhook
Jenkins sudah menyediakan URL untuk kami yang akan kami gunakan di Bitbucket. Kami pergi ke halaman repositori Bitbucket kami dan, di menu pengaturan, klik pada Web hooks . Selanjutnya mengklik Add webhook memberi kita layar berikut, yang kita isi sebagai berikut:
URL memiliki struktur berikut: http://JENKINS_URL _HOST:PORT/job/JOB_NAME/build?token=TOKEN
.
Masukkan nilai di atas masing-masing dengan URL Jenkins, port yang menjalankannya, nama pekerjaan yang telah Anda buat, dan token yang telah Anda tentukan sebelumnya.
Setelah menyimpan Webhook, Anda akan diberikan layar berikut, yang dapat Anda edit jika diperlukan, atau melihat permintaan yang dibuat setiap kali kami memasukkan kode baru.
Dengan konfigurasi ini, webhook dipicu pada setiap push repositori, terlepas dari cabangnya. Di sisi Jenkins, kita dapat menentukan push cabang mana yang akan memicu build.
Agar Bitbucket dapat mengirimkan kode ke Jenkins, kita perlu mengkonfigurasi ulang keamanan global Jenkins untuk memungkinkan akses baca anonim. Selain itu, untuk pengaturan kami, kami harus menonaktifkan opsi Jenkins default yang mencegah pemalsuan permintaan lintas situs. Untuk melakukannya, buka Manage Jenkins dan pilih Configure global security . Centang Izinkan akses baca anonim dan centang Cegah eksploitasi pemalsuan lintas situs . Kemudian simpan konfigurasi.
Harap dicatat bahwa ini hanya dilakukan untuk alasan kesederhanaan. Penyiapan penuh melampaui cakupan tutorial ini, dan itu akan mencakup pengamanan Jenkins lebih lanjut di belakang proxy terbalik, pada koneksi TLS, dan mengaktifkan pencegahan CSRF.
Langkah 4: Pembuatan Gradle
Kita sekarang dapat kembali ke pekerjaan Jenkins dan melanjutkan mengonfigurasinya. Di bagian build, kami menambahkan langkah build: Invoke gradle script .
Pada formulir ini, kami memasukkan yang berikut:
Seperti yang ditampilkan di layar, kami akan menggunakan pembungkus Gradle, fitur Gradle yang nyaman yang tidak mengharuskan Anda menginstal Gradle di host. Pastikan untuk mencentang kotak Make gradlew executable .
Dalam tugas, kami menentukan build
dan buildDocker
.
Langkah 5: Gambar Tag Docker
Bagian build ini memberi tag pada image Docker yang sebelumnya disiapkan oleh tugas dockerBuild
. Untuk ini, kami menambahkan langkah build baru ke pekerjaan: Execute Docker command . Kami memilih perintah Tag gambar dan mengatur nama gambar, repositori target tempat kami akan mendorong gambar, dan memberi tag:
Langkah 6: Docker Docker ke Amazon ECR
Terakhir, kita perlu menentukan cara mendorong gambar kita ke Amazon ECR. Untuk ini, kami menambahkan langkah build shell Execute baru dan mengatur perintah untuk mengautentikasi ke AWS dan untuk mendorong gambar ke Amazon ECR:
#region for our account is us-west-2 aws ecr get-login --region us-west-2 | bash #push the previously tagged image docker push 058432294874.dkr.ecr.us-west-2.amazonaws.com/springbootdocker:${BUILD_NUMBER}
Dengan ini, kami telah menyelesaikan proses pembuatan kami. Setelah memasukkan kode baru ke repo, pekerjaan ini akan diaktifkan, dan kami akan memiliki gambar Docker baru yang diunggah ke registri Docker "secara otomatis".
Gambar kemudian dapat ditarik ke mana pun kita menginstal docker-engine
, dan dapat dijalankan dengan perintah berikut:
docker run -p 8080:8080 amazonRepository/springbootdocker
Perintah ini akan memulai layanan mikro Boot Musim Semi kami, dengan titik akhir berikut untuk mengunggah dan mengunduh file kami ke ember S3:
-
http://hostnameURL:8080/api/storage/upload
-
http://hostnameURL:8080/api/storage/download?fileName=xyz
Langkah Lebih Lanjut dengan Java dan Integrasi Berkelanjutan
Selalu ada lebih banyak hal yang harus dilakukan. Banyak hal yang telah dibahas dalam tutorial ini, tetapi saya akan menganggap ini hanya sebagai titik awal untuk mempelajari lebih lanjut. Menempatkan Jenkins di belakang server proxy web, seperti Nginx, dan membangun koneksi TLS, hanyalah dua contoh dari apa yang lebih bisa, dan bisa dibilang harus, dilakukan.
Gambar Docker kami tersedia di Amazon ECR dan siap untuk diterapkan. Kami sekarang dapat mengambilnya dan menyebarkannya secara manual. Namun, solusi yang lebih baik adalah mengotomatiskannya lebih lanjut. CI hanya langkah pertama, dan langkah selanjutnya adalah Pengiriman Berkelanjutan. Bagaimana dengan ketersediaan yang tinggi? Amazon AWS EC2 menyediakan fitur untuk mendaftarkan container di cloud pada lingkungan klaster yang wajib untuk layanan berbasis produksi. Contoh kerja yang baik untuk mengembangkan proses pengiriman berkelanjutan dapat ditemukan di posting blog AWS berikut.
Kesimpulan
Secara keseluruhan, kami telah menerapkan proses pengembangan perangkat lunak yang lancar dan bersih. Memanfaatkan alat yang tersedia, kami telah menciptakan infrastruktur yang membantu memaksimalkan produktivitas kami. Sekarang, kita tidak perlu khawatir tentang konfigurasi layanan Java kami yang merupakan layanan web sederhana dengan titik akhir REST. Kami membiarkan konvensi Spring Boot menangani semuanya dan hanya fokus pada logika layanan. Kami menggunakan Jenkins untuk membuat gambar Docker baru setiap kali kami memasukkan kode kami ke repositori Bitbucket Git kami, dan pada akhirnya, kami telah mengatur cloud untuk bertanggung jawab menyimpan gambar dan file Docker kami. Saat kami menerapkan layanan kami yang terkandung dalam gambar Docker, kami akan bebas dari batasan sistem operasi (selama sistem operasi memiliki mesin docker-engine
diinstal).