Featured image of post Go与云函数(二) 自动构建与部署

Go与云函数(二) 自动构建与部署

在前文已经能手动构建程序并发布的基础上,为了解决windows构建的程序权限丢失以及构建部署过于繁琐的问题,尝试使用Serverless Framework与Github actions实现自动构建与部署。

腾讯云函数 自动化构建与部署

前文已经实现了在本地构建一个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云函数目录。 0IPXVX2WG8S4HL3I0HM.png 选择部署到云端后,居然是 扫码或者点击链接登陆的…不过如果在初始化项目后马上部署到云端,那么你是没办法进行配置的,所以这里可以先不部署。

先看看serverless初始化出来的目录,重点是 serverless.yaml 这个文件,我们可以直接复制到我们自己的项目的文件夹中,以前面的web函数中的简易http服务器为例,查看该yaml的内容.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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类型的云函数,默认生成的配置是用不了的,所以一定要针对自己的需求仔细查看这个配置说明

1
2
TENCENT_SECRET_ID=123
TENCENT_SECRET_KEY=123

成功部署了

下面贴一下我的 yaml 文件 触发器部分还存在问题,绑定不上触发器…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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环境变量 image.png

然后在网页中打开Actions页面,先选择一个Go的标准workflow作为基础,在其上添加scf的工作流。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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都会触发一次构建与部署,工作体验要比之前好一些了。

comments powered by Disqus
本站访客数:
Built with Hugo
主题 StackJimmy 设计