腾讯云函数 自动化构建与部署
前文已经实现了在本地构建一个Go程序并以事件函数或者web函数的形式部署到serverless平台上,但是操作还是过于繁琐,并且windows下构建的Linux程序还存在无法给予执行权限的问题,所以这一章中,我尝试采用Github actions来构建并通过Serverless Framework部署,实现构建与部署的自动化。
通过Serverless Framework部署
参考 https://cloud.tencent.com/developer/article/1510289 ,同时为了解决windows下构建的程序缺少可执行权限的问题,所以采用Github actions构建并发布到scf的方式来实现代码的部署。
命令行控制腾讯云函数,可以借助Serverless Framework这个框架来实现,在本地已经有nodejs的环境下通过 npm install -g serverless
安装serverless framework。
使用serverless
以交互式的方式初始化一个serverless云函数目录。
选择部署到云端后,居然是 扫码或者点击链接登陆的…不过如果在初始化项目后马上部署到云端,那么你是没办法进行配置的,所以这里可以先不部署。
先看看serverless初始化出来的目录,重点是 serverless.yaml 这个文件,我们可以直接复制到我们自己的项目的文件夹中,以前面的web函数中的简易http服务器为例,查看该yaml的内容.
app: basic-http-95fba9ab
component: scf
name: scf-golang
inputs:
src: ./
handler: main
runtime: Go1
namespace: default
region: ap-guangzhou
memorySize: 128
timeout: 3
因为在scf平台上我已经创建了云函数了,我希望后续的部署是替换已有的函数,而不是重新创建一个新的函数,所以这里我把app和region以及资源限制都改成了我所使用的值,然后serverless.yaml所在的文件夹中使用 serverless deploy
进行部署。我们也可以使用腾讯云的api和secret来进行部署,在本地新建一个 .env 文件,写入下面的两个环境变量即可,之后也可以改用 actions secret来设置环境变量。
serverless.yaml 完全配置 注意,如果是web类型的云函数,默认生成的配置是用不了的,所以一定要针对自己的需求仔细查看这个配置说明
TENCENT_SECRET_ID=123
TENCENT_SECRET_KEY=123
下面贴一下我的 yaml 文件 触发器部分还存在问题,绑定不上触发器…
app: gotest
stage: 'dev'
component: scf
name: scfdemo
inputs:
src: ./
type: web # 默认是event类型,本应用为web函数
entryFile: main # 入口文件名(代码中无scf_bootstrap文件,且函数类型为web类型时生效)
runtime: Go1
namespace: default
region: ap-hongkong
memorySize: 64 # 分配内存 MB
initTimeout: 3 # 初始化超时时间,单位秒
timeout: 10 # 函数执行超时时间
ignoreTriggers: true # 记得开启这个
部分配置可能不是很好填,比如触发器之类的,网上的资料 貌似都是针对事件触发函数的写法,而没有适用于web函数的,照着事件触发函数的api网关的写法写上去,部署之后代码依旧关联不上api网关,无法从外部调用,折腾来折腾去,我的解决方案是:ignoreTriggers: true 忽略触发器,也就是说这个 serverless.yaml 文件不再定义触发器(api网关), api网关由我们自己手动去网页上设置。如果不加上这个选项,即使我们手动设置好了,下一次部署也会把已有的api网关关联覆盖掉。
之后如果能找到更合适的方法再更新。
通过Github Actions 构建
先前往 https://console.cloud.tencent.com/cam/capi 获取密钥。
然后项目推到github上,在setting中添加secret环境变量
然后在网页中打开Actions页面,先选择一个Go的标准workflow作为基础,在其上添加scf的工作流。
name: Go
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.17
- name: Build
run: go build -v -o main ./...
- name: Chmod
run: |
chmod +x main
ls -lh
- name: Set up Node
uses: actions/setup-node@master
- name: Set up serverless
run: npm install -g serverless
- name: Deploy tecent
run: |
ls -lh
serverless deploy
env: # 环境变量
STAGE: dev #您的部署环境
SERVERLESS_PLATFORM_VENDOR: tencent #serverless 境外默认为 aws,配置为腾讯
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} #您的腾讯云账号 sercret ID
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} #您的腾讯云账号 sercret key
docker镜像方式部署
如此,每次我们push都会触发一次构建与部署,工作体验要比之前好一些了。