Winston is a highly experienced digital marketing professional, specializing in Cybersecurity, IT services, and Software as a Service (SaaS).
Xây dựng và triển khai ứng dụng một cách nhanh chóng, liên tục là thách thức lớn đối với nhiều đội phát triển phần mềm hiện nay. Quá trình này thường đòi hỏi nhiều công đoạn thủ công, tốn thời gian và dễ xảy ra lỗi. Đặc biệt khi làm việc với môi trường phức tạp như Amazon ECS, việc tự động hóa quy trình phát triển và triển khai trở nên cấp thiết hơn bao giờ hết.
Đó là lý do Jenkins CI/CD đã trở thành giải pháp được nhiều đội ngũ lựa chọn. Với khả năng tự động hóa toàn bộ quy trình từ kiểm thử, xây dựng đến triển khai, Jenkins giúp các nhóm phát triển tiết kiệm thời gian, giảm thiểu sai sót và tăng tốc chu kỳ phát hành sản phẩm.
Trong bài viết này, chúng ta hãy cùng tìm hiểu cách tạo CI/CD pipeline với Jenkins – giải pháp giúp tận dụng sức mạnh của cả Jenkins và nền tảng container hóa của Amazon.
Lợi ích của CI/CD
CI/CD tự động hóa quá trình kiểm thử và triển khai phần mềm. Việc áp dụng các pipeline CI/CD không chỉ giúp tối ưu hóa quy trình phát triển dự án phần mềm mà còn nâng cao hiệu quả và độ tin cậy của sản phẩm đầu ra.
Xem thêm cách bảo mật Ci/CD pipeline
Dưới đây là một số lợi ích chính khi áp dụng CI/CD:
1. Tích hợp code từng phần
CI/CD cho phép bạn tích hợp những commit code nhỏ ngay lập tức một cách liên tục. Nhờ đó, bạn có thể phát hiện và xử lý sớm các vấn đề tiềm ẩn, tránh phải chỉnh sửa nhiều về sau.
2. Tăng tốc độ phát hành
Với CI/CD, bạn có thể ra bản phát hành liên tục, thậm chí là nhiều lần trong ngày. Việc này đẩy nhanh đáng kể quá trình chuyển giao sản phẩm.
3. Cải thiện khả năng giám sát
Pipeline tự động tạo ra các log chi tiết ở mỗi giai đoạn. Việc ghi log kỹ lưỡng này giúp xác định nhanh chóng các vấn đề nếu chúng phát sinh.
4. Đơn giản hóa việc rollback
Khi code đã triển khai gặp sự cố, CI/CD cho phép rollback nhanh chóng và dễ dàng về phiên bản ổn định trước đó. Khả năng này rất quan trọng để duy trì sự ổn định và liên tục của hệ thống.
5. Giảm chi phí
Tự động hóa giúp giảm sự can thiệp thủ công vào các công việc lặp đi lặp lại. Nhờ đó, các đội phát triển và vận hành có thể tập trung hơn vào việc cải thiện sản phẩm thay vì những công việc nhỏ nhặt lặp đi lặp lại.
Xem thêm: GitOps là gì? Nên lựa chọn GitOps hay DevOps?
Các công cụ dùng khi triển khai Jenkins Pipeline trên Amazon ECS
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách xây dựng một pipeline CI/CD Jenkins sử dụng Amazon ECS. Dưới đây là tổng quan về các thành phần và công cụ chính mà chúng ta sẽ sử dụng:
1. GitHub
GitHub là nền tảng phát triển phần mềm đám mây phổ biến. Bạn có thể dùng nó để lưu trữ, quản lý và theo dõi các thay đổi code của các dự án của mình bằng Git. Trong dự án này, chúng ta sẽ dùng GitHub để lưu trữ repository chứa code ứng dụng Node.js.
2. AWS EC2 Instance
Amazon EC2 cung cấp các tính năng compute trên AWS. Nó cho phép chạy các máy chủ ảo. Chúng ta sẽ tạo một EC2 instance để cài đặt Jenkins và các thành phần phụ thuộc cần thiết.
3. AWS ECS
AWS ECS là dịch vụ đám mây có khả năng mở rộng và hiệu suất cao hỗ trợ Docker container. Nó được sử dụng để chạy và quản lý các ứng dụng phân tán ở quy mô lớn. Trong hướng dẫn này, ECS sẽ host phiên bản container của ứng dụng Node.js.
![ECS cho phép bạn triển khai các ứng dụng container nhanh chóng.](https://s.locker.io/resources/10143135/amazon-ecs.png)
4. AWS ECR
AWS ECR là registry cho các Docker container do AWS quản lý. Nó cho phép chúng ta lưu trữ, quản lý và triển khai Docker image. Bạn có thể tích hợp dễ dàng ECR với ECS, tạo nên một quy trình làm việc thuận tiện cho ứng dụng container của chúng ta.
5. AWS CLI
AWS CLI là công cụ cho phép tương tác với các dịch vụ AWS qua dòng lệnh. Trong hướng dẫn này, chúng ta sẽ dùng AWS CLI để quản lý các task và service trong AWS ECS.
6. Node.js và npm
Node.js là JavaScript runtime phía server, và npm là trình quản lý package đi kèm. Ở những bước dưới đây chúng ta sẽ thiết lập pipeline CI/CD cho ứng dụng Node.js, sử dụng Docker để container hóa ứng dụng.
7. Docker
Đây là nền tảng hàng đầu để container hóa ứng dụng, giúp dễ dàng tạo, triển khai và chạy chúng bằng container. Chúng ta sẽ dùng Docker để container hóa ứng dụng Node.js và quản lý image kết quả thông qua AWS ECR.
8. Jenkins
Jenkins là giải pháp hóa mã nguồn mở giúp lập trình viên tự động hóa việc build, test và triển khai ứng dụng một cách hiệu quả. Chúng ta sẽ cấu hình Jenkins để tự động hóa pipeline CI/CD, cải thiện quy trình phát triển ứng dụng Node.js trên AWS ECS.
Do Jenkins được viết bằng Java nên bạn sẽ cần nó trên EC2 instance để cài và chạy Jenkins.
Quy trình và các giai đoạn trong CI/CD
Quy trình
Quy trình CI và CD cho phép chúng ta tập trung vào phát triển, trong khi các công đoạn kiểm thử, build và triển khai được thực hiện tự động.
1. Continuous Integration (CI)
CI là giai đoạn đầu khi các developer thường xuyên merge những thay đổi code vào một kho lưu trữ trung tâm. Sau mỗi lần merge, code sẽ được tự động build và test. Quá trình này đảm bảo các đoạn code mới nhất hoạt động tốt và các build được tạo ra và lưu trữ một cách có hệ thống.
2, Continuous Delivery (CD)
Tiếp theo CI là giai đoạn CD, khi code đã được kiểm tra và xác nhận, sẽ được chuẩn bị để phát hành. CD đảm bảo phần mềm có thể được triển khai lên môi trường production bất cứ lúc nào. Giai đoạn này giúp quá trình chuyển từ dev sang deploy diễn ra suôn sẻ.
3. Continuous Deployment
Mở rộng từ CD, Continuous Deployment tự động hóa hoàn toàn quá trình phát hành. Mỗi thay đổi đã vượt qua tất cả các bước trong production pipeline sẽ tự động được triển khai thẳng tới người dùng mà không cần can thiệp thủ công. Cách tiếp cận này đảm bảo người dùng luôn được tiếp cận với các tính năng và bản sửa lỗi mới nhất.
Giai đoạn
Xây dựng một pipeline CI/CD hiệu quả trên Amazon ECS bao gồm nhiều giai đoạn quan trọng. Mỗi giai đoạn đều nhằm đảm bảo code mới nhất được build thành công và triển khai trơn tru.
Dưới đây là các stage thông thường trong một pipeline CI/CD:
1. Trigger
Pipeline có thể được kích hoạt theo 3 cách chính: theo lịch định sẵn, thủ công bởi developer, hoặc tự động khi có sự kiện cụ thể như git push lên repository.
2. Code Pull
Ở bước này, pipeline tự động lấy code mới nhất từ repository mỗi khi được kích hoạt. Điều này đảm bảo pipeline luôn làm việc với phiên bản code mới nhất.
3. Unit Test
Pipeline chạy các bài test được viết sẵn trong codebase, thường gọi là unit test. Bước này kiểm tra xem từng thành phần riêng lẻ của ứng dụng có hoạt động đúng không.
4. Build or Package
Sau khi vượt qua unit test, code sẽ được biên dịch thành artifact. Cụ thể, với ứng dụng dùng Docker, pipeline sẽ tạo Docker image.
5. Push or Store
Code đã build thành công hoặc Docker image được đẩy lên một kho lưu trữ như Artifactory hoặc Docker repository. Bước này lưu giữ an toàn các sản phẩm build để chuẩn bị cho việc triển khai.
6. Acceptance Test
Đây là giai đoạn quan trọng chạy các bài test để xác nhận phần mềm đáp ứng đúng yêu cầu và hoạt động như mong đợi. Bước này rất cần thiết để kiểm tra chức năng tổng thể của ứng dụng.
7. Deploy
Bước cuối cùng là triển khai ứng dụng lên môi trường thực tế. Đây có thể là môi trường production hoặc staging tùy theo cấu hình pipeline.
Chiến lược triển khai
Chiến lược triển khai xác định cách thức cập nhật các container của các microservice. Amazon ECS hỗ trợ nhiều chiến lược khác nhau, nhưng chúng ta sẽ tập trung vào hai loại phổ biến nhất.
Rolling Updates
Rolling Updates đảm bảo quá trình chuyển đổi diễn ra suôn sẻ với thời gian downtime tối thiểu. Phương pháp này dần dần thay thế các phiên bản task cũ bằng phiên bản mới trong ECS service.
ECS scheduler quản lý quá trình này bằng cách kiểm soát số lượng task được thêm hoặc xóa trong quá trình cập nhật, dựa trên cấu hình triển khai. Các tham số chính bao gồm:
- minimumHealthyPercent: Xác định số lượng task tối thiểu phải duy trì trạng thái hoạt động trong quá trình cập nhật. Ví dụ, nếu đặt 50% cho service đang chạy 4 task, scheduler có thể tắt tối đa 2 task hiện có trước khi khởi chạy các task mới.
- maximumPercent: Giới hạn số lượng task có thể được thêm vào vượt quá số lượng mong muốn trong quá trình triển khai. Ví dụ, nếu maximumPercent là 200% cho 4 task mong muốn, tối đa 8 task có thể chạy đồng thời trước khi các task cũ bị tắt.
Blue/Green Deployment
Phương pháp này hoạt động bằng cách khởi chạy phiên bản ứng dụng mới (green) song song với phiên bản hiện tại (blue) như một task set mới. Sau đó, traffic được chuyển hướng theo một trong các mô hình sau:
- Canary: Traffic được chuyển hướng theo tỷ lệ định sẵn theo các khoảng thời gian nhất định, bắt đầu với một phần trăm nhỏ người dùng và tăng dần lên 100%.
- Linear: Traffic được chuyển đổi có hệ thống theo tỷ lệ bằng nhau ở các khoảng thời gian đều đặn cho đến khi phiên bản mới hoạt động hoàn toàn.
- All-at-once: Phương pháp này chuyển hướng toàn bộ traffic từ phiên bản cũ sang phiên bản mới ngay lập tức, đơn giản nhất nhưng cũng rủi ro nhất.
Trong hướng dẫn này, chúng ta sẽ triển khai chiến lược rolling updates.
Triển khai CI/CD với Jenkins trên Amazon ECS
Tạo Docker image cho ứng dụng Node.js
Dưới đây là nội dung file Dockerfile cho ứng dụng Node.js mẫu. Bạn không cần copy-paste file này vì nó đã có sẵn trong repository git mẫu mà bạn đã clone trước đó.
Chúng ta hãy cùng tìm hiểu các dòng trong Dockerfile này:
FROM node:12.18.4-alpine
Đây sẽ là image cơ sở cho container của chúng ta.
WORKDIR /app
Thiết lập thư mục làm việc trong container.
ENV PATH /app/node_modules/.bin:$PATH
Gán đường dẫn /app/node_modules/.bin cho biến môi trường PATH.
COPY package.json ./
Copy file package.json vào thư mục làm việc của container.
RUN npm install
Cài đặt các dependencies.
COPY . ./
Copy toàn bộ files và folders cùng dependencies từ máy host vào container.
EXPOSE 3000
Cho phép truy cập cổng 3000 của container.
CMD ["node", "./src/server.js"]
Khởi chạy ứng dụng.
Cài đặt Github Repository
Tạo repository mới
Truy cập https://github.com/, đăng ký tài khoản nếu chưa có hoặc đăng nhập vào tài khoản hiện có và tạo repository mới. Bạn có thể đặt tên tùy ý, nhưng tốt nhất nên dùng cùng tên để tránh nhầm lẫn.
Sau khi tạo xong, bạn sẽ thấy màn hình hiển thị URL của repository. Hãy sao chép URL này và lưu lại, gọi nó là Github Repository URL.
Lưu ý: Bạn nên tạo một file text trên máy tính để ghi lại các thông tin cần thiết cho sau này.
Tạo Github Token
Token này dùng để xác thực. Nó sẽ thay thế mật khẩu khi sử dụng Git qua HTTPS, hoặc xác thực API qua Basic Authentication.
Đầu tiên, nhấp vào biểu tượng người dùng ở góc trên bên phải, chọn “Settings”, sau đó chọn “Developers settings” ở thanh bên trái như hình dưới.
Chọn “Personal access tokens” và nhấn “Generate new token” để tạo token mới. Tích vào ô “repo” để cấp quyền kiểm soát toàn bộ các private repositories. Bạn sẽ thấy token mới được tạo.
Clone sample repository
Dùng lệnh sau để kiểm tra thư mục hiện tại:
pwd
Lưu ý: Bạn đang ở thư mục home, tức là /home/ubuntu.
Clone sample repository chứa code mẫu:
git clone <https://github.com/shivalkarrahul/nodejs.git>
Tạo repository mới để thiết lập CI/CD pipeline:
git clone <https://github.com/shivalkarrahul/demo-nodejs-app.git>
Sao chép code từ repository nodejs sang repository demo-nodejs-app mới tạo:
cp -r nodejs/* demo-nodejs-app/
Chuyển đến thư mục làm việc mới:
cd demo-nodejs-app/
Lưu ý: Từ giờ trở đi, hãy ở nguyên thư mục này (/home/ubuntu/demo-nodejs-app/) và thực hiện các lệnh sau từ đây.
ls -l
git status
Push commit đầu tiên lên repository
Kiểm tra thư mục hiện tại, phải là /home/ubuntu/demo-nodejs-app/:
pwd
Thiết lập username cho git commit:
git config user.name "Rahul"
Thiết lập email cho git commit:
git config user.email "<[email protected]>"
Kiểm tra username và email vừa cài:
git config –list
Kiểm tra trạng thái, xem các file đã thay đổi hoặc thêm mới:
git status
Thêm file vào staging area:
git add .
Kiểm tra lại trạng thái:
git status
Commit với message:
git commit -m "My first commit"
Push commit lên remote repository:
git push
Thiết lập tài khoản AWS
Tạo IAM User có quyền truy cập Programmatic Access
Tạo một IAM user có quyền Programmatic Access trong tài khoản AWS của bạn. Nhớ lưu lại access key và secret key để tham khảo sau này. Cấp quyền administrator cho user này.
Chúng ta không cần quyền admin, nhưng để tránh các vấn đề về quyền hạn và cho mục đích demo, hãy tạm thời cấp quyền administrator.
Tạo ECR Repository
Tạo một ECR Repository trong tài khoản AWS của bạn. Ghi lại URL của nó để dùng về sau.
Tạo ECS Cluster
Vào ECS Console và nhấp “Get Started” để tạo cluster.
Nhấp nút “Configure” ở mục “custom” trong phần “Container definition”. Đặt tên container là “nodejs-container”, điền URL của ECR Repository vào ô “Image”, nhập port “3000” trong phần Port mappings, rồi nhấp “Update”. Bạn có thể đặt tên container tùy ý.
Bạn sẽ thấy các thông tin vừa nhập trong “Container definition”. Nhấp “Next” để tiếp tục.
Chọn “Application Load Balancer” trong phần “Define your service” rồi nhấp “Next”.
Giữ nguyên tên cluster là “default” và nhấp “Next”. Bạn có thể đổi tên cluster nếu muốn.
Kiểm tra lại cấu hình. Nếu mọi thứ đã đúng, nhấp “Create”. Quá trình tạo ECS Cluster sẽ bắt đầu. Sau vài phút, ECS cluster của bạn sẽ được tạo xong và Launch Status sẽ hiển thị.
Tạo EC2 Instance để cài đặt Jenkins Server
Tạo một EC2 Instance với AMI Ubuntu 18.04. Mở port 22 cho IP của bạn và port 8080 cho 0.0.0.0/0 trong Security Group.
Chúng ta dùng port 22 cho SSH, còn 8080 để truy cập Jenkins Server. Port 8080 cũng là nơi Github Webhook sẽ kết nối tới Jenkins Server, nên ta cần mở nó cho 0.0.0.0/0.
Cài đặt Jenkins trên EC2 Instance
Sau khi instance đã sẵn sàng, chúng ta sẽ cài đặt Jenkins cùng các dependencies cần thiết.
Chuẩn bị các yêu cầu tiên quyết trên EC2 Instance
Kiểm tra xem hệ điều hành của bạn có phải Ubuntu 18.04 LTS hay không:
cat /etc/issue
Kiểm tra RAM, cần tối thiểu 2 GB:
free -m
User đăng nhập vào server phải có quyền sudo. User “ubuntu” mặc định có quyền sudo trên EC2 instance tạo từ AMI “Ubuntu 18.04 LTS”.
Kiểm tra user hiện tại:
whoami
Cài đặt Java, JSON Processor jq, Nodejs/NPM và aws-cli
Cập nhật hệ thống:
sudo apt update
Cài đặt Java 11:
sudo apt search openjdk
sudo apt install openjdk-11-jdk
Cài đặt jq:
sudo apt install jq
Cài đặt Nodejs 12 và NPM:
curl -sL <https://deb.nodesource.com/setup_12.x> | sudo -E bash -
sudo apt install nodejs
Cài đặt AWS CLI:
sudo apt install awscli
Kiểm tra phiên bản các công cụ vừa cài đặt:
java -version
jq -version
node -version
npm -version
aws -version
Cài đặt Jenkins
Thêm repository của Jenkins vào hệ thống:
wget -q -O - <http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key> | sudo apt-key add -
sudo sh -c 'echo deb <http://pkg.jenkins-ci.org/debian> binary/ > /etc/apt/sources.list.d/jenkins.list'
Cập nhật và cài đặt Jenkins:
sudo apt-get update
sudo apt-get install jenkins
Kiểm tra trạng thái service Jenkins:
service jenkins status
Cài đặt Docker
Cài đặt các gói cần thiết:
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Thêm GPG key của Docker:
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Thêm repository của Docker:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] <https://download.docker.com/linux/ubuntu> $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cập nhật và cài đặt Docker:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Kiểm tra phiên bản Docker:
docker --version
Thêm user vào nhóm docker:
sudo groupadd docker
sudo usermod -aG docker ubuntu
sudo usermod -aG docker jenkins
Kiểm tra Docker với user ubuntu và jenkins:
docker run hello-world
sudo -i
su jenkins
docker run hello-world
exit
exit
Cấu hình Jenkins
- Sau khi cài đặt Jenkins xong, bước đầu tiên là lấy mật khẩu ban đầu với lệnh:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
- Truy cập Jenkins qua URL sau trên trình duyệt: h
ttp://<public-ip-của-ec2-instance>:8080
- Chọn “Install suggested plugins”.
- Tạo tài khoản admin mới bằng cách nhập username và password.
- Trường URL sẽ được điền tự động. Nhấn “Save and Finish” để tiếp tục. Vậy là Jenkins Server của bạn đã sẵn sàng. Bạn sẽ thấy dashboard như hình.
Cài đặt Plugins
Để cài các plugin cần thiết, nhấn vào “Manage Jenkins” ở panel bên trái.
Bạn cần cài các plugin sau:
- CloudBees AWS Credentials: Cho phép lưu trữ thông tin xác thực Amazon IAM trong Jenkins Credentials API.
- Docker Pipeline: Plugin này cho phép build, test và sử dụng Docker images từ Jenkins Pipeline.
- Amazon ECR: Tích hợp với AWS Elastic Container Registry (ECR).
- AWS Steps: Thêm các bước tương tác với AWS API vào pipeline.
Trong tab “Available”, tìm kiếm các plugin trên và chọn “Install without restart”. Sau khi cài đặt thành công, bạn sẽ thấy màn hình như hình dưới đây.
Tạo thông tin xác thực trong Jenkins
Chúng ta sẽ dùng plugin CloudBees AWS Credentials trong bước này. Vào “Manage Jenkins”, sau đó chọn “Manage Credentials”.
Nhấp vào “(global)” rồi “Add credentials”.
Chọn Kind là “AWS Credentials” và đặt ID là “demo-admin-user”. Bạn có thể đặt tên khác, nhưng hãy ghi chú lại ID này. Nhập Access Key và Secret Key của IAM user đã tạo trước đó. Nhấn “OK” để lưu thông tin đăng nhập IAM.
Lặp lại các bước trên, lần này chọn Kind là “Username with password” để lưu Github Username và Token. Nhấn “OK” để lưu thông tin đăng nhập Github. Bây giờ bạn đã có credentials cho cả IAM và Github trong Jenkins.
Tạo một job trong Jenkins
Từ dashboard chính, nhấp “New Item” để tạo Jenkins Pipeline mới. Chọn “Pipeline” và đặt tên là “demo-job” hoặc tên khác tùy ý.
Ở tab “General”, tích chọn “Github project” và nhập URL của repository GitHub. Ở tab “Build Trigger”, tích chọn “Github hook trigger for GitScm polling”.
Ở tab “Pipeline”, chọn “Pipeline script from the SCM”, nhập URL repository và chọn credential Github đã tạo. Kiểm tra tên branch phù hợp với branch bạn sẽ commit. Xem lại cấu hình và nhấn “Save”.
Bây giờ bạn đã thấy pipeline vừa tạo.
Tích hợp Github và Jenkins
Bước tiếp theo là tích hợp Github với Jenkins để kích hoạt Jenkins job mỗi khi có event trên repository GitHub của bạn.
Vào tab Settings của repository, chọn “Webhooks” ở panel bên trái. Nhấp “Add webhook”.
Nhập Jenkins URL với đuôi “/github-webhook/”. URL sẽ có dạng: http://<IP-của-bạn>:8080/github-webhook/
Bạn có thể chọn các event mong muốn, nhưng để đơn giản chúng ta chọn “Send me everything”. Đảm bảo đã tích chọn “Active”. Nhấn “Add webhook” để tạo webhook. Bạn sẽ thấy webhook mới tạo. Nhấp vào để kiểm tra cấu hình.
Chọn tab “Recent Deliveries”, bạn sẽ thấy dấu tích xanh. Điều này cho thấy webhook đã kết nối thành công với máy chủ Jenkins của chúng ta.
Deploy ứng dụng Node.js lên ECS Cluster
Trước khi kích hoạt Pipeline từ Github Webhook, chúng ta sẽ thử chạy thủ công.
Chạy Job thủ công
Truy cập vào Job đã tạo và chọn Build. Khi xem log, bạn sẽ thấy có lỗi. Nguyên nhân là chúng ta chưa gán giá trị cho các biến trong Jenkinsfile.
Push commit thứ hai
Từ giờ trở đi, đừng thay đổi thư mục làm việc. Giữ nguyên ở thư mục /home/ubuntu/demo-nodejs-app và chạy tất cả lệnh từ đây.
Gán giá trị cho các biến trong Jenkinsfile
Để khắc phục lỗi trên, bạn cần sửa Jenkinsfile. File này có các biến cần gán giá trị để deploy ứng dụng lên ECS cluster. Hãy gán giá trị phù hợp cho các biến có “CHANGE_ME”.
cat Jenkinsfile
Dưới đây là danh sách các biến cần điền:
- AWS_ACCOUNT_ID: Số tài khoản AWS của bạn
- AWS_DEFAULT_REGION: Region bạn tạo ECS Cluster
- CLUSTER_NAME: Tên ECS Cluster đã tạo
- SERVICE_NAME: Tên Service trong ECS Cluster
- TASK_DEFINITION_NAME: Tên Task trong ECS Cluster
- DESIRED_COUNT: Số lượng task muốn tạo trong ECS Cluster
- IMAGE_REPO_NAME: URL của ECR Repository
- IMAGE_TAG và REPOSITORY_URI: Giữ nguyên
- registryCredential: Tên credentials trong Jenkins chứa AWS Access Key và Secret Key
Kiểm tra trạng thái để xác nhận file đã được thay đổi:
git staus
cat Jenkinsfile
Thêm file vào staging area, commit và push lên GitHub:
git status
git add Jenkinsfile
git commit -m "Assigned environment specific values in Jenkinsfile"
git push
Lỗi trên Jenkins Server
Sau khi push commit trên, giờ đây Jenkins Pipeline của chúng ta sẽ được kích hoạt. Tuy nhiên, bạn sẽ thấy lỗi “Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock” trong Jenkins Job.
Lý do là user “jenkins” không có quyền tạo docker objects. Chúng ta đã thêm user này vào group “docker” ở bước trước, nhưng chưa khởi động lại Jenkins service.
Để khắc phục lỗi trên, trước tiên hãy khởi động lại Jenkins service và kiểm tra service đó đã chạy chưa:
sudo service jenkins restart
sudo service jenkins status
Push commit thứ ba
Thay đổi file README.md để kiểm tra Pipeline có tự động kích hoạt không:
vim README.md
Sau đó, thêm, commit và push file này:
git status
git diff README.md
git add README.md
git commit -m "Modified README.md to trigger the Jenkins job after restarting the Jenkins service"
git push
Kiểm tra Jenkins job đã được kích hoạt tự động chưa bằng cách vào giao diện của job trên dashboard của Jenkins.
Xem Stage View để thấy các stage đã định nghĩa trong Jenkinsfile.
Kiểm tra trạng thái Task trong ECS Cluster
Vào Cluster, chọn tab “Tasks”, mở Task đang chạy.
Xem tab “JSON”, kiểm tra image tag khớp với Jenkins Build number.
Truy cập URL của ELB để kiểm tra ứng dụng Nodejs. Bạn sẽ thấy dòng chữ này sau khi nhấn vào đường dấn ELB.
Push commit thứ tư
Sửa file “src/server.js” để test lại CI/CD Pipeline:
vim src/server.js
Kiểm tra và commit thay đổi với cách lệnh sau:
git status
git diff src/server.js
git add src/server.js
git status
git commit -m "Updated welcome message"
git push
Tới mục Task trong giao diện Jenkins. Bạn sẽ thấy 2 task đang chạy do chiến lược deploy mặc định là rolling-update (một phiên bản cũ, một của phiên bản mới).
Đợi 2-3 phút, sẽ chỉ còn 1 task mới nhất chạy.
Truy cập lại ELB URL để xem thay đổi. Bây giờ bạn đã có một Jenkins CI/CD Pipeline để triển khai ứng dụng Nodejs container trên AWS ECS mỗi khi có thay đổi trong source code trên GitHub.
Dọn dẹp
Nếu bạn chỉ đang thử nghiệm về CI/CD pipeline và không còn cần đến nữa, nhớ xóa các tài nguyên đã tạo để tránh phát sinh chi phí không cần thiết. Dưới đây là danh sách những thứ cần xóa trong quá trình thiết lập pipeline này:
- Github Repository
- Github Token
- IAM User
- EC2 Instance
- ECR Repository
- ECS Cluster
- Task Definition
Những câu hỏi thường gặp
Có cần kiến thức lập trình để thiết lập pipeline CI/CD không?
Không hẳn. Nếu bạn sử dụng công cụ có giao diện đồ họa, bạn có thể tạo CI CD Pipeline chỉ bằng cách cấu hình trên giao diện. Tuy nhiên, bạn cần hiểu biết cơ bản về scripting để tự động hóa các tác vụ hoặc thực thi lệnh.
Tại sao nên sử dụng CI/CD với Docker?
CI/CD giúp tự động hóa quy trình phát triển phần mềm sử dụng Docker và tăng chu kỳ phát hành cho các ứng dụng dựa trên microservice.
Tại sao nên dùng Amazon ECS cho Jenkins pipeline?
Amazon ECS (Elastic Container Service) là nền tảng có khả năng mở rộng cao và hiệu suất tốt để chạy các ứng dụng container hóa như Jenkins. ECS giúp đơn giản hóa việc quản lý Docker container và tích hợp với các dịch vụ AWS khác.
Làm thế nào để xử lý cấu hình và dữ liệu Jenkins trên ECS?
Hãy sử dụng các dịch vụ AWS như EFS (Elastic File System) hoặc EBS (Elastic Block Store) để lưu trữ dữ liệu và cấu hình Jenkins khi container khởi động lại. Bạn có thể mount các drive này vào container Jenkins thông qua task definition của ECS.
Tôi có thể scale Jenkins trên ECS không?
Có, ECS hỗ trợ auto-scaling để tự động điều chỉnh số lượng container đang hoạt động dựa trên nhu cầu. Bạn có thể cấu hình các chính sách auto-scaling dựa trên các chỉ số như CPU và bộ nhớ để tự động mở rộng Jenkins.
Lời kết
Trong bài viết này, Locker đã hướng dẫn cách tạo CI/CD pipeline với Jenkins để triển khai một ứng dụng Nodejs lên AWS ECS. Đây là lựa chọn tốt cho đội ngũ phát triển phần mềm để cải thiện quá trình phát hành phần mềm và tránh lỗi do con người. Chúng tôi hy vọng bài viết này đã giúp bạn hiểu thêm về vấn đề này để có thể áp dụng vào trong công việc của mình.