原文鏈接 https://elfgzp.cn/2019/12/09/gortal-site-project
由于最近在 Github 發了一個個人開源專案 - 「gortal」一個使用 Go 語言開發的,超級輕量的堡壘機(跳板機)服務,于是想寫一篇博文來記錄一下自己的開源心得,

雖然不是第一次寫開源專案了,但是不能放過這次寫博文的熱情,下一次就不知道啥時候寫了,
而且這篇文章的主要目的也是想分享一些開源的心得給讀者們,
產生 Idea ??
首先不管是個人專案還是開源專案都得有一個 Idea,我先來說說 gortal 這個專案的 idea 是怎么來的,
筆者有一群熱愛開源技術的小伙伴們,TNK-Studio - technical studio 技術小作坊,
@mayneyao 同學的開源專案 中文獨立博客調研 需要服務器來跑爬蟲,于是我們便將手上的閑置云計算資源都貢獻出來,
我想了想沒準以后還會有這樣的需求,于是想到了公司使用的 jumpserver 堡壘機,想在組織的其中一個服務器搭起來,
于是就 docker 一把梭,兩三下就跑起來了,
結果就是,服務器卡死了 ...
去 jumpserver 的官方檔案看了一眼,
Jumpserver 環境要求:
硬體配置: 2個CPU核心, 4G 記憶體, 50G 硬碟(最低)
...

我們閑置的云計算資源基本都是 1 核 2 G 的配置,這配置要求玩不起呀,
然后搜了一下有沒有其他同型別的,輕量一點的專案能拿來用,最后也是沒有找到合適的,
自己來造 ??
既然沒有,那就自己來造!
Idea 有了,就差程式員了,現在程式員也不缺了,就差用啥語言了, 這時候肯定是選世界上最好的語言 P ..

剛開始想考慮使用自己的本命語言 Python,但是后來考慮到 Go 語言相比之下部署簡單,而且不管是生成的可執行程式還是 docker 鏡像都非常的小,于是果斷選擇了 Go,
那么應該做成什么樣子的呢,因為體驗過了 jumpserver 的終端互動的模式,所以也想開發成相同的方式,當然為了輕量,肯定是拋棄了 Web,完全使用終端來互動,
接下來就是開源的輪子選擇了,當然在實作你的 Idea 的時候切忌從頭到位自己做,如果有優秀的開源方案一定要拿來用,如果不滿足自己的需求在針對其進行修改,在使用其中一個開源專案 manifoldco/promptui 的時候就發現不滿足需求的地方,這時候就可以 fork 一份到自己的倉庫,自己改了自己用,
最終根據技術方案選擇的輪子如下:
-
終端互動 - manifoldco/promptui
-
sshd 服務開發 - gliderlabs/ssh
-
ssh 中轉客戶端 - helloyi/go-sshclient
-
其他個人開源專案 - fatih/color、op/go-logging 等等
專案 To-do ??
啥都選好了,準備開始動手了,卻發現我該從哪里開始好呢?
這時候就需要列一個 To-do 了,筆者使用的是 notion 的筆記工具,使用看板將專案各個待實作的功能列出來,實作完一個將其拖入完成項中,

這樣不僅僅是自己可以梳理當前需要做的,而且在多人協作開發也非常有幫助,
Notion 牛批!!!
準備好 To-do 就可以正式開工了,當功能完成得差不多的時候,才是正式開始的時候,
加個 CI ??
基礎功能做好了,準備發布 Release 了,Go 開發的程式只需要打包成不同平臺的二進制可執行檔案就可以了,
但是那么多平臺,一個一個的手動 build 然后上傳,這哪是程式員干的事,這是 CI - 持續集成(Continuous integration,簡稱CI)要干的事情,
在開發這個專案之前,有使用過 Travis CI,它對 Github 開源專案是免費的, 但是前一段時間 Github 推出了 Github Actions 于是抱著嘗嘗鮮的態度就選擇了它,
它使用起來也非常的簡單,點擊倉庫上方的 Actions 選單就可以進入倉庫的 Actions 配置頁面,
筆者在使用程序中覺得 Github Actions 跟 Travis CI 相比,其最大的優勢是它的 Marketplace,里面有非常多開源的別人寫好的 Actions,可以直接拿來簡單修改后使用,而且這些 Actions 當然也是使用 Github 進行版本管理的,

