[rust] zero2prod 實做紀錄 01 - 環境篇 - GitPod

@Tom Jur on Unsplash

自從找到第一分軟體工程師的工作後,發現練習時間越來越不夠,有時候上班的時候會想要利用零碎的時間嘗試一些東西,但是程式碼在家裡的電腦,有一些小網站可以嘗試簡單的程式,但如果有一個雲端的環境能讓我接續開發專案就更好了。於是乎我找到了GitPod,類似的工具還有github提供的codespace。試用了一下,加上我後來對docker稍微熟練一點後,發現這樣雲端開發的體驗其實還不錯,所以這個專案翻新的過程我就打算在GitPod上從0開始。距離去年發下宏願要開始寫文章,至今冬天都快要結束了,才要開始繼續寫XDD

GitPod的運作方式

簡單來說,GitPod就是在雲端啟動一個開發環境,啟動的時候會參考github或gitlab上repo的code,免費版本只能夠使用的公開repo,而官方也有提供chrome插件,讓你能夠一鍵啟動gitpod。進入gitpod後,瀏覽器會以VSCode為界面開啟你的repo,然後就可以開始開發了,十分簡單!

看一下terminal,我一進去已經預先跑了一些測試,不過目前專案是空的所以測試數量是0,這部分是透過腳本設定的,另外左側也可以看到安裝的外掛插件,插件設定貌似是帳號跑的,我在開其他專案的時候也會帶入這幾個插件。

除了terminal以外也有其他的功能,相信大家都很熟悉,開發的過程中我發現我很長用到ports,因為需要的一些東西都用docker起,可以很清楚地看到我現在要連線到哪個port取得服務。

gitpod.yml

第一次開啟的時候會問你要不要加入gitpod.yml,這是Gitpod非常強大的功能,可以透過設定腳本,在每次重新開始準備環境的時候就會依照腳本上的命令幫你準備環境,另外我有看到據說這家公司的病毒式行銷就是對每個專案發gitpod.yml的pr,某種程度上真的蠻惡劣的。gitpod.yml的功能在多人協做的時候真的非常好用,有處理過環境問題經驗的話,這真的超痛的!同樣的程式碼在不同的電腦上跑不起來,一步一步debug,一天的時間就過了。當然,只是為了準備環境的話其實只要寫個shell script就可以解決了,但是gitpod雲端的特性讓我可以在不同的地方很容易的準備好開始開發。

Task

一個gitpod.yml是由task所組成的,一份yml可以有多的task,如果沒有特別設定的話在啟動的時候這些task會同時進行 像是下面的範例就會同時啟動資料庫以及應用程式

tasks:
    - name: run database
    - name: run app

一個task又可以分成三個階段

  1. before - 最早執行,可以用來做環境的一些全域設定
  2. init - 下載專案的相依性,或者可以在專案開始前先跑一下測試
  3. command - 啟動編譯後的專案或者其他需要運行的程式 另外如果開啟prebuild的功能,就可以加速環境準備的時間,官方有一張圖解釋這三個階段 prebuilds

每一個步驟可以直接下指令

tasks:
  - name: test app
    init: cargo build
    command: cargo test

指令可以是多行,像是專案中第一次啟動專案可以使用sqlx進行database migration

tasks:
  - name: database migration
    init: |
        cargo install sqlx
        sqlx migration run
    command: cargo run

前面有提到當有多個task的時候可以設定每個task是否需要等其他task完成,這部分需要透過gitpod cli進行設定,另外也可以用gp ports指令設定對外的接口以利測試,CLI工具提供不少功能可以嘗試。最後連vscode的extension也可以直接加一段vscode:在yml裡面

vscode:
  extensions:
    - svelte.svelte-vscode
    - bradlc.vscode-tailwindcss@0.6.11
    - https://example.com/abc/releases/extension-0.26.0.vsix

感想

以我要練習的專案為例,是一個具有後端與database的專案,那麼可以設定腳本在建立專案的時候就依序將postgre的docker image pull下來並啟動,安裝sqlx cli並執行sqlx migration把db的scheme設定好,並且在一切就序後就先幫我跑一次測試,Gitpod也吃dockerfile,也就是說把完整的東西打包起來就可以在雲端開箱及用。 整體而言,開發流程比我想像中流暢,不過使用上需要習慣,很多事情需要透過terminal直接下command來執行。另一方面因為VSCode的debug工具沒有那麽完善,gitpod上要安裝一些額外的工具也不容易,整個做下來發現把程式碼顆粒度拆小並且寫測試程式來debug反而比較容易開發,雖然現在gitpod已經可以透過jetbrain連線來開發,但直接用browser vscode反而讓我養成一些不錯的習慣。 雲端開發也衍生了一些問題,像是考慮到DB的連線字串不適合直接放上repo,這邊我是直接用docker起一個測試用的db,另外也可以用gitpod cli從自己的電腦設定環境變數,這部分就需要多考量。