Nếu bạn vẫn đang xây dựng và cung cấp các ứng dụng phần mềm của mình theo cách truyền thống thì bạn đang bỏ lỡ một sự đổi mới đầy đột phá trong Quy trình phát triển phần mềm (Software Development Process ) hoặc Vòng đời phát triển phần mềm (Software Development Life Cycle). Để làm rõ hơn vấn đề này, bài viết này sẽ chia sẻ “Cách tạo CI CD Pipeline với Jenkins, Containers và Amazon ECS” để triển khai ứng dụng và khắc phục những hạn chế của mô hình phân phối phần mềm truyền thống. Sự đổi mới này ảnh hưởng rất nhiều đến thời hạn, thời gian phát hành ra thị trường, chất lượng của sản phẩm, v.v. Bài viết này cũng sẽ hướng dẫn bạn toàn bộ quy trình từng bước thiết lập CI CD Docker pipeline cho một ứng dụng Nodejs mẫu.
Một CI CD Pipeline hoặc Continuous Integration/ Continuous Delivery Pipeline là một tập hợp các chỉ dẫn để tự động hóa quy trình kiểm tra, xây dựng và triển khai Phần mềm. Dưới đây là một số lợi ích của việc triển khai CI CD.
- Thay đổi Code nhỏ hơn
CI CD Pipelines cho phép tích hợp một đoạn code nhỏ tại một thời điểm, từ đó giúp các nhà phát triển nhận ra bất kỳ vấn đề tiềm ẩn nào trước khi hoàn thành tất cả công việc.
- Phát hành nhanh hơn
Việc phát hành nhiều lần hàng ngày hoặc phát hành liên tục có thể trở thành hiện thực bằng cách sử dụng CI CD Pipelines.
- Khả năng quan sát
Khả năng tự động hóa tại chỗ để tạo ra các logs mở rộng trong từng giai đoạn của quá trình phát triển giúp truy xuất nguyên nhân nếu có sự cố xảy ra.
- Khôi phục dễ dàng hơn
Trong nhiều trường hợp, có khả năng code đã được triển khai có vấn đề. Trong những trường hợp như vậy, điều quan trọng là phải quay lại bản phát hành hoạt động trước đó càng sớm càng tốt. Một trong những lợi thế lớn nhất của việc sử dụng CI CD Pipelines là bạn có thể nhanh chóng và dễ dàng quay trở lại phiên bản làm việc trước đó.
- Giảm chi phí
Việc có tự động hóa tại chỗ cho các nhiệm vụ lặp đi lặp lại giúp giảm thời gian mà Nhà phát triển và Vận hành dành cho Phát triển sản phẩm.
Đây chỉ là một vài lợi ích của việc sở hữu CI CD Pipelines cho việc xây dựng và triển khai.
Trước khi chúng ta tiến hành các bước để thiết lập CI CD Pipeline với Jenkins, Containers và Amazon ECS, hãy cùng xem chúng tôi sẽ sử dụng những công cụ và công nghệ nào.
CI CD Docker Tool Stack
- Github
Đây là ứng dụng web-based hoặc dịch vụ cloud-based, nơi mọi người hoặc nhà phát triển cộng tác, lưu trữ và quản lý mã ứng dụng của họ bằng Git. Chúng tôi sẽ tạo và lưu trữ mã ứng dụng Nodejs mẫu của chúng tôi tại đây.
- Phiên bản AWS EC2
AWS EC2 là Dịch vụ máy tính đàn hồi (Elastic Computer Service) do Amazon Web Services cung cấp, được sử dụng để tạo Máy ảo (Virtual Machines) hoặc Virtual Instances (Phiên bản ảo) trên Đám mây AWS. Chúng tôi sẽ tạo một phiên bản EC2 và cài đặt Jenkins và các phụ thuộc khác trong đó.
- Java
Điều này sẽ được yêu cầu để chạy Máy chủ Jenkins.
- AWS CLI
aws-cli hay AWS Command Line Interface là một công cụ dòng lệnh được sử dụng để quản lý Dịch vụ AWS bằng cách sử dụng các lệnh. Chúng tôi sẽ sử dụng nó để quản lý AWS ECS Task và ECS Service.
- Nodejs và Npm
Nodejs là một môi trường chạy JavaScript back-end và Npm là một gói quản lý cho Node. Chúng tôi sẽ tạo một CI CD Docker Pipeline cho ứng dụng Nodejs.
- Docker
Docker là một nền tảng chứa mã nguồn mở được sử dụng để phát triển, vận chuyển và chạy các ứng dụng. Chúng tôi sẽ sử dụng nó để xây dựng Hình ảnh Docker của ứng dụng Nodejs mẫu của chúng tôi và đẩy / kéo chúng đến / từ AWS ECR.
- Jenkins
Jenkins là một máy chủ tự động hóa mã nguồn mở, có sẵn, miễn phí được sử dụng để xây dựng, kiểm tra và triển khai các ứng dụng phần mềm. Chúng tôi sẽ tạo CI CD Docker Pipeline của mình để xây dựng, thử nghiệm và triển khai ứng dụng Nodejs của chúng tôi trên AWS ECS bằng Jenkins
- AWS ECR
AWS Elastic Container Registry là một Kho lưu trữ hình ảnh Docker được AWS quản lý hoàn toàn để dễ dàng lưu trữ, chia sẻ và triển khai container images. Chúng tôi sẽ sử dụng AWS ECR để lưu trữ Docker Images của ứng dụng Nodejs mẫu.
- AWS ECS
AWS Elastic Container Service là một dịch vụ điều phối containers được AWS quản lý hoàn toàn để dễ dàng triển khai, quản lý và mở rộng quy mô các ứng dụng được chứa trong containers. Chúng tôi sẽ sử dụng nó để lưu trữ ứng dụng Nodejs mẫu.
Kiến trúc
Đây là cách kiến trúc của chúng ta sẽ trông như thế nào sau khi thiết lập CI CD Pipeline với Docker.
Sau khi thiết lập thành công CI CD Docker Pipeline, chúng tôi sẽ đẩy các cam kết vào kho lưu trữ Github của chúng tôi và đến lượt mình, Github Webhook sẽ kích hoạt CI CD Pipeline trên Jenkins Server. Máy chủ Jenkins sau đó sẽ kéo mã mới nhất, thực hiện unit tests, xây dựng hình ảnh docker và đẩy nó lên AWS ECR. Sau khi hình ảnh được đẩy sang AWS ECR, hình ảnh tương tự sẽ được Jenkins triển khai trong AWS ECS.
Quy trình làm việc và các giai đoạn của CI CD
Quy trình làm việc
CI và CD Workflow cho phép chúng tôi tập trung vào nhiệm vụ Phát triển trong khi nó thực hiện các thử nghiệm, xây dựng và triển khai theo cách tự động.
- Tích hợp liên tục
Điều này cho phép các nhà phát triển đẩy code lên Hệ thống kiểm soát phiên bản (Version Control System) hoặc Hệ thống quản lý mã nguồn (Source Code Management System), xây dựng và kiểm tra code mới nhất do nhà phát triển đẩy, xây dựng & lưu trữ các phần mềm tạo tác.
- Phát hành liên tục
Đây là quá trình cho phép chúng tôi triển khai mã đã thử nghiệm cho phía sản xuất bất cứ khi nào được yêu cầu.
- Triển khai liên tục
Điều này tiến thêm một bước nữa và thực hiện mọi thay đổi mỗi khi quy trình sản xuất vượt qua tất cả các thử nghiệm mà không cần bất kỳ sự can thiệp thủ công nào đối với hệ thống khách hàng.
Giai đoạn
Mục tiêu chính của CI CD pipeline tự động là xây dựng mã mới nhất và triển khai nó. Các giai đoạn có thể khác nhau, tùy theo từng nhu cầu. Những giai đoạn phổ biến nhất sẽ được đề cập dưới đây.
- Kích hoạt (Trigger)
CI CD pipeline có thể thực hiện công việc theo lịch trình được chỉ định khi được thực thi theo cách thủ công hoặc được kích hoạt tự động trên một hành động cụ thể trong Kho lưu trữ mã.
- Code Pull
Trong giai đoạn này, pipeline sẽ kéo mã mới nhất bất cứ khi nào pipeline được kích hoạt.
- Unit tests
Trong giai đoạn này, đường ống thực hiện các bài kiểm tra có trong codebase, đây còn được gọi là các unit tests.
- Xây dựng hoặc đóng gói
Sau khi đã vượt qua tất cả các bài kiểm tra, pipeline được áp dụng ngay và xây dựng các hình ảnh tạo tác hoặc docker trong trường hợp các ứng dụng bị dày đặc.
- Đẩy hoặc Lưu trữ
Trong giai đoạn này, code đã được xây dựng sẽ được đẩy đến Kho lưu trữ Artifactory hoặc Docker trong trường hợp các ứng dụng bị dày đặc.
- Acceptance Tests
Giai đoạn này của quy trình xác nhận phần mềm có hoạt động như dự kiến hay không. Đây là một cách để đảm bảo liệu phần mềm hoặc ứng dụng có thực hiện đúng như những gì nó được lập trình hay không.
- Triển khai
Đây là giai đoạn cuối cùng trong bất kỳ CD CI pipeline nào. Trong giai đoạn này, ứng dụng đã sẵn sàng để được phân phối hoặc triển khai.
Chiến lược triển khai
Chiến lược triển khai là một cách trong đó các container của các micro-services được gỡ xuống và thêm vào. Có nhiều tùy chọn có sẵn; tuy nhiên, chúng ta sẽ chỉ thảo luận về những cái có sẵn và được hỗ trợ bởi ECS
Rolling updates
Trong các bản cập nhật luân phiên (rolling updates), bộ lập lịch trong Dịch vụ ECS sẽ thay thế các tác vụ hiện đang chạy bằng các tác vụ mới. Các tác vụ trong cụm ECS sẽ chạy các containers được tạo ra ngoài định nghĩa tác vụ. Cấu hình triển khai kiểm soát số lượng tác vụ mà Amazon ECS thêm hoặc xóa khỏi dịch vụ. Giới hạn dưới và giới hạn trên về số lượng tác vụ sẽ được chạy lần lượt được kiểm soát bởi MinimumHealthyPercent và MaximumPercent.
Ví dụ MinimumHealthyPercent: Nếu giá trị của MinimumHealthyPercent là 50 và số tác vụ mong muốn là 4, thì bộ lập lịch có thể dừng 2 tác vụ hiện có trước khi bắt đầu 2 tác vụ mới
Ví dụ maximumPercent: Nếu giá trị của maximumPercent là 4 và tác vụ mong muốn là 4 thì bộ lập lịch có thể bắt đầu 4 tác vụ mới trước khi dừng 4 tác vụ hiện có.
Triển khai Blue / Green
Chiến lược triển khai Blue / Green cho phép nhà phát triển xác minh một bản triển khai mới trước khi gửi lượng traffic truy cập đến nó bằng cách cài đặt phiên bản cập nhật của ứng dụng làm nhiệm vụ thay thế mới.
Chủ yếu có 3 cách mà traffic có thể thay đổi trong quá trình triển khai blue/green deployment.
- Canary – Traffic được chuyển theo hai bước gia số, tỷ lệ phần trăm của traffic được chuyển đến nhiệm vụ được cập nhật của bạn đã đặt ở bước đầu tiên và khoảng thời gian, tính bằng phút, trước khi phần còn lại được chuyển ở bước thứ hai.
- Linear – Traffic được dịch chuyển theo các gia số bằng nhau, tỷ lệ phần trăm của chuyển động trong mỗi khoảng tăng và số phút giữa mỗi lần tăng.
- All-at-once – Tất cả công việc được chuyển từ bộ nhiệm vụ ban đầu sang bộ nhiệm vụ cập nhật cùng một lúc.
Trong số 2 chiến lược này, chúng tôi sẽ sử dụng chiến lược triển khai cập nhật lần lượt trong ứng dụng demo của mình.
Ứng dụng Dockerize Node.js
Cách thực hiện Dockerfile cho ứng dụng Nodejs được thể hiện dưới đây. Bạn không cần sao chép-dán tệp này mà tệp đã có sẵn trong kho git mẫu mà bạn đã sao chép trước đó.
- Nút TỪ: 12.18.4-alpine
Đây sẽ là hình ảnh cơ sở của chúng tôi cho vùng chứa.
- WORKDIR / app
Điều này sẽ được đặt làm thư mục làm việc trong vùng chứa.
- ENV PATH /app/node_modules/.bin:$PATH Biến
PATH được gán một đường dẫn đến /app/node_modules/.bin.
- COPY package.json ./
Package.json sẽ được sao chép trong thư mục làm việc của vùng chứa.
- RUN npm cài đặt
Cài đặt phụ thuộc.
- BẢN SAO. ./
Sao chép các tệp và thư mục có phụ thuộc từ máy chủ vào vùng chứa.
- EXPOSE 3000
Cho phép đến cổng 300 của thùng chứa.
- CMD [“node”, “./src/server.js”]
Khởi động ứng dụng
Đây là tệp Docker mà chúng ta sẽ sử dụng để tạo hình ảnh docker.
Thiết lập Kho lưu trữ Github
Đầu tiên, hãy tạo một kho lưu trữ mới.
- Truy cập https://github.com/ , tạo tài khoản nếu bạn chưa có tài khoản, sau đó đăng nhập vào tài khoản của bạn và tạo một kho lưu trữ mới. Bạn có thể đặt tên cho nó theo sự lựa chọn của bạn; tuy nhiên, tôi khuyên bạn nên sử dụng cùng một tên để tránh bất kỳ sự nhầm lẫn nào.
- Bạn sẽ nhận được màn hình như sau, hãy sao chép URL của kho lưu trữ và giữ nó tiện dụng. Gọi URL này là URL Kho lưu trữ Github và ghi chú nó vào tệp văn bản trên hệ thống của bạn.
Lưu ý : Tạo một tệp văn bản mới trên hệ thống của bạn và ghi lại tất cả các chi tiết sẽ được yêu cầu sau này.
Tạo mã thông báo Github
Mã thông báo Github được tạo lập cho các mục đích xác thực. Nó sẽ được sử dụng thay vì mật khẩu cho Git qua HTTPs hoặc có thể được sử dụng để xác thực với API qua Xác thực cơ bản.
Nhấp vào biểu tượng người dùng ở trên cùng bên phải, đi tới “Cài đặt”, sau đó nhấp vào tùy chọn “Cài đặt nhà phát triển” trong bảng điều khiển bên trái.2. Nhấp vào tùy chọn “Mã thông báo truy cập cá nhân” và “Tạo mã thông báo mới” để tạo mã thông báo mới.
3. Đánh dấu vào hộp kiểm “kho lưu trữ”, mã thông báo sau đó sẽ có “toàn quyền kiểm soát các kho lưu trữ riêng tư”
4. Bạn sẽ thấy mã thông báo của bạn được tạo ngay bây giờ.
Lưu ý: Bạn đang ở trong thư mục chính, tức là / home / ubuntu.
- Sao chép kho lưu trữ mẫu của tôi có chứa tất cả các mã được yêu cầu.
git clone https://github.com/shivalkarrahul/nodejs.git - Tạo một kho lưu trữ mới. Kho này sẽ được sử dụng để thiết lập CI CD Pipeline.
git clone https://github.com/shivalkarrahul/demo-nodejs-app.git - Sao chép tất cả mã từ kho lưu trữ nodejs của tôi sang kho lưu trữ demo-nodejs-app mới được tạo .
cp -r nodejs / * demo-nodejs-app / - Thay đổi thư mục làm việc của bạn.
cd demo-nodejs-app /
Lưu ý: Đối với phần còn lại của bài viết, không thay đổi thư mục của bạn. Ở trong cùng một thư mục, đây là / home / ubuntu / demo-nodejs-app /, và thực hiện tất cả các lệnh từ đó.
- ls -l
- trạng thái git
Đẩy cam kết đầu tiên của bạn vào kho lưu trữ
- Kiểm tra thư mục làm việc hiện tại của bạn, nó phải giống nhau. Đây là / home / ubuntu / demo-nodejs-app /
pwd - Đặt tên người dùng cho tin nhắn cam kết git của bạn.
git config user.name “Rahul” - Đặt một email cho tin nhắn cam kết git của bạn.
git config user.email “< [email protected] >” - Xác minh tên người dùng và email bạn đã đặt.
git config –list - Kiểm tra trạng thái, xem các tệp đã được thay đổi hoặc thêm vào kho lưu trữ git của bạn.
trạng thái git - Thêm tệp vào vùng dàn git.
git thêm - Kiểm tra trạng thái, xem các tệp đã được thêm vào khu vực dàn git.
trạng thái git - Cam kết các tệp của bạn bằng một thông báo cam kết.
git commit -m “Cam kết đầu tiên của tôi” - Đẩy cam kết vào kho lưu trữ git từ xa của bạn.
git push
Thiết lập Cơ sở hạ tầng AWS
Tạo Người dùng IAM với Quyền truy cập có lập trình
- Tạo người dùng IAM có quyền truy cập có lập trình trong tài khoản AWS của bạn và ghi lại khóa truy cập và khóa bí mật trong tệp văn bản của bạn để tham khảo trong tương lai. Cung cấp quyền của quản trị viên cho người dùng.
Chúng tôi không cần quyền truy cập của quản trị viên; tuy nhiên, để tránh các vấn đề về quyền và vì lợi ích của bản demo, hãy tiếp tục với quyền truy cập của quản trị viên.
Tạo một kho lưu trữ ECR
- Tạo một Kho lưu trữ ECR trong tài khoản AWS của bạn và ghi chú URL của nó trong tệp văn bản của bạn để tham khảo trong tương lai.
Tạo một cụm ECS
- Đi tới Bảng điều khiển ECS và nhấp vào “Bắt đầu” để tạo một cụm.
- Nhấp vào nút “Định cấu hình” có sẵn trong tùy chọn “tùy chỉnh” trong “Định nghĩa vùng chứa”.
- Chỉ định tên cho vùng chứa là “nodejs-container”, URL Kho lưu trữ ECR trong hộp văn bản “Hình ảnh”, cổng “3000” trong phần Ánh xạ cổng, sau đó nhấp vào nút “Cập nhật”. Bạn có thể chỉ định bất kỳ tên nào bạn chọn cho vùng chứa.
- Bây giờ bạn có thể xem các chi tiết bạn đã chỉ định trong “Định nghĩa vùng chứa”. Nhấp vào nút “Tiếp theo” để tiếp tục
- Chọn “Cân bằng tải ứng dụng” trong “Xác định dịch vụ của bạn” và sau đó nhấp vào nút “Tiếp theo”.
- Giữ tên cụm là “mặc định” và tiếp tục bằng cách nhấp vào nút “Tiếp theo”. Bạn có thể thay đổi tên cụm nếu muốn.
- Xem lại cấu hình và nó sẽ trông như sau. Nếu cấu hình khớp, sau đó nhấp vào nút “Tạo”. Thao tác này sẽ bắt đầu tạo Cụm ECS.
- Sau một vài phút, bạn sẽ tạo cụm ECS của mình và Trạng thái khởi chạy sẽ như sau.
Tạo một phiên bản EC2 để thiết lập Máy chủ Jenkins
- Tạo Phiên bản EC2 với Ubuntu 18.04 AMI và mở Cổng 22 của nó cho IP của bạn và Cổng 8080 cho 0.0.0.0/0 trong Nhóm bảo mật của nó. Cổng 22 sẽ được yêu cầu cho ssh và 8080 để truy cập Máy chủ Jenkins. Cổng 8080 là nơi Github Webhook sẽ cố gắng kết nối trên Máy chủ Jenkins, do đó chúng tôi cần cho phép nó trong 0.0.0.0/0
Thiết lập Jenkins trên Phiên bản EC2
Sau khi phiên bản có sẵn, hãy cài đặt Jenkins Server trên đó cùng với tất cả các phụ thuộc.
Điều kiện tiên quyết của Phiên bản EC2
- Xác minh xem hệ điều hành có phải là Ubuntu 18.04 LTS
cat / etc / issue hay không
- Kiểm tra RAM, tối thiểu là 2 GB là những gì chúng tôi yêu cầu.
miễn phí -m
- Người dùng mà bạn sử dụng để đăng nhập vào máy chủ phải có đặc quyền sudo. “Ubuntu” là người dùng có sẵn đặc quyền sudo cho các phiên bản EC2 được tạo bằng AMI “Ubuntu 18.04 LTS”.
tôi là ai - Kiểm tra thư mục làm việc hiện tại của bạn, nó sẽ là thư mục chính của bạn.
pwd
Cài đặt Java, Bộ xử lý JSON jq, Nodejs / NPM và aws-cli trên Phiên bản EC2
- Cập nhật hệ thống của bạn bằng cách tải xuống thông tin gói từ tất cả các nguồn đã định cấu hình.
cập nhật apt sudo - Tìm kiếm và cài đặt Java 11
sudo apt tìm kiếm openjdk
sudo apt cài đặt openjdk-11-jdk - Cài đặt lệnh jq, bộ xử lý JSON.
sudo apt cài đặt jq - Cài đặt Nodejs 12 và NPM
curl -sL https : // deb . nguồn nút . com / setup _ 12 . x | sudo -E bash –
sudo apt cài đặt nodejs - Cài đặt công cụ cli aws.
sudo apt cài đặt awscli - Kiểm tra phiên bản Java.
java –version - Kiểm tra phiên bản jq.
jq –version - Kiểm tra nút phiên bản Nodejs
–version - Kiểm tra phiên bản
NPM npm –version - Kiểm tra phiên bản aws cli
aws –version
Lưu ý: Đảm bảo tất cả các phiên bản của bạn khớp với các phiên bản được thấy trong hình trên.
Cài đặt Jenkins trên Phiên bản EC2
- Jenkins có thể được cài đặt từ kho lưu trữ Debian
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 chỉ mục gói
apt sudo apt-get update - Cài đặt Jenkins trên máy
sudo apt-get install jenkins - Kiểm tra trạng thái dịch vụ nếu nó đang chạy hay không.
tình trạng dịch vụ jenkins - Bạn nên thiết lập và chạy Jenkins của mình ngay bây giờ. Bạn có thể tham khảo tài liệu chính thức tại đây nếu bạn gặp bất kỳ vấn đề nào với quá trình cài đặt.
Cài đặt Docker trên Phiên bản EC2
- Cài đặt các gói để cho phép apt sử dụng kho lưu trữ qua HTTPS:
sudo apt-get install apt-transport-https ca-Certificates curl gnupg lsb-release - Thêm khóa GPG chính thức của Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - Thiết lập kho lưu trữ ổn định
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 chỉ mục gói
apt sudo apt-get update - Cài đặt phiên bản mới nhất của Docker Engine và containerd,
sudo apt-get install docker-ce docker-ce-cli containerd.io - Kiểm tra phiên bản docker.
docker –version - Tạo một nhóm “docker”, nhóm này có thể thoát.
sudo groupadd docker - Thêm người dùng “ubuntu” vào nhóm “docker”
sudo usermod -aG docker ubuntu - Thêm người dùng “jenkins” vào nhóm “ docker”
sudo usermod -aG docker jenkins - Kiểm tra xem bạn có thể tạo các đối tượng docker bằng người dùng “ubuntu” hay không.
docker run hello-world - Chuyển sang người dùng “root”
sudo -i - Chuyển sang người dùng “jenkins”
su jenkins - Kiểm tra xem bạn có thể tạo các đối tượng docker bằng người dùng “jenkins” hay không.
docker run hello-world - Thoát khỏi lối ra người dùng “jenkins
” - Thoát khỏi lối ra người dùng “root”
- Bây giờ bạn sẽ trở lại người dùng “ubuntu”. Bạn có thể tham khảo tài liệu chính thức tại đây nếu bạn gặp bất kỳ vấn đề nào với quá trình cài đặt.
Định cấu hình Jenkins Server
- Sau khi Jenkins đã được cài đặt, bước đầu tiên là giải nén mật khẩu của nó.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
- Điền URL vào trình duyệt
Jenkins URL: http://<public-ip-of-the-ec2-instace>:8080
- Chọn “Install suggested plugins”
- Tên người dùng, mật khẩu cho admin mới sẽ được tạo. Bạn có thể sử dụng tên người dùng này với tư cách là admin.
- Trường URL sẽ được tự động điền, click “Save and Finish” để tiếp tục.
- Jenkins Server của bạn đã sẵn sàng.
- Trang chủ của nó sẽ như dưới đây.
Cài đặt Plugins
- Hãy cài đặt tất cả plugins mà bạn cần. Click “Manage Jenkins” ở ô bên trái.
- Dưới đây là danh sách plugins bạn cần cài đặt
- CloudBees AWS Credentials:
Cho phép lưu trữ chứng chỉ Amazon IAM, các khóa trong Jenkins Credentials API.
- Docker Pipeline:
Plugin này cho phép xây dựng, kiểm tra và sử dụng các hình ảnh Docker từ Jenkins Pipeline.
- Amazon ECR:
Plugin này cung cấp sự tích hợp với AWS Elastic Container Registry (ECR)
Sử dụng:
- AWS Steps:
Plugin này thêm các bước Jenkins pipeline để tương tác với AWS API.
- Trong tab “Available”, tìm kiếm tất cả các plugin này và click “Install without restart”.
- Bạn sẽ thấy màn hình như dưới đây sau khi tất cả các plugin được cài đặt thành công.
Tạo Chứng chỉ trong Jenkins
- Plugin CloudBees AWS Credentials sẽ xuất hiện tại đây. Chọn “Manage Jenkins” và click “Manage Credentials”.
- Chọn “(global)” “Add credentials”.
- Lựa chọn “AWS Credentials” và cung cấp ID là “demo-admin-user”. Điều này có thể được cung cấp theo sự lựa chọn của bạn, hãy ghi chú ID này trong tệp văn bản. Chỉ định Access Key và Secret Key của người dùng IAM mà bạn đã tạo trong trước đó. Click “OK” để lưu trữ các chứng chỉ IAM.
- Làm các bước tương tự và lần này chọn “Username with password” để lưu trữ Github Username và Token bạn đã tạo trước đó. Click “OK” để lưu trữ chứng chỉ Github.
- Bây giờ bạn nên có chứng chỉ IAM và Github trong Jenkins.
Tạo một Jenkins Job
- Đi tới trang chủ, chọn “New Item” để tạo một Jenkins Pipeline.
- Chọn “Pipeline” và đặt tên nó như “demo-job” hoặc cung cấp một cái tên mà bạn chọn.
- Đánh dấu các hộp kiểm “Github project” trong tab “General”, cung cấp Github Repository URL mà bạn đã tạo trước đó. Bên cạnh đó, đánh dấu vào hộp kiểm “Github hook trigger for GitScm polling” trong tab “Build Trigger”.
- Trong tab “Pipeline”, chọn “Pipeline script from the SCM”, chỉ định URL kho lưu trữ và chọn chứng chỉ bạn đã tạo cho Github. Kiểm tra tên nhánh xem liệu đã trùng khớp với tên bạn đã cam kết hay chưa. Xem lại các cấu hình và click “Save” để lưu thay đổi.
- Bây giờ bạn có thể thấy pipeline bạn 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, để bất cứ khi nào diễn ra sự kiện trên Github Repository, nó có thể kích hoạt Jenkins Job.
- Đi tới thanh điều khiển, chọn “Webhooks” ở ô bên trái. Bạn có thể thấy nút “Add webhook”, click vào đó để tạo một webhook.
- Cung cấp Jenkins URL với tên miền là “/github-webhook/”. URL sẽ như dưới đây.
Webhook URL: http://<Jenkins-IP>:8080/github-webhook/
Bạn có thể chọn các sự kiện tùy ý, tuy nhiên để đơn giản hãy chọn “Send me everything”. Đảm bảo rằng hộp kiểm “Active” được chọn. Click “Add webhook” để tạo một webhook sẽ kích hoạt Jenkins Job bất cứ khi nào có sự kiện diễn ra trong Github Repository.
- Bạn nên quan sát webhook của bạn. Click vào đó để xem liệu nó đã được định cấu hình đúng hay chưa.
- Click vào tab “Recent Deliveries” và bạn nên quan sát một tick xanh. Tick xanh này cho biết webhook đã được kết nối với Jenkins Server.
Triển khai Ứng dụng Nodejs cho ECS Cluster
Trước khi kích hoạt Pipeline từ Github Webhook, hãy thử thực hiện nó theo cách thủ công.
Xây dựng Job theo cách thủ công
- Đi tới Job bạn vừa tạo và Xây dựng nó.
- Nếu bạn xem logs, bạn sẽ thấy rằng nó không thành công. Đó là nguyên nhân chúng tôi chưa gán giá trị cho biến chúng tôi có trong Jenkinsfile.
Đẩy cam kết thứ hai của bạn
Lưu ý: Đối với phần còn lại của bài viết, không thay đổi thứ tự thư mục của bạn. Ở trong cùng một thư mục, ví dụ /home/ubuntu/demo-nodejs-app và thực hiện tất cả các yêu cầu từ đây.
Gán giá trị cho biến trong Jenkinsfile
- Để khắc phục lỗi trên, bạn cần thực hiện một vài thay đổi với Jenkinsfile. Bạn có một số biến trong file này và cần gán giá trị vào biến đó để triển khai ứng dụng cho cụm ECS vừa tạo. Gán giá trị chính xác cho các biến có “CHANGE_ME”.
Cat Jenkinsfile
- Dưới đây là danh sách các biến để bạn tiện theo dõi.
Chúng ta có một vài biến dưới đây trong Jenkinsfile.
- AWS_ACCOUNT_ID=”CHANGE_ME”
Chỉ định số tài khoản AWS của bạn tại đây.
- AWS_DEFAULT_REGION=”CHANGE_ME”
Chỉ định khu vực bạn đã tạo cụm ECS của mình
- CLUSTER_NAME=”CHANGE_ME”
Chỉ định tên của cụm ECS mà bạn tạo.
- SERVICE_NAME=”CHANGE_ME”
Chỉ định tên của Service được tạo trong cụm ECS.
- TASK_DEFINITION_NAME=”CHANGE_ME”
Chỉ định tên Task được tạo trong cụm ECS.
- DESIRED_COUNT=”CHANGE_ME”
Chỉ định số lượng nhiệm vụ bạn muốn tạo trong cụm ECS.
- IMAGE_REPO_NAME=”CHANGE_ME”
Chỉ định URL kho lưu trữ ECR
- IMAGE_TAG=”${env.BUILD_ID}”
Không thay đổi phần này.
- REPOSITORY_URI = “${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}”
Không thay đổi phần này.
- registryCredential = “CHANGE_ME”
Chỉ định tên của chứng chỉ mà bạn tạo trong Jenkins để lưu trữ AWS Access Key và Secret Key
- Kiểm tra trạng thái để xác nhận rằng file đã được thay đổi.
git status
cat Jenkinsfile
- Thêm một tệp vào vùng dàn git, cam kết và sau đó đẩy đến kho Github từ xa.
git status
git add Jenkinsfile
git commit -m “Assigned environment specific values in Jenkinsfile”
git push
Lỗi trên Jenkins Server
Sau khi đẩy cam kết, Jenkins Pipeline sẽ được kích hoạt. Tuy nhiên, bạn sẽ thấy một lỗi “Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock” trong Jenkins Job. Nguyên nhân cho điều này là, một người dùng “jenkins” được sử dụng bởi Jenkins Job không được cho phép tạo các đối tượng docker. Để cấp quyền cho người dùng “jenkins”, chúng tôi thêm nó vào nhóm “docker” ở bước trước, tuy nhiên, chúng tôi không khởi động lại dịch vụ Jenkins sau đó.
Tôi đã cố tình giữ điều này để có thể cho bạn thấy sự cần thiết phải thêm người dùng “jenkins” vào nhóm “docker” trong EC2 Instance của bạn.
Bây giờ bạn đã biết điều gì cần để khắc phục các lỗi trên.
- Khởi động lại dịch vụ Jenkins.
sudo service jenkins restart - Kiểm tra liệu dịch vụ Jenkins đã khởi động hay chưa.
sudo service jenkins status
Đẩy cam kết thứ ba của bạn
- Thực hiện một số thay đổi trong README.md để cam kết, đẩy và kiểm tra xem Pipeline có được kích hoạt tự động hay không.
vim README.md - Thêm, cam kết và đẩy tệp.
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
- Lần này, bạn có thể thấy rằng công việc phải được tự động kích hoạt. Đi đến Jenkins job và xác minh tương tự.
- Dưới đây là giao diện Stage View. Nó cho ta thấy các giai đoạn mà chúng ta đã chỉ định trong Jenkinsfile.
Kiểm tra Trạng thái của Task trong cụm ECS
- Đi tới Cluster, click tab “Tasks”, và chạy “Task”.
- Click tab “JSON” và xác thực hình ảnh, hình ảnh phải khớp với số Jenkins Build. Trong trường hợp này, đó là “6” và nó khớp với số Jenkins Job Build của tôi.
- Nhấn vào ELB URL để kiểm tra xem ứng dụng Nodejs có hoạt động hay không. Bạn sẽ nhận được thông báo như sau trong trình duyệt sau khi nhấn vào URL ELB.
Đẩy cam kết thứ tư của bạn
- Mở tệp “src/server.js” và thực hiện một vài thay đổi trong thông báo hiển thị để kiểm tra lại CI CD Pipeline.
vim src/server.js - Kiểm tra các tệp xem đã thay đổi hay chưa. Trong trường hợp này, chỉ một tệp có thể được xem là đã thay đổi.
git status - Kiểm tra sự khác biệt trong tệp mà bạn vừa thay đổi.
git diff src/server.js - Thêm tệp mà bạn đã thay đổi vào khu vực dàn git.
git add src/server.js - Kiểm tra trạng thái của kho lưu trữ cục bộ.
git status - Thêm một thông báo vào cam kết.
git commit -m “Updated welcome message” - Đẩy thay đổi của bạn tới kho lưu trữ từ xa.
git push
- Đi tới Tasks, tại đây bạn có thể thấy 2 tác vụ đang được chạy. Một với bản sửa đổi cũ hơn và một với bản sửa đổi mới hơn. Bạn thấy 2 tác vụ do chiến lược triển khai cập nhật luân phiên được định cấu hình theo mặc định trong cụm.
Lưu ý: Số sửa đổi của bạn có thể khác nhau.
- Đợi khoảng 2-3 phút, và bạn chỉ nên có 1 tác vụ đang chạy với bản sửa đổi cuối cùng.
- Lại nhấn vào ELB URL và hãy quan sát những thay đổi của bạn. Trong trường hợp này, chúng ta có thay đổi trong thông báo hiển thị.
Chúc mừng! Bạn đã có Jenkins CI CD Pipeline đang hoạt động để kích hoạt ứng dụng Nodejs container trên AWS ECS bất cứ khi nào có sự thay đổi trong mã nguồn của bạn.
Dọn dẹp tài nguyên đã tạo
Nếu bạn chỉ đang cố gắng thiết lập CI CD Pipeline để làm quen với nó hoặc cho mục đích POC trong tổ chức của bạn và không cần nó nữa, tốt hơn hết là bạn nên xóa các tài nguyên bạn đã tạo trong khi thực hiện POC. Là một phần của CI CD Pipeline này, chúng tôi đã tạo một số tài nguyên. Chúng tôi đã tạo danh sách dưới đây để giúp bạn xóa chúng.
- Xóa Github Repository
- Xóa Github Token
- Xóa IAM User
- Xóa EC2 Instance
- Xóa ECR Repository
- Xóa ECS Cluster
- Xóa Task Definition
Tóm tắt
Cuối cùng, đây là tóm tắt những gì bạn phải làm để thiết lập CI CD Docker Pipeline để triển khai một mẫu ứng dụng Nodejs trên AWS ECS sử dụng Jenkins.
- Sao chép Github Repository hiện có
- Tạo một Github Repository mới và sao chép mã vào kho lưu trữ mẫu trong đó
- Tạo một Github Token
- Tạo một người dùng IAM
- Tạo một ECR Repository
- Tạo một ECS Cluster
- Tạo một EC2 Instance để thiết lập Jenkins Server
- Cài đặt Java, JSON processor jq, Nodejs, và NPM trên EC2 Instance
- Cài đặt Jenkins trên EC2 Instance
- Cài đặt Docker trên EC2 Instance
- Cài đặt Plugin
- Tạo Credentials trong Jenkins
- Tạo một Jenkins Job
- Tích hợp Github và Jenkins
- Kiểm tra việc triển khai
- Dọn dẹp tài nguyên
Kết luận
Một CI CD Pipeline đóng vai trò như một cách tự động hóa các bản dựng, kiểm tra và triển khai phần mềm của bạn. Nó đóng vai trò là xương sống của bất kỳ tổ chức nào với văn hóa DevOps. Nó mang lại rất nhiều lợi ích cho phát triển phần mềm và thúc đẩy doanh nghiệp một cách mạnh mẽ.
Trong blog này, chúng tôi đã đưa ra các bước tạo một Jenkins CI CD Docker Pipeline để triển khai một ứng dụng Nodejs container mẫu trên AWS ECS. Chúng tôi đã thấy Github Webhooks có thể được sử dụng để kích hoạt Jenkins Pipeline trên mỗi lần đẩy kho lên lưu trữ, từ đó triển khai hình ảnh docker mới nhất lên AWS ECS.
CI CD Pipelines với Docker là lựa chọn tốt nhất cho doanh nghiệp để cải thiện chất lượng code và cung cấp các bản phát hành phần mềm một cách nhanh chóng mà không có bất kì lỗi thủ công nào. Chúng tôi mong rằng blog này sẽ giúp bạn tìm hiểu nhiều hơn về những phần thiết yếu của CI CD Docker Pipeline.
Những câu hỏi thường gặp
CI CD Pipeline là gì?
Nói một cách đơn giản, CI CD Pipeline là một bộ các hướng dẫn được thực thi để cung cấp phiên bản mới hơn cho ứng dụng phần mềm của bạn.
Tại sao tôi nên sử dụng CI CD Pipeline?
Để tránh các lỗi thủ công, tăng cường chất lượng code, cải thiện chu kỳ phát hành, bổ sung các giá trị kỹ thuật và kinh doanh, nâng cao sự hài lòng của khách hàng và hơn thế nữa.
Các giai đoạn cơ bản của mọi CD CI Pipeline?
Bất kỳ CD CI Pipeline cơ bản nào cũng thường bao gồm các giai đoạn – Kéo, Kiểm tra, Xây dựng, Đẩy và Triển khai.
Việc thiết lập CD CI Pipeline có cần bất kỳ kiến thức Lập trình nào không?
Không hẳn vậy. Nếu bạn đang làm việc với một công cụ như Jenkins có GUI, bạn có thể chỉ cần tạo CI CD Pipeline bằng cách tạo một số cấu hình trên giao diện người dùng. Bạn có thể cần một số hiểu biết cơ bản về tập lệnh để tự động hóa các tác vụ của mình hoặc thực thi các lệnh.
CI CD Docker Pipeline là gì?
Một CI CD Pipeline kiểm tra, xây dựng và triển khai Docker Containers cho ứng dụng của bạn được gọi là CI CD Docker Pipeline.
Tại sao tôi nên sử dụng CI CD Pipeline với Docker?
Người ta có thể sử dụng CI CD Pipeline với Docker để đặc biệt tự động hóa quy trình Phát triển phần mềm và cải thiện chu kỳ phát hành của các ứng dụng dựa trên microservices.
Về VTI Cloud
VTI Cloud là Đối tác cấp cao (Advanced Consulting Partner) của AWS, với đội ngũ hơn 50+ kỹ sư về giải pháp được chứng nhận bởi AWS. Với mong muốn hỗ trợ khách hàng trong hành trình chuyển đổi số và dịch chuyển lên đám mây AWS, VTI Cloud tự hào là đơn vị tiên phong trong việc tư vấn giải pháp, phát triển phần mềm và triển khai hạ tầng AWS cho khách hàng tại Việt Nam và Nhật Bản.
Xây dựng các kiến trúc an toàn, hiệu suất cao, linh hoạt, và tối ưu chi phí cho khách hàng là nhiệm vụ hàng đầu của VTI Cloud trong sứ mệnh công nghệ hóa doanh nghiệp.
Liên hệ với chúng tôi: Tại đây
Nguồn: www.clickittech.com