Trong bài viết này mình sẽ sử dụng Telegram để Sai Khiến Gitlab (ứng dụng phương pháp ChatOps). Với mỗi dự án, giao tiếp là một việc không thể thiếu, tùy văn hóa, công ty mà sẽ sử dụng các công cụ chat khác nhau như Telegram, Microsoft Team, Slack, Mattermost,…
Vậy bạn có bao giờ tự hỏi, có cách nào mà tôi chỉ cần nhắn tin một cái thôi là các công việc được tự động triển khai không?
Chúng ta đang trả lời tin nhắn từ đồng nghiệp, sếp hay em hàng xóm đang hẹn nhờ sửa ống nước mà phải quay sang Gitlab, Jenkins, Server,… để thực hiện những thao tác, thay vào đó với những tác vụ đơn giản như chạy CI/CD ở Development env, khởi động lại service, backup restore tmp, show logs,… chỉ bằng 1 tin nhắn thì xem xong bài viết này bạn sẽ có thể hiểu được cách làm đó.
Nội dung
Phương pháp ChatOps là gì?
ChatOps là một phương pháp tích hợp việc quản lý và điều khiển hệ thống thông qua các cuộc trò chuyện và các công cụ tin nhắn tức thời, chẳng hạn như Telegram, Slack, Microsoft Teams, Mattermost,… Nó giúp tạo ra một môi trường làm việc trong đó các nhóm DevOps có thể tương tác với hệ thống và quản lý công việc một cách hiệu quả thông qua các cuộc trò chuyện và lệnh dòng lệnh, thay vì phải sử dụng giao diện người dùng đồ họa hoặc hệ thống quản lý từ xa truyền thống.
Phương pháp ChatOps ứng dụng gì trong thực tế?
- Quản lý triển khai (Deployment Management): phương pháp ChatOps cho phép các nhóm DevOps triển khai ứng dụng và cập nhật hệ thống thông qua các lệnh trò chuyện. Bằng cách này, họ có thể kiểm soát và theo dõi quá trình triển khai một cách trực quan, gửi thông báo cho toàn bộ nhóm về tình trạng triển khai.
- Quản lý bản sao lưu và phục hồi (Backup and Recovery): Các lệnh ChatOps có thể sử dụng để thực hiện sao lưu hệ thống và khôi phục từ các phiên bản sao lưu một cách nhanh chóng khi cần thiết.
- Quản lý hạ tầng (Infrastructure Management): phương pháp ChatOps cung cấp khả năng quản lý hạ tầng dưới dạng mã hóa, cho phép tự động hóa việc triển khai và quản lý các tài nguyên hạ tầng như máy chủ và điều chỉnh kích thước chúng dựa trên nhu cầu.
- Quản lý tác vụ (Task Management): phương pháp ChatOps giúp quản lý danh sách công việc và tác vụ một cách dễ dàng. Các thành viên nhóm có thể tạo, cập nhật và gán công việc cho nhau trong cuộc trò chuyện, đảm bảo rằng mọi người đều hiểu và theo dõi tiến độ công việc.
- Giám sát và cảnh báo (Monitoring and Alerting): ChatOps có thể tích hợp với các hệ thống giám sát để tự động gửi thông báo cảnh báo vào các cuộc trò chuyện. Khi có sự cố xảy ra, nhóm DevOps có thể tương tác ngay lập tức để xác minh và xử lý tình huống.
- Quản lý nguồn (Source Control): Các tích hợp ChatOps với hệ thống quản lý mã nguồn như Git giúp theo dõi thay đổi mã nguồn, thực hiện sự kết hợp và triển khai dự án một cách dễ dàng thông qua các lệnh trò chuyện.
Còn nhiều ứng dụng khác bạn có thể tham khảo thêm để triển khai phù hợp nhé phạm vi bài viết này và mình cũng rất hiểu nhiều bạn ngán việc đọc chỉ muốn lab ngay nên chúng ta cùng đi tiếp vào triển khai phương pháp ChatOps.
Triển khai Gitlab CI CD bằng phương pháp ChatOps
Bạn có thắc mắc tôi làm ví dụ khá nhiều về CI/CD, đơn giản là vì đây là công việc cơ bản cũng quan trọng của DevOps Engineer nên hẳn là ai làm, học DevOps cũng hình dung được, vì vậy khi làm những kiến thức mới và sử dụng một kiến thức mà bạn đã biết thì sẽ dễ dàng hiểu được kiến thức cần truyền đạt hơn.
Mình có một dự án đang cần triển khai CI/CD trên Gitlab, và mình muốn sử dụng Telegram khi chỉ cần chat thôi thì công việc đó sẽ tự động được triển khai và gửi lại thông báo về, sẽ đảm bảo việc biết được ngay trạng thái của pipeline và mọi người trong nhóm chat đều có thể nắm được cũng như tiết kiệm thời gian, nó còn có lợi ích khác rất lớn như việc có thành viên từ những công ty khác nhau làm việc cùng dự án không có quyền truy cập vào trong tài nguyên nội bộ của chúng ta sẽ nắm được tình hình rất rõ ràng vì những hành động đều được báo lại.
Kết quả
Như bạn đã thấy mục tiêu của chúng ta sẽ là khi chat /build <branch> (ex: /build develop) sẽ tự động chạy Gitlab CI/CD nhánh develop và hiển thị trạng thái triển khai như đã thực hiện pipeline bởi ai và lúc nào, đồng thời sau đó pipeline chạy thành công sẽ gửi thông báo về gồm thông tin dự án, kèm Link dẫn đến pipeline để chúng ta kiểm tra lại nếu cần.
Lưu ý trước khi triển khai
- Đầu tiên bạn có dự án trên Gitlab của bạn, có thể là Gitlab tự dựng như mình có làm tại Setup Gitlab nội bộ hoặc sử dụng gitLab.com chính thức cũng được nhé.
- Tiếp thep bạn cần có một server ubuntu/centos để setup CI/CD cho dự án đó, điều này trên website mình hướng dẫn khá nhiều và rất chi tiết rồi, nên mình sẽ chỉ sample project thôi nhé vì bản chất trong bài viết này chúng ta không phải đi triển khai CI/CD, bạn có thể xem series của mình tại CI/CD.
Phương pháp triển khai
- Tạo ChatBot trên Telegram bằng BotFather
- Tạo TokenAccess trên Gitlab và lấy api Gitlab
- Viết Script để đón nhận và thực hiện những hành động từ tin nhắn
Triển khai chi tiết phương pháp ChatOps vào CI/CD
Tạo ChatBot trên Telegram với BotFather nếu là lần đầu biết đến bạn có thể xem nhanh 1 phút thông báo Gitlab CI/CD đến Telegram để biết cách tạo nhé. Tạo thành công nhấn vào link t.me/se_action_bot.
Nhấn Start để bắt đầu nhé
Bạn tìm kiếm RawDataBot và lưu lại Chat ID để sử dụng trong Gitlab CI
Tiếp theo trên Gitlab mình có dự án Sample Empty gồm có 3 nhánh như sau (lưu lại project ID để sau sử dụng nhé)
Setup CI/CD tạo một file .Gitlab-ci.yml như dưới đây (phần này mình làm cực kỳ chi tiết ở các bài viết khác rồi tuy nhiên vì luôn muốn các bạn mới cũng có thể làm thành công nên hầu như bài viết nào mình cũng làm lại tuy hơi mất công nhưng sẽ chi tiết cho mọi người)
Trên dự án nhấn Settings > CI/CD > Variables thêm biến vào như sau (chính là Token mà chúng ta vừa lấy ở trên)
Thêm biến Chat ID
Trên dự án nhấn Settings > CI/CD > Runner > Copy Token, mình đang sử dụng Ubuntu, tiến hành truy cập vào server septup Gitlab runner với quyền root nhé (không thì bạn thêm sudo vào các câu lệnh dưới đây)
Cài đặt gitlab-runner
Tạo Gitlab runner mới
Thiết lập như dưới đây nhé
Tiếp đến chúng ta quay lại Gitlab và tạo một user khác (nếu bạn sử dụng Gitlab.com thì không cần làm bước này cũng được nhé) mục đích là để tạo một user chuyên chạy pipeline trong dự án, truy cập <gitlab>/admin/users/new với thông tin dưới đây
Tạo thành công thêm user Bot đó vào trong dự án quyền maintainer nhé
Tiến hành Login vào account Bot đó và tạo Access Tokens
Tạo thành công copy Token lại nhé vì chỉ có thể thấy 1 lần thôi
Quay lại server để tiến hành tạo Script chạy Job, tạo thư mục làm việc dự án
Tạo file pipeline script
Nội dung trong file pipeline.sh dưới đây (bạn thay những giá trị phù hợp đã thao tác ở trên vào nhé), bạn có thể chỉnh sửa để đảm bảo phù hợp hơn. Mình luôn luôn muốn cả những bạn mới đều có thể hiểu được những gì mình làm vì thế bài viết mới có giá trị tốt nhất, giải thích chi tiết luôn thì sẽ rất dài bài viết nên mình làm riêng file hướng dẫn để bạn có thể download thực hành [step-by-step]_pipeline_tutorial.zip.
#!/bin/bash TOKEN="<TOKEN_TELEGRAM_BOT>" # Hàm xử lý khi nhận tin nhắn /build function handle_build() { chat_id="$1" branch="$2" user_id="$3" # Lấy tên người dùng từ user_id username=$(curl -s "https://api.telegram.org/bot$TOKEN/getChat?chat_id=$user_id" | jq -r ".result.username") # Lấy thời gian hiện tại current_time=$(date +"%Y-%m-%d %H:%M:%S") curl -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d "chat_id=$chat_id" -d "text=Đang thực hiện lệnh build trên nhánh $branch bởi @$username lúc $current_time..." # Link api chạy Pipeline response=$(curl -X POST "<Gitlab_Link>/api/v4/projects/<PROJECT_ID>/pipeline" -H "PRIVATE-TOKEN: <TOKEN_GITLAB_BOT>" -F "ref=$branch") # Kiểm tra trạng thái từ response gọi pipeline status=$(echo "$response" | jq -r ".status") echo "Response: $response" if [ "$status" == "created" ]; then message="Đã thực hiện lệnh build trên nhánh $branch bởi @$username lúc $current_time!" else message="Không thể thực hiện lệnh build trên nhánh $branch vì nhánh không tồn tại hoặc lỗi." fi curl -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d "chat_id=$chat_id" -d "text=$message" } # Lấy tin nhắn mới function get_updates() { offset="$1" response=$(curl -s "https://api.telegram.org/bot$TOKEN/getUpdates?offset=$offset") echo "$response" } offset=0 while true; do updates=$(get_updates $offset) message_count=$(echo "$updates" | jq '.result | length') if [ "$message_count" -gt 0 ]; then for (( i = 0; i < $message_count; i++ )); do chat_id=$(echo "$updates" | jq -r ".result[$i].message.chat.id") user_id=$(echo "$updates" | jq -r ".result[$i].message.from.id") text=$(echo "$updates" | jq -r ".result[$i].message.text") if [[ "$text" == "/build "* ]]; then branch="${text#/build }" handle_build "$chat_id" "$branch" "$user_id" fi update_id=$(echo "$updates" | jq -r ".result[$i].update_id") offset=$((update_id + 1)) done fi sleep 1 done
Chúng ta cần cài đặt thêm jq, iq là một tiện ích dòng lệnh để xử lý JSON, cần cài đặt nó trước khi sử dụng
Chúng ta sẽ tạo thêm một file để lưu log khi chạy pipeline để nếu sảy ra lỗi cũng biết lỗi gì
Tiến hành chạy Script dưới nền và lưu kết quả vào file pipeline-log.txt
Quay lại Telegram và chạy theo cú pháp /build <branch> (ex: /build develop)
Vậy là mình đã hướng dẫn xong cách sử dụng phương pháp ChatOps triển khai Gitlab CI CD, bạn có thể viết thêm script để thêm điều kiện như chỉ có Username của Teamlead mới có quyền chạy thôi chẳng hạn, vậy là một group chat áp dụng Phương pháp ChatOps sẽ càng nhiều tính năng và giảm thiểu được nhiều công viêc, tương tự bạn có thể làm với rất nhiều tác vụ tự động khác như mình đã nói ở đầu bài, ở đây chúng ta sẽ lấy tư tưởng triển khai và hiểu được phương pháp ChatOps là gì.
Bạn có thể liên hệ với mình nếu có vấn đề gì nhé. Mình sẽ làm nhiều hướng dẫn hơn về các kỹ năng các tool khác để giúp bạn tối ưu được những tác vụ cũng như tiết kiệm những chi phí khi phát triển phần mềm. Thanks.
Mọi thắc mắc bạn có thể liên hệ:
Email: [email protected]