基础开发

更新时间: 2023-08-22 17:02:53

本文介绍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、Python、Node.js、Java、PHP和静态页面应用。支持的版本列表和额外需要的信息如下所示:

运行时

支持的版本

额外需要的信息

Go

全部版本

Python

3.8、3.9、3.10、3.11

输入Entrypoint(例如python main.py

Node.js

14、16、18、19、20

Java(OpenJDK)

8、11、16、17、18

PHP

8.1、8.2

静态页面应用

不涉及

第三方包管理工具版本

第三方包管理的判定和下载由源码部署的探测逻辑完成,当前不能通过用户直接选择。版本列表如下:

包管理工具

版本

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进行编译时,如果工程项目中存在mvnwgradlew脚本文件时,可能会产生额外的行为,进而导致编译失败。在不影响正常编译的前提下,建议删除工程文件中的该类文件后再提交源码部署流程。

Go

由于老版本的Go(小于1.13)不支持Go proxy的功能,因此如果应用的工程文件中的go.mod文件指定了一个偏小的版本,经常会导致无法利用到阿里镜像源的加速能力,导致依赖拉取失败。推荐在不影响工程构建的前提下,尽量升级工程文件中指定的Go运行时版本。

当前,在工程中没有go.mod时,不会使用goproxy

读取静态文件时,请使用embedFS

高级配置:源码部署的构建配置

通过配置文件指定构建行为

可以通过在代码的构建目录写入Procfile或app.yaml的方式提供程序启动命令。

Procfile

Procfile文件能够指定应用程序启动时执行的命令。可以使用Procfile声明各种进程类型。

在源码部署中,需要将process-type指定为web,并添加应用启动命令:

web: python app.py -p 9000

app.yaml

app.yaml是用于应用部署的应用配置文件,包含了启动命令和运行时配置。当前只使用其设置应用启动命令。

entrypoint: gunicorn -b :$PORT main:app

源代码导入

当前,源码部署过程只允许通过从源代码托管平台导入的方式上传代码。用户需要首先将自己的代码推送到代码仓库,在应用创建时的授权界面授权后才可以接入到SAE的源码部署流程中。

当前支持接入的代码平台

支持以下代码托管平台作为代码源:

触发器事件

目前只支持Push代码到仓库事件。即当推送代码后,选取当前最新Commit时的代码进行构建和部署。

仓库授权方式

源代码仓库的授权使用OAuth 2.0授权协议。需要授予平台的权限范围如下表所示:

重要

请全部授权,否则会导致应用构建部署失败。

平台名称

权限代码

权限范围描述

GitHub

  1. repo

  2. admin:repo_hook

  3. admin:org

  1. 代码仓库权限

  2. Webhook管理权限

  3. 组织管理权限

Gitee

  1. user_info

  2. projects

  3. hook

  1. 访问用户的个人信息、最新动态

  2. 查看、创建、更新用户的项目

  3. 查看、部署、更新用户的Webhook

GitLab

  1. read_user

  2. read_repository

  3. write_repository

  1. 读取授权用户的个人信息

  2. 代码仓库的读权限

  3. 代码仓库写权限(仅用于创建Webhook)

阿里云首页 Serverless应用引擎 相关技术圈