Jenkins & Gradle for CI
ที่ผ่านมาเรามี Amazon EC2 Instance ที่ติดตั้ง Jenkins ลงไปแล้ว บทความนี้นำเสนอโปรเจกต์ที่เขียนด้วย Java และใช้ Build Tool อย่าง Gradle มาทำ CI กันครับ
รู้จักกับ Amazon EC2
ก่อนจะวิ่งทางไกล เรามาดูว่ารถยนต์ของเราพร้อมแค่ไหน เราต้องการ Docker สักตัวทำตัวเป็น server และโอกาสนี้เราเลือก Amazon EC2
ติดตั้ง Jenkins บน Amazon EC2
เมื่อได้รถแล้วจึงเตรียมสัมภาระสำหรับเดินทาง กระเป๋าใบใหญ่นั่นเอามานี่
บทความ part ข้างต้นได้ติดตั้ง Maven และ Maven (for Jenkins) Plugin ลงไปด้วย จะทำตามหรือไม่ก็ได้ หัวใจคือการติดตั้ง Jenkins เท่านั้น ดังนั้นสามารถข้ามส่วนที่เป็น Maven และ Maven (for Jenkins) Plugin ไปได้
ติดตั้ง Gradle (for Jenkiins) Plugin
รถออกวิ่งได้สักพักแล้ว ตอนนี้ก็แวะเติมอาหารลงท้องกันหน่อย มือหลักนี้คือ Gradle Plugin ครับ หาได้จากเมนู Manage Jenkins > Manage Plugins จากนั้นหาในแท็บ Available โดย Filter ไปว่า gradle
ทว่าผมได้ติดตั้งสำเร็จแล้ว ดังนั้นหากดูที่แท็บ Installed ณ หน้าเดียวกันนี้ จะเป็นแบบนี้
สร้างโปรเจกต์ Gradle
ตรงไปที่เมนู New Item > Freestyle project
ผมขอใช้โปรเจกต์ของน้องฝึกงานมาสาธิตให้ชมกันนะ ผมตั้งชื่อมันว่า op-api
รายละเอียดของโปรเจกต์ op-api นี้คือ
- ใช้ Spring Boot เวอร์ชัน 2
- ใช้ Gradle เป็น Build Tool
- เขียนด้วยภาษา Java
- ใช้ Git และ GitHub เป็นแหลงเก็บ source code
เพื่อนๆใช้หรือหาโปรเจกต์ลักษณะเดียวกันทดสอบนะครับ ผลลัพธ์จะได้ไม่ผิดพลาด
ส่วนของ source code management ผมแปะ path ของ Git ลงไป
กำหนด credentials ให้เรียบร้อย (username & password)
ส่วนของ Build ผลสืบเนื่องจาก Gradle Plugin ที่ได้ติดตั้งลงไป เลือก Invoke Gradle script
จะได้หน้าตา
เสร็จแล้วบันทึกไว้ก่อน ภายหลังส่วนนี้ค่อยกลับมาเพิ่มเติมอีกที
ติดตั้ง Gradle บน Amazon EC2 Instance
โอ๊ะโอ๋~น้ำมันรถหมด ได้เวลาเข็นกันแล้ว อีก 2 กิโลเมตรข้างหน้านั่นไงจุดหมายของเรา
remote ไปยัง server ที่ได้ลง Jenkins ไว้
sudo ssh -i ~/Downloads/ec2-red-hat-t2micro-devops.pem ec2-user@X.X.X.X
แสดงตนเป็น root
sudo su -
มองหาแหล่งเก็บ .zip
cd /optls
เราต้องการ Gradle ตัวเป็นๆมาขังไว้ตรงนี้ ดังนั้น เปิด Browser แล้ว Google หาก่อน
gradle install
เลื่อนลงมา หาหัวข้อ Installing manually คลิก Download
ผมมองหาเวอร์ชันที่คุ้นเคย ผมขอเลือก 5.6.2 นะครับ
จากนั้นมองหาลิงก์ binary-only คลิกเข้าไป
มันจะโหลดลงเครื่องเราทันที ให้ cancel ไปก่อน จากนั้นคลิกขวาที่ลิงก์ direct link เลือก copy link address ตามภาพด้านล่าง
กลับมาที่ Amazon EC2 Instance ที่ได้ลง Jenkins ไว้ (ต่อจากเมื่อกี้) แน่ใจว่าเราอยู่ที่
/opt
จัด
wget https://services.gradle.org/distributions/gradle-5.6.2-bin.zip
แตก .zip ด้วย unzip แต่เครื่องนี้ไม่ได้ติดตั้ง unzip ไว้ เช่นนั้นติดตั้งมันก่อน
yum install unzip
แล้วดึงดาว
unzip gradle-5.6.2-bin.zip
ได้แล้ว
กลับไปบอกกับ OS ว่า gradle-5.6.2/bin อยู่ที่ไหน ด้วยการใช้โปรแกรม vi เปิดไฟล์ .bash_profile
จากนั้นเพิ่ม path ของ Gradle ซะ
vi ~/.bash_profile
บันทึกแล้ว reload
source ~/.bash_profile
ทดสอบเรียก
gradle -version
ในเมื่อเครื่องมี Gradle พร้อมแล้ว ขั้นตอนถัดมาคือเอาเรื่องนี้ไปบอก Jenkins
Jenkins Global Tool Configuration
ที่เมนู Manage Jenkins > Global Tool Configuration
- name ตั้งเอาเลยตามใจฝัน
- GRADLE_HOME ระบุไปยัง path ที่เราทำเอาไว้
ตามนี้
บันทึกแล้วกลับมาที่โปรเจกต์
เลือกเมนู Configure
ส่วนของ Build ที่จัดการไม่แล้วเสร็จ ให้ทำต่อ
- Gradle Version เลือกชื่อ Gradle ตามที่ตั้งไว้ในขั้นตอน Jenkins Global Tool Configuration
- และ Tasks ใส่คำสั่งไปว่า
build
บันทึก
เป็นอันว่าเราครบถ้วนแล้วใน part ของ CI
กลับไปที่โปรเจกต์แล้วกดเมนู Build Now ให้เวลาสักพักใหญ่เพื่อโหลด dependencies ของ Spring Boot อาจครึ่งชั่วโมงหรือเป็นชั่วโมงหากว่านี่เป็นครั้งแรกที่ build นะครับ (ค่าใช้จ่ายมาเต็มแน่ๆ)
ลาด้วยภาพแห่งการรอคอย
หมายเหตุ โปรเจ็กต์ Spring Boot จะสามารถ build เป็น .war ได้ก็ต่อเมื่อได้เพิ่ม war plugin ลงไปในไฟล์ build.gradle
plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
id 'war'
}
สมมติถ้าอยาก restart jenkins ล่ะ? คำตอบ ไปรันทีละคำสั่งต่อไปนี้
service jenkins stopservice jenkins start