虽然腾讯云serverless支持docker上传,但是docker每次冷启动十几秒的速度实在让人无法接受。
今天我们基于serverless的go环境进行部署Vapor
原理
因为go环境是基于Linux centos7的,所以我们的包只要能运行在centos7上就行了。
swift环境
go环境是预置环境不能直接安装Swift环境,所以正常打包是无法在go环境运行的,swift build 有个参数
#可以直接打包swift的环境依赖
swift build --static-swift-stdlib
这样我们打包出来的二进制文件就可以直接在centos直接运行了。
脚本 & 打包
好了,现在简单的思路已经厘清了,我们开始吧
#!/bin/bash
#可以直接通过参数输入项目目录,也可以直接在项目目录直接运行脚本
if [ -n "$1" -a -d "$1" ]
then
cd $1
fi
if [ ! -e "Package.swift" ]
then
echo "该目录不是vapor项目目录"
exit -1
fi
# 当前目录
echo $PWD
echo "更新依赖"
swift package resolve
############## 构建可执行二进制文件 ##########
echo "构建"
# 构建
docker run --rm \
-v "$PWD:/workspace" \
-w /workspace \
swift:5.5.2-centos7 \
/bin/bash -cl "swift build -c release --static-swift-stdlib && \
rm -rf .build/install && mkdir -p .build/install && \
cp -P .build/release/Run .build/install/ "
############## 函数部署 ###################
# 创建启动文件
touch .build/install/scf_bootstrap && chmod +x .build/install/scf_bootstrap
#复制 Public Resources .env .env.production
if [ -d Public ]; then
cp -r Public .build/install/
fi
cp -r Resources .build/install/
if [ -e .env ]; then
cp .env .build/install/
fi
if [ -e .env.production ]; then
cp .env.production .build/install/
fi
# 写入启动内容
cat > .build/install/scf_bootstrap<<EOF
#!/usr/bin/env bash
# export LD_LIBRARY_PATH=/opt/swift/usr/lib:${LD_LIBRARY_PATH}
./Run serve --env production --hostname 0.0.0.0 --port 9000
EOF
echo "打包"
cd .build/install && zip sfc_code.zip -r * .[^.]*
# 打开文件夹(macos)
open .
# END
可以直接通过参数输入项目目录(第一个参数),也可以直接在项目目录直接运行脚本
部署
打包完我们接下来进行部署
这里把我们刚才打包出来的 sfc_code.zip 上传
然后把内存设置为最小的64M,对于Vapor应用足以。
然后点击完成就可以了。
完成
好了,今天的教程就到这里了。
ubuntu
对应ubuntu的环境,我们也可以按这里原理可以直接省去在ubuntu部署swift环境的步骤。
Vapor问答论坛
我用Vapor + Leaf 开发了一个Vapor问答论坛,如果大家有Vapor开发上的问题可以直接在论坛上面来提问。 vapor问答论坛