ตั้งแต่วันที่ 29 กันยายน ถึง 1 ตุลาคม มีโอกาศมาแบ่งปันที่เชียงใหม่
ในงาน Give and Take :: Agile for Software Development
ซึ่งครั้งที่จัดที่ CAMT (College of Arts, Media and Technology )
โดยครั้งนี้ทำการติดตั้งและ configuration ระบบ Continuous Integration Server ด้วย Jenkins ไว้
เลยนำมาสรุปไว้นิดหน่อย
เริ่มจาก Infrastructure ที่ใช้คือ Digital Ocean
ซึ่งใช้เพียง 1 instance หรือ 1 droplet เท่านั้น
โดยสิ่งที่นำมาใช้เพิ่มเติมคือ Docker
สำหรับการสร้าง container ของส่วนต่าง ๆ ในระบบงาน
ประกอบไปด้วย
- Container Jenkins Server
- Container Nginx สำหรับ deploy ระบบ web application ที่พัฒนาด้วย React
- Container NodeJS สำหรับ deploy ระบบ backend ที่พัฒนาด้วย NodeJS
- Container MongoDB สำหรับ database ของระบบ
- Container Google Chrome สำหรับการทดสอบ UI testing บน Google Chrome
มาดูการสร้าง Container Jenkins Server
จะใช้ image Jenkins LTS
ทำการสร้างด้วยคำสั่ง
$docker container run -d -p 8080:8080 --name ci jenkins/jenkins:lts จากนั้นทำการดึงค่า Admin Password มาใช้ในขั้นตอนติดตั้ง $docker container exec -it ci cat /var/jenkins_home/secrets/initialAdminPassword
เพียงเท่านี้ก็ได้ Jenkins Server มาใช้แบบง่าย ๆ แล้ว
ต่อจากนี้ยากหมดเลย !!
ทำการสร้าง Job หรือขั้นตอนการทำงานแบบอัตโนมัติง่าย ๆ ดังนี้
1. Frontend ที่พัฒนาด้วย React
2. Backend ที่พัฒนาด้วย NodeJS
3. ทำการสร้าง MongoDB Database ขึ้นมาใหม่
4. ทำการทดสอบ UI Test ผ่าน Google Chrome ด้วย Robotframework
ทั้ง 4 ข้อนี้จะทำตามลำดับดังนี้
1. ทำการสร้าง MongoDB container ขึ้นมา
โดยสร้างแบบน่าเกลียดสุด ๆ ดังนี้
$docker container run -d --name mongo mongo:3.5.13-jessie
ปล. อย่าไปใช้บน production server นะ !!
2. ทำการสร้าง Backend container สำหรับ NodeJS
ในส่วนนี้เป็น RESTFul API พัฒนาด้วย NodeJS
ซึ่งในครั้งนี้ทีมเลือกใช้ expressjs library
มีข้อตกลงกันคือ ต้องทำการเขียนชุดการทดสอบด้วย
ดังนั้นจึงทำการสร้าง Docker Image ใหม่ขึ้นมา
เขียนใน Dockerfile ได้ดังนี้
คำอธิบาย
- ทำการ copy ไฟล์ package.json ซึ่งเป็นไฟล์ config สำหรับ project
- ทำการ copy ไฟล์ต่าง ๆ จาก folder src
- ทำการ install library ต่าง ๆ ด้วย npm install
- ทำการทดสอบด้วย npm test
- ทำการ start ระบบงานแบบง่าย ๆ ถ้างานจริงแนะนำให้ใช้ pm2 นะ
ทำการสร้าง image ใหม่ชื่อว่า backend และ สร้าง container ดังนี้
docker image build -t backend . $docker container run -d --name backend --link mongo backend
3. ทำการสร้าง Frontend container สำหรับ ReactJS
ในส่วนนี้ผมทำการแยกส่วนของการ compile และ build แยกออกมา
โดยในการสร้าง frontend container จะใช้ nginx
ซึ่งการ deploy นั้นทำง่าย ๆ คือ
ทำการ copy ไฟล์ทั้งหมดใน folder build ไปยัง folder /usr/share/nginx/html
เขียนใน Dockerfile ได้ดังนี้
ทำการสร้าง image ใหม่ชื่อว่า frontend และ สร้าง container ดังนี้
docker image build -t frontend . $docker container run -d --name frontend -p 80:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf --link backend frontend
สิ่งที่เพิ่มเข้านิดหน่อยคือ
ทำการ config nginx ให้เป็น reverse proxy นิดหน่อย
สำหรับ REST API นั่นเอง ซึ่ง api จะขึ้นด้วย /api
ตัวอย่างการ config ง่าย ๆ เป็นดังนี้
เพียงเท่านี้เราก็ได้ระบบ Continuous Integration และ Deployment แบบง่าย ๆ แล้วนะครับ
แต่งานจริง ๆ ยังต้องปรับปรุงอีกเยอะเลย
ขอให้สนุกกับการ coding ครับ