Trong khi phát triển một ứng dụng Spring boot sử dụng ngôn ngữ Kotlin với docker phải thông qua quá trình build mới có thể start được server cho nên khi phát triển sẽ sửa code liên tục cần nó tự động nhận code mới. Vậy trong bài viết này sẽ giới thiệu qua về giải pháp tận dụng một công cụ entr để lắng nghe khi file thay đổi sẽ trigger rebuild và start lại server. Để mô phỏng thực tế sẽ build một ứng dụng RESTful sử dụng Spring boot, Kotlin với Gradle là quan lý dependencies trong môi trường của Docker.
Spring boot
Spring boot giúp tạo stand-alone dựa trên ứng dụng Spring mà chỉ cần chạy với cấu hình đơn giản trong đó có những đặc điểm sau:
- Tạo ứng dụng Spring stand-alone
- Chạy trực tiếp Embed Tomcat, Jetty hoặc Undertow
- Cung cấp các dependencies 'starter' để đơn giản hóa xây dựng cấu hình
- Tự động cấu hình Spring và thư viện thứ 3 bất kỳ lúc nào
- Cung cấp tính năng sẵn production như metrics, health checks và cấu hình bên ngoài
- Tuyệt đối không sinh ra code và không yêu cầu cấu hình XML
Init project
- Tạo project mới với Intellij IDEA
- Điền các thông tin về Spring Artifcat, Gradle, Kotlin, Java: 8
- Chọn dependencies
Spring Web
- Chọn thư mục lưu project
- Chờ đợi nó tự build lần đầu các dependencies trong
build.gradle.kts
- Tạo một
HomeController
để test project đã chạy ok chưa
Build Dockerfile
Phần này chúng sẽ sử dụng multi-stage để build Dockerfile
Docker image ubuntu:18.04
Phần này sẽ là môi trường tạm để build entr
trong đó cần
- package
build-essential curl
là công cụ cơ bản cần thiết. curl http://eradman.com/entrproject/code/entr-4.7.tar.gz | tar -xz -C /tmp/
tải source rồi extract vào thư mục/tmp
- Tiếp đến vào thư mục nãy để chạy các command build
entr
:cd /tmp/entr-4.7 && ./configure && make test && make install
sau khi xong nó sẽ được sinh ra ở thư mục/usr/local/bin/entr
Docker image gradle:6.7.1-jdk8
Phần này đóng vài trò build project và lắng nghe sự thay đổi các file
COPY --from=entr_builder /usr/local/bin/entr /usr/local/bin
thực hiện copy từ stage trước sang image gradle- Đoạn code dưới có nhiệm vụ dừng lại server, xóa các daemon gradle đã stop và cuối cùng build & start lại server
RUN echo $'gradle --stop \n\
rm -r /home/gradle/.gradle/daemon \n\
echo "Stop server ..." \n\
echo "Start server ..." \n\
gradle bootRun' > /usr/local/bin/precompile
RUN echo 'find . -type f \( -name "*kt" \) | entr -r precompile' > /usr/local/bin/watchfile
đóng vài trò lắng nghe sự kiện thay đổi file và gọi lại đếnprecompile
trên.
Build docker-compose.yml
Phần này mô tả về các service mà cần chạy trong docker
kt_service
là service chứa các code được gán volumework
của container với thư mục project.command: /bin/bash -c 'watchfile'
là command khi dùngdocker-compose up
sẽ gọi đếnwatchfile
đã viết trong Dockerfile thực hiện lắng nghe.
Với lần đầu cần sử dụng command
docker-compose up --build
để build image, container, volumne từ Dockerfile
Sau khi chạy docker-compose up --build
sẽ có log như sau:
Chứng to rằng đã chạy thành công.
HomeController test
Chúng ta sẽ thử vào url http://localhost:8080
sẽ cho output
Tiếp đến sửa đổi code từ Alive
sang Die
và quan sát
- Trong terminal log có đoạn
Stop server ...
vàStart server ...
củaprecompile
nghĩa là nó được rebuild và start lại với> Task :bootRun
- Trong trình duyệt hãy reload trang sẽ có output
Kết luận
Theo các bước đã mô tả nhận thấy khi thay đổi phần code chúng ta không cần gõ manual các command như:
docker-compose down
gradle --stop && rm -r /home/gradle/.gradle/daemon && gradle bootRun
docker-compose up
Để thực hiện nhận sự thay đổi mà nó đã tự động nhận.
Cảm ơn các bạn đã đọc bài viết của minh. (bow)