本文介紹Serverless 應用引擎 SAE(Serverless App Engine)源碼部署的工作原理、環境配置、構建流程、源代碼導入等信息。
整體工作原理
作為Serverless 應用引擎 SAE(Serverless App Engine)中,降低用戶運維負擔的重要一環,源碼部署提供了直接從用戶源碼到應用上線的能力。本功能是接受用戶觸發的構建事件后,根據用戶提供的源代碼,自動檢測構建所需的環境,自動化完成代碼構建到部署的完整流程(配置運行時環境、安裝依賴管理工具、安裝第三方依賴、打包鏡像、推送到個人倉庫)。
在具體的實現方式上,SAE將構建流程和部署流程隔離,僅會導出與產物運行相關的運行環境,因此可以大大減少產物鏡像的體積,提高應用部署和啟動速度。但是,需要注意的是,在這種模式下,在依賴構建環境中安裝的某些依賴可能不存在于應用部署鏡像中。
SAE源碼部署功能支持構建產物鏡像的導出和下載,遵循云原生Buildpack規范。
基礎環境配置
當前,構建時只支持使用Ubuntu 22.04作為基礎鏡像,并基于此構建build image和run image,作為構建時和應用啟動時的基礎鏡像。build image和run image的不同點在于build image會包含更多僅與應用構建相關的庫,功能更加強大,但是體積較大,不適合部署使用。
當前的構建機配額為2核CPU、4 GB內存、30 GB磁盤。如果您有特殊的構建需求,請聯系阿里云技術團隊。更多信息,請參見聯系我們。
源碼部署的構建主流程
提交代碼后會根據自動探測結果進行構建,選擇運行時、運行時版本、第三方包管理工具版本。環境配置完畢后,將自動執行構建命令。
根據運行時進行個性化配置
當前需要手動選擇運行時語言、運行時版本,不支持指定第三方包管理工具版本。
支持的版本列表
運行時版本列表
當前支持Ubuntu 22.04作為基礎環境。支持Go、Java、Node.js、Python和PHP語言的應用,此外還支持靜態頁面和基于Dockerfile構建的應用。支持的版本列表和額外需要的信息如下所示:
運行時語言 | 支持的版本 | 額外需要的信息 |
Go | 全部版本 | 無 |
Java(OpenJDK) | 8、11、16、17、18 | 無 |
Node.js | 14、16、18、19、20 | 無 |
Python | 3.8、3.9、3.10、3.11 | 輸入(例如 |
PHP | 8.1、8.2 | 無 |
靜態頁面應用 | 不涉及 | 無 |
Dockerfile | 不涉及 | 無 |
第三方包管理工具版本
第三方包管理的判定和下載由源碼部署的探測邏輯完成,當前不能通過用戶直接選擇。版本列表如下:
包管理工具 | 版本 |
Graalvm | 21.0.0 |
Gradle | 基于工程文件檢測或8.2.1 |
Maven | 基于工程文件檢測或3.9.3 |
Pnpm | 基于工程文件檢測或最新版本 |
Yarn | 基于工程文件檢測或最新版本 |
Pip | 跟隨Python版本 |
Go mod | 不涉及 |
Composer | 2.1.3 |
注意事項
Python
對于大多數情況來說,Python沒有確定的啟動方式。因此,推薦在構建Python應用時指定應用程序的啟動命令。可能的啟動命令如下:
python main.py
gunicorn -p :8080 main:app
在使用Python 11構建有Numpy依賴的代碼時,會產生構建錯誤,降低版本為3.8即可。
Java
在使用Maven或Gradle進行編譯時,如果工程項目中存在mvnw
或gradlew
腳本文件時,可能會產生額外的行為,進而導致編譯失敗。在不影響正常編譯的前提下,建議刪除工程文件中的該類文件后再提交源碼部署流程。
Go
由于老版本的Go(小于1.13)不支持Go proxy的功能,因此如果應用的工程文件中的go.mod
文件指定了一個偏小的版本,經常會導致無法利用到阿里鏡像源的加速能力,導致依賴拉取失敗。推薦在不影響工程構建的前提下,盡量升級工程文件中指定的Go運行時版本。
當前,在工程中沒有go.mod
時,不會使用goproxy
。
讀取靜態文件時,請使用embedFS
。
高級配置:源碼部署的構建配置
通過配置文件指定構建行為
可以通過在代碼的構建目錄寫入Procfile或app.yaml的方式提供程序啟動命令。
通過控制臺設置的ENTRYPOINT優先級更高,不會被配置文件的設置覆蓋。
Procfile
Procfile文件能夠指定應用程序啟動時執行的命令。可以使用Procfile聲明各種進程類型。在源碼部署中,需要將process-type指定為web,并添加應用啟動命令。
格式如下:
web: <用戶entrypoint>
示例如下:
web: python app.py -p 9000
app.yaml
app.yaml是用于應用部署的應用配置文件,包含了啟動命令和運行時配置。當前只使用其設置應用啟動命令。
格式如下:
entrypoint: <用戶entrypoint>
示例如下:
entrypoint: gunicorn -b :$PORT main:app
源代碼導入
當前,源碼部署過程只允許通過從源代碼托管平臺導入的方式上傳代碼。用戶需要首先將自己的代碼推送到代碼倉庫,在應用創建時的授權界面授權后才可以接入到SAE的源碼部署流程中。
當前支持接入的代碼平臺
支持以下代碼托管平臺作為代碼源:
觸發器事件
支持以下構建觸發模式:
Push到指定分支:每次新提交代碼到指定分支時,系統都會自動構建應用的新版本。
手動觸發構建:選擇手動觸發時,系統不會自動執行持續部署。
Tag/Release事件:在GitHub中該類事件用Release表示,在GitLab中用Tag表示。
倉庫授權方式
源代碼倉庫的授權使用OAuth 2.0授權協議。需要授予平臺的權限范圍如下表所示:
請全部授權,否則會導致應用構建部署失敗。
平臺名稱 | 權限代碼 | 權限范圍描述 |
GitHub |
|
|
Gitee |
|
|
GitLab |
|
|
Codeup |
|
|