如何使用這里就不做詳細介紹了,感興趣的可以查看 Github Actions 官方檔案,
這里我給倉庫添加了一個「創建 Release」就自動打包所有鏡像的 actions,它的倉庫地址我也放在這里 ngs/go-release.action,
最后它的效果就是自動幫你打包所有平臺的二進制可執行程式,并壓縮上傳到 Github,

來個 Docker 鏡像 ??
當然一個服務怎么少的了 Docker 鏡像,還不了解 Docker 的同學可以看看阮一峰的 Docker 入門教程,筆者覺得 Docker 簡直就是 21 世紀程式員最偉大的發明之一,
而且官方的 Docker Hub 與 Github 結合使用簡直不能再香,
不需要寫額外的 Github Actions 配置或其他的 CI 組態檔,你只需要將你的倉庫與 Docker Hub 倉庫關聯起來,當然不要忘了在你的倉庫放 Dockerfile 檔案,
然后在 Docker Hub 倉庫配置好自動構建鏡像的邏輯,就大功告成了,
而且 Docker Hub 的配置指引也做的非常好,非常容易理解,

當然這里非常非常重要的就是如果你是用的是 Go 語言進行開發的專案,Docker 鏡像構建一定要分成兩步,一個是編譯鏡像,一個是正式鏡像,這樣最終打包的鏡像只會包含一個二進制檔案,而不是將原始碼一起打包,
FROM golang:1.12-alpine AS builder
# ... 省略代碼
FROM alpine:latest
LABEL maintainer="Elf Gzp <gzp@[email protected]> (https://elfgzp.cn)"
COPY --from=builder /opt/gortal ./
RUN chmod +x /gortal
# ... 省略代碼
本專案完整的 Dockerfile 鏈接如下,可以通過鏈接查看完整的 Dockerfile,
https://github.com/TNK-Studio/gortal/blob/master/Dockerfile
可以通過圖片看到使用分兩步構建和一步構建,最終打包的 Docker 鏡像大小差異是非常大的,

讓 Readme 看著更高大上 ??
接下來是最重要的一步,寫好 Readme,它是你專案的封面, 很多時候我在瀏覽別人的開源專案,我可能都不在乎他這個專案做了什么,但從他的 Readme 寫的非常的好,我就給他點個 star ??,
而且最好是能弄雙語的 Readme,這樣能讓老外也能看懂,再不行就寫一份中文的,剩下交給谷歌翻譯,
當然 Readme 最好不能都是字,要有演示的 GIF,這樣進來的人第一眼就知道你這個專案是干啥的,
這里筆者推薦 LICEcap 這個工具,本片文章所有的動圖都是使用這個工具錄制的,
Readme 寫好之后,給它加上 Badges - 徽章 就是畫龍點睛之筆了,

Badges 的添加也是非常簡單的,我們只需要使用這個開源專案 shields,并選擇我們想要的徽章、填寫好 URL、復制粘貼到 Readme,搞定,

復制粘貼后你會得到一個 shields 的鏈接,你只需要將鏈接改成 Markdown 的圖片鏈接格式就可以了,參考鏈接,
乞討 Star ??
專案做完了,當然不能就放著不管了,除非你的專案非常非常的優秀,否則他是不會自己漲星星的,
以本專案為例,筆者就去 V2EX 分享了自己的專案,也識訓了不少星星 ??,
你需要去各種社區分享你的開源專案,例如:V2EX、稀土掘金、segmentfault 等等,
讓你的專案給更多的人看到,同理寫博客也是如此,不分享出去就沒有正反饋,就少了很多動力,
稍微總結一下 ??
筆者在這片文章沒有過多的去介紹專案的開發程序,因為覺得開發以外的程序更值得分享,
開源專案不只是實作了 Idea 就完事了,你可能還需要去讓它更加的方便維護,自動的做一些重復的事情,還要去包裝它分享它,這樣才會有更多的人使用,當有更多人時候的時候,這個專案就需要花時間去迭代和維護了,
最后的最后,覺得文章還不錯的,覺得這個開源專案還可以的,賞個 star ?? 吧,https://github.com/TNK-Studio/gortal,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56908.html
標籤:Go
