在 2020 年就有 Docker 宣布支援多架構映像檔,後來才有正式的 Docker BuildKit 支援多架構映像檔,這篇文章來介紹如何使用 Drone CI/CD 搭配 Docker BuildKit 編譯多架構映像檔,而且這個功能是免費的,不需要付費的 Docker Hub 帳號。但是在 Drone CI/CD 官方提供的 Drone Docker Plugin 目前是不支援多架構映像檔,所以需要自己撰寫 Drone Pipeline,來達到我們的目的,官方也有人提出了這樣的 Proposal: 『Support cross-arch Docker builds within Docker using QEMU』,使用 QEMU 來達成目的,底下來介紹如何使用,關鍵點就是在 Host 支援 Qemu 的環境下,使用 Docker BuildKit 完成。
[Read More]用 ChatGPT 幫忙進行 Code Review 給建議
上一篇文章我們介紹了如何使用 ChatGPT 來自動生成 Commit Message,這篇文章來介紹如何使用 ChatGPT 來進行 Code Review。在月初開發的 CodeGPT 已經讓開發者可以使用 GPT-3.5-Turbo 來進行生成 Commit 總結,這個功能省下開發者不少整理開發內容時間,但是我覺得還是不夠,大家除了開發外,還花了很多時間在進行 Code Review,所以如果有工具,可以讓開發者可以提前知道優化的項目,這可以省下不少 Review 的時間。
[Read More]用 ChatGPT 自動幫開發者產生 Commit Message
相信大家對 ChatGPT 不會很陌生,這是目前在生成式人工智慧 (AIGC: AI Generated Content) 內的當紅炸子雞,然而 ChatGPT 對於軟體工程師有什麼影響呢?能否透過 ChatGPT 改善團隊流程或協助開發?而我現在想到最直接的就是用 ChatGTP 幫忙寫 Git Commit Message,然而怎麼把 Commit Message 寫好可以參考這篇文章,為了能達成這目的,我用 Go 語言寫了一個 CLI 工具 CodeGPT (請大家幫忙分享),來協助軟體工程師整理開發內容。底下先看看使用 CodeGPT 來產生 Commit Message 的成果:
[Read More]Automated solution for updating running Docker containers - watchtower
Nowadays, most of us have containerized our services, and effectively managing and upgrading containers without affecting existing services is a critical issue. Two steps are required in the CI/CD process: first, packaging the environment as a Docker image and uploading it to the company’s private Docker registry; and second, after the upload is complete, possibly connecting to the machine via SSH, pulling the new image, and restarting the running service via the Graceful Shutdown mechanism. You can learn more about Graceful Shutdown in this article. I am going to introduces Watchtower, a brand new tool that automatically upgrades and updates running containers, allowing for further CD process streamlining. Developers only need to upload the Docker image, and the remote servers can update the running container automatically.
[Read More]自動升級更新執行中的 Docker 容器解決方案 - watchtower
現在大家在部署服務肯定都已經容器化,而如何有效管理及升級容器不影響現有的服務,這就是一個重要的議題,然而在 CI/CD 的流程內,肯定有兩個步驟是必須的,第一就是將環境打包成 Docker Image 並上傳到公司內私有的 Docker Registry,以及上傳完畢後,也許透過 SSH 方式連上機器,並且拉取新的映像檔,再透過 Graceful Shutdown 機制重新啟動正在執行的服務。可以參考這篇了解什麼是 Graceful Shutdown。本篇就是要帶給大家一個全新的工具 Watchtower 用來自動升級更新執行中的容器,讓 CD 流程可以再簡化一步,開發者只要上傳完 Docker Image,遠方的伺服器就可以自動更新。
[Read More]用 Go 語言實現固定大小的 Ring Buffer 資料結構
Ring Buffer Queue 是固定大小記憶體的 FIFO (first in, first out) 資料結構,用來處理不同 Process 之前的資料交換。工作原理就是在一段連續固定大小區間的記憶體用 (head/tail) 兩個指針來決定現在要將資料放在哪個位置。本篇將帶大家用 Go 語言快速實現 Ring Buffer 資料結構。
[Read More]用 Go 語言建立 Web 及 Worker 服務實現取消任務 (二)
上一篇『系統設計: 如何取消正在執行的工作任務 (一)』教大家如何用 Go 語言實現 canceler
package 來紀錄及取消正在執行的任務。而本篇來實現上圖的 HTTP Server
及 Worker
程式碼,底下直接用 Gin 框架來快速實現 HTTP 兩個 Handle,分別是 Cancel Task
及 Watch Task
(如下圖標示的 1 跟 2)。
其中上圖綠色框框 1
是用來接收使用者想要取消的任務,而 2
是用來讓 worker 進行長連接,根據不同的情境可以設定不同的等待時間。大家可能會問,為什麼不讓 Server 主動通知 Worker 就可以了,先解釋這點,這邊我們可能要先假設 Worker 存在的環境是封閉的,不能任意架設服務,故需要主動向 HTTP Server 進行詢問。其中 HTTP Server 跟 Worker 中間可以透過 gRPC 或 RESTful 進行資料交換,本篇先以 RESTful 進行說明。
用 Go 語言實作如何取消正在執行的工作任務 (一)
本篇來聊聊『如何取消正在執行的工作任務』,當系統內有需要處理比較久或較多資源的任務,肯定會將這些任務丟到其他機器再執行,執行過程如果需要取消,會經過如上圖幾個步驟。先假設中間的過程不透過 Message Queue 機制,而是兩個服務進行溝通透過 RESTful 或 gRPC 方式。
[Read More]系統設計: 處理服務讀取多個任務遇到的問題 (Go 語言)
不同的服務都會有需要處理比較久的任務,這些任務是不能即時執行完成,才回應給前端,這樣使用者體驗會非常的差。將類型的任務存在資料庫或放在消息對列就是一種處理方式,接著啟動另一個服務來消化非即時性的任務,而常見的處理方式就是在服務內啟動多個 Worker Node 來平行消化任務 (如上圖)。
[Read More]三款好用的繪圖工具來解決系統架構或流程圖
不管是長官還是同事甚至下屬,在公司無時無刻都需要跨團隊進行溝通,當系統架構或流程越來越複雜的時候,如果沒有按照當下情況記錄下來,對於未來接手的同事,或者是自己都會不小心忘記,而在記憶最清楚的當下用文字或流程圖記錄下來,對團隊及自己是有相當大的幫助。而有沒有工具可以快速畫出系統架構或流程圖?我們可以分幾種情境來討論。
[Read More]