用 Side Project 學 CI:WeaMind 的 CI 實作策略

📌 這是 WeaMind 系列 的第 4 篇。
本系列以真實世界專案為背景,記錄重要技術實作與經驗分享。

GitHub Actions 入門:自動化 Lint、Format 與 Type Check〉一文中,我們使用了 GitHub Actions 作為 CI(持續整合)的入門工具。

同時建立了軟體開發專案中最基本且常見的 CI 流程。

接下來,我將繼續介紹,WeaMind 專案中所有實作的 CI 項目,並說明我選擇它們的原因與設計原則。

本文依據的專案程式碼版本為 v0.5.1

在 Hetzner 開新 VM 指南:選機房、SSH 連線、設定防火牆

from Pixabay

Hetzner VPS 實測:比 DigitalOcean 更划算的選擇?〉介紹了 Hetzner 這個來自德國的 VPS 供應商,該篇文章在 VM 價格與規格上,與 DigitalOcean 進行比較。

使用下來已超過 3 個月,除了台灣連歐洲的延遲較高,以這樣的價格,整體表現仍讓我十分滿意。

我之後絕大部分的服務,都會部署在目前租用的 Hetzner VM 上。

上一篇是介紹與推廣,本篇則是進一步教你怎麼在 Hetzner 平台上建立新 VM,簡單實用。

話不多說,直接開始。

uv 容器化實作:使用官方 image 建立 Dockerfile

from Pixabay

📌 這是 WeaMind 系列 的第 3 篇。
本系列以真實世界專案為背景,記錄重要技術實作與經驗分享。

uv 是近年來快速竄起的 Python 套件管理器,憑藉其最關鍵的核心特性——快😎,在 Python 開發圈吸引了不少關注與採用。

之前我已寫過〈Python 套件管理器 uv 介紹——與 Poetry 比較〉介紹。有興趣的讀者歡迎參考。

本文是 uv 系列的第二篇,聚焦於 Dockerfile

當我要將「使用 uv 的 Python 專案」容器化時,我發現相關的討論與介紹較少,所以花了一些時間摸索。

本文目標是大幅減少你的試錯時間,並提出我的實踐與看法。

Vibe Coding 與人類的時代

from Pixabay

任何人類都能使用魔法的時代要到來了——《葬送的芙莉蓮》漫畫第 53 話 | 人類的時代

有了強大的 AI 輔助 ,寫程式再也不是軟體工程師的專屬。

如此的時代巨變,首先讓我聯想到的,就是「芙莉蓮」中的這段劇情。

不過把這個比喻與感受表達得最好的,當屬財經作家王伯達的這篇臉書文

他寫道:

AI 讓更多人,用更容易的方式使用程式語言與複雜軟體。

這讓我想到芙莉蓮的老師,弗蘭梅。

她說服了人類的皇帝,讓人類得以開始研究魔法,魔法不再是個禁忌,開啟了人人有魔法可以練的年代。

顯然,在我這個軟體工程師眼中,AI 就像芙蘭梅,把原本高門檻的知識、技術變成大眾能輕易接觸的工具,讓所有人都有機會參與創造

本文聊聊我作為一個軟體工程師,如何看待這個 AI 普及後的「魔法時代」。

GitHub Actions 入門:自動化 Lint、Format 與 Type Check

📌 這是 WeaMind 系列 的第 2 篇。
本系列以真實世界專案為背景,記錄重要技術實作與經驗分享。

從這篇文章開始,我將啟動一個新的系列。

搭配我正在實作中的 Side Project——WeaMind,寫下一篇又一篇的技術實作心得。

讓我們一起在專案中成長,並獲得更多的開發樂趣。

如標題所示,本文主要介紹 GitHub Actions。不過在此之前,我們得先對 CI 有初步的了解。


什麼是 CI?為什麼需要 CI?

CI 是「Continuous Integration」的縮寫,中文是「持續整合」。

它的核心概念是:當開發人員提交程式碼時,系統可以「自動執行一系列預先定義的檢查流程」,例如檢查程式碼是否與現有程式相容、是否能正常運作。

在軟體開發流程中,我們常常要處理很多重複但又不可忽略的工作:檢查程式碼格式、執行靜態分析、跑單元測試,甚至產生 API 文件等。

如果每次提交都要手動跑一輪,既麻煩又易忘。

這時 CI 就派上用場了。它能在每次 push 或開 PR 時(或其它事件),自動幫我們做這些事,讓問題提早浮現,使得開發流程更加穩健,也能節省大量重複性勞動。

yadm 教學:實作 macOS 與 Linux 的 dotfiles 跨平台同步

from Pixabay

兩年多前,我寫了這篇〈是時候同步你的 dotfiles 了——我選擇 yadm〉,當時的主要動機是想要在多個 Linux VM 之間同步設定檔。

該文章介紹了「何謂 dotfiles」(後端工程師應該都很熟悉),以及我認為的「dotfiles 同步工具」的兩大流派:

  1. Symbolic Link。
  2. Bare Git。

然而,兩年之間,我幾乎很少在文中提起它。

事實上,我這段期間使用的 yadm 的頻率確實不高

但這並不代表我沒有同步 dotfiles 的需求,只是真正的核心需求在於跨平台,尤其是 macOS 與 Linux 之間。

若僅是在不同 Linux VM 之間同步,就顯得有點小打小鬧,實用性不足


我日常開發主要都在 Mac 上,而 Mac 與 Linux 的設定落差雖不大,但絕不會完全相同——這讓單一套設定難以通用。

比如我的 Mac 上有一些 Homebrew 的環境變數,在 Linux 上無用武之地不說,還可能造成執行錯誤。

總之,若不解決跨平台問題,那 yadm 的價值將發揮不到一半。

上個月我終於鐵了心,把這件事搞定了!

做完只覺得,我實在太晚開始,跨平台同步的價值非常巨大且實用

因此,儘管使用這類工具的人並不多,我也要寫下這篇文章,供有志之士參考!

Gandi 惹惱了我😡——怒將域名轉至 Dynadot

我從 2018 年開始租用kyomind.tw這個域名,至今已 7 年。

每年 9/1 是它的續約時間。過去多年來,價格大致穩定,折合新台幣大概 700 多元。

直到去年續約,我被信用卡帳單上的金額嚇了一跳:1260 元

這是什麼情況?

一度以為是哪裡被誤收,或是信用卡出了問題。但查了帳單、比對後台紀錄,確認那筆款項的確是域名供應商 Gandi 對我的 .tw 域名的續約費用。

當下覺得很不對勁——域名費用可以這樣說漲就漲嗎?而且幅度也太誇張了!


就這樣過了半年多,想想幾個月後又要續約了,1260 實在有點讓人卻步。

我們知道,域名在不同供應商之間,價格並不同。

而且!域名是可以移轉的

所以我決定查查,目前 .tw 便宜的地方有哪些——發現了 Dynadot 只要 18 美元!

而且,其他域名供應商,大概也只要二十幾美元左右啊,怎麼 Gandi 會特別貴?

於是我決定進一步弄清楚這到底是怎麼回事,這才發現,其實此時此刻,Gandi 的續約價格也只是台幣 700 多。

這讓我更加惱火了……