Bài hướng dẫn này sẽ đưa bạn từng bước thiết lập quy trình CI/CD để triển khai một ứng dụng Spring Boot được đóng gói bằng Docker lên AWS. Chúng ta sẽ tạo một Dockerfile, build image, đẩy nó lên AWS Elastic Container Registry (ECR), và triển khai thông qua AWS Elastic Container Service (ECS).
Step 1: Tạo Dockerfile
Trong thư mục gốc của dự án, hãy tạo một Dockerfile
cho ứng dụng Spring Boot. File này sẽ giúp Docker đóng gói ứng dụng thành Docker image
Dockerfile
FROM maven:3.8.3-openjdk-17 as build
WORKDIR ./src
COPY . .
RUN mvn install -DskipTests=true
FROM openjdk-17
RUN unlink /etc/localtime;ln -s /usr/share/zoneinfo/Asia/Ho_Chi_Minh /etc/localtime
COPY --from=build src/target/filename.jar /run/filename.jar
EXPOSE 8080
ENV JAVA_OPTIONS="-Xmx2048m -Xms256m"
ENTRYPOINT java -jar $JAVA_OPTIONS /run/filename.jar
Step 2: Tạo một Repository trên ECR
Trong AWS Management Console:
- Truy cập Amazon ECR
- Chọn Create Repository
- Nhập tên cho repository của bạn (ví dụ: springboot-app)
- Chọn quyền truy cập là Private và nhấn Create Repository
Ghi lại URI của repository (ví dụ: 471112792443.dkr.ecr.ap-south-1.amazonaws.com/springboot-app), vì nó sẽ được sử dụng trong cấu hình build
Step 3: Tạo tệp Buildspec
File buildspec.yml
được AWS CodeBuild sử dụng để định nghĩa các lệnh và giai đoạn build. Đặt file này ở thư mục gốc của dự án
version: 0.2
phases:
pre_build:
commands:
- mvn clean install
- echo Logging in to Amazon ECR...
- aws --version
- REPOSITORY_URI=471112792443.dkr.ecr.ap-south-1.amazonaws.com/springboot-app
- aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin $REPOSITORY_URI
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":"course-service","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- echo Writing image definitions file...
- DOCKER_CONTAINER_NAME=springboot-app
- printf '[{"name":"%s","imageUri":"%s"}]' $DOCKER_CONTAINER_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- echo $DOCKER_CONTAINER_NAME
- echo printing imagedefinitions.json
- cat imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
- target/filename.jar
Giải thích:
Pre-Build: Cài đặt các phụ thuộc, đăng nhập vào ECR và thiết lập các biến cho thẻ image.
Build: Xây dựng Docker image và gắn thẻ cho nó.
Post-Build: Đẩy Docker image lên ECR và tạo tệp imagedefinitions.json
để triển khai.
Step 4: Tạo một Dự án CodeBuild cho CI
- Truy cập AWS CodeBuild
- Chọn Create Project
- Đặt tên cho dự án và chọn GitHub làm nguồn, kết nối với repository của bạn
- Chọn Managed Image làm môi trường và chọn một image có hỗ trợ Docker (ví dụ:
aws/codebuild/standard:5.0
)
- Thêm các biến môi trường cần thiết và chỉ định
buildspec.yml
làm cấu hình build
- Dưới mục Artifacts, chọn
imagedefinitions.json
CodeBuild sẽ xây dựng Docker image và đẩy nó lên ECR mỗi khi mã nguồn được đẩy lên GitHub
Step 5: Triển khai ứng dụng sử dụng AWS ECS
- Trong ECS, tạo một cluster mới.
- Tạo một task definition với cấu hình container của bạn.
- Đặt image thành ECR image URI được tạo bởi CodeBuild.
- Định nghĩa service của bạn và triển khai nó.
Step 6: Kiểm tra việc triển khai
Truy cập URL của dịch vụ ECS và thêm /swagger-ui/index.html
để truy cập Swagger UI của ứng dụng đã triển khai.
Ví dụ URL:
http://65.0.69.103:8080/swagger-ui/index.html
Step 7: Kích hoạt quy trình CodeBuild thủ công
Thực hiện một thay đổi nhỏ trong repository GitHub của bạn và đẩy nó lên. Dự án CodeBuild sẽ tự động kích hoạt, xây dựng lại và đẩy Docker image đã cập nhật.
Xác minh Webhook
Để kiểm tra xem webhook đã được thiết lập đúng chưa, thực hiện thay đổi mã, commit và đẩy lên. Quy trình sẽ tự động bắt đầu, triển khai phiên bản mới nhất lên ECS.
Trên đây là các bước để bạn có thể thiết lập CI/CD dự án springboot trên ECR. Nếu có ý kiến gì mọi người cứ hỏi mình nha.