我們剛發布了 Scotty,一個美麗的 SSH 任務執行器。它讓你能定義部署腳本和其他遠端任務,從終端機執行它們,並即時觀看每一步的進展。它同時支援 Laravel Envoy 的 Blade 格式以及一個新的純 Bash 格式。
即使像 Laravel Cloud 這樣的服務讓你可以不再需要考慮伺服器,對於某些專案,我仍然偏好部署到自己的伺服器。我熟悉它們的操作,可以選擇任何我想要的伺服器供應商,並且對環境擁有完全的控制權。
像 Laravel Forge 這樣的工具內建了部署功能,而且效果不錯。但我一直以來都偏好從終端機手動執行部署腳本。我希望在任務執行時能確切地看到正在發生的事情,當出現問題時,我希望第一時間就能看到輸出,而不是透過網頁介面去尋找日誌。
多年來,我一直使用 Laravel Envoy 來做這件事。它能完成工作,但我希望在任務執行時有更漂亮的輸出,並且能夠在中途暫停執行。Envoy 使用基於 Blade 的檔案格式,對我們來說效果不錯。但並非所有人都想為他們的部署腳本編寫 Blade 語法。因此 Scotty 也為偏好這種方式的人提供了純 Bash 格式。
Scotty 是在 AI 的協助下建構的,以 Envoy 的程式碼庫為來源。儘管 Scotty 是從頭開始重建的,但精神上它是 Envoy 的一個分支。感謝 Laravel 提供了基礎。你可以在 Scotty 的儲存庫中閱讀完整的致謝。
你在 Scotty.sh 檔案中定義你的任務。它只是帶有一些註解的純 Bash。你的編輯器會正確地高亮顯示,並且開箱即用地獲得完整的 Shell 支援。這就是它的樣子:
Scotty 連接到你的伺服器,依序執行每個任務,並即時顯示你正在進行的內容。每個任務都會顯示其名稱、步驟計數器、已用時間以及目前正在執行的命令。當一切完成時,你會得到一個包含每個步驟計時的摘要表格。
這些螢幕截圖是部署這個部落格時擷取的。你可以在 GitHub 上找到部署檔案。
如果一個任務失敗,它的輸出會被顯示出來,執行也會立即停止,以便你進行調查。
除了能夠讀取 Envoy.blade.php 檔案之外,Scotty 還引入了一個新的 Scotty.sh 格式。每一行都是真正的 Bash。任務只是帶有 # @task 註解的 Bash 函數,這個註解告訴 Scotty 在哪個伺服器上執行它們。Macro 將任務分組到一個序列中。變數是純 Bash 變數,隨處可用。
因為它們都是有效的 Bash,所以你可以使用輔助函數、計算值,如 $(date +%Y%m%d-%H%M%S) ,以及你通常會使用的任何 Shell 結構。沒有 Blade 指令,沒有 PHP @setup 區塊,沒有 {{ $variable }} 插值。
你也可以從命令列傳遞變數。執行 scotty run deploy --branch=develop 會讓 $BRANCH 在你的任務中可用。鍵會自動大寫。
你可以使用 scotty tasks 來列出所有可用的任務和 Macro:
在執行期間,你可以隨時按下 p 來在當前任務完成後暫停。按 Enter 鍵恢復,或按 Ctrl+C 取消。當你想在中途部署時在伺服器上檢查某事,然後繼續時,這非常方便。
還有一個預覽模式 ( scotty run deploy --pretend ),它會確切地顯示將要執行的 SSH 命令,而不會實際執行它們。還有一個摘要模式 ( scotty run deploy --summary ),它會隱藏任務輸出,只顯示結果。
在你第一次部署到新伺服器之前,你可以執行 scotty doctor 來驗證你的設定。它會檢查你的檔案是否能正確解析,驗證到每個伺服器的 SSH 連線,並確認 php 、 composer 、 node 和 git 等工具在遠端機器上可用。
如果你已經在使用 Laravel Envoy,Scotty 可以直接讀取你的 Envoy.blade.php 檔案。無需更改。只需執行 scotty run deploy 即可正常工作。從那裡開始,如果你願意,可以逐步遷移到 Scotty.sh 格式,或者繼續使用 Blade。
如果你對這些都不熟悉,文件中的「你的第一個部署腳本」頁面會一步一步地引導你完成所有內容。
Scotty 提供了一個乾淨、現代的方式,讓你從終端機執行部署腳本和其他 SSH 任務。純 Bash,漂亮的輸出,以及對每一步的完全控制。
你可以在我們的文件網站上找到完整的文檔,並在 GitHub 上找到原始碼。這是我們在 Spatie 創建的眾多工具和套件之一。如果你想支持我們的開源工作,可以考慮購買我們的付費產品。
發現有趣的東西可以分享嗎?向社群區提交連結。