当我们在体验Serverless之后,欲将项目真真实实的部署到Serverless架构时,CI/CD是我们很多人绕不开的话题,那么基于Serverless Devs这款工具,如何快速的和Github Action进行有机结合,实现CI/CD的能力呢?
CI/CD的“脚手架”
现在有很多的脚手架,但是Serverless CI/CD的脚手架应该还是少数的,而Serverless Devs为我们提供了一个CI/CD的脚手架,以Github Action为例,我们可以执行代码,快速在项目下初始化CI/CD模板。
例如,当前我的项目结构:
此时,我只需要告诉Serverless Devs,我要生成一个Github Action模板即可:
s cli cicd github
我们可以看到,系统会在当前项目创建相对应的CI/CD模板:
至此,我们完成了第一个步骤,初始化一个CI/CD的模板。
流程配置
Yml文件配置
系统所为我们生成的模板文件实际上是一个非常简单的案例:
name: Serverless Devs Project CI/CD
on:
push:
branches: [ master ]
jobs:
serverless-devs-cd:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 12
registry-url: https://registry.npmjs.org/
- run: npm install
- run: npm install -g @serverless-devs/s
# 默认密钥配置指令是阿里云密钥配置指令,更多可以参考:
# 如何通过Github Action使用Serverless Devs做CI/CD:http://short.devsapp.cn/cicd/github/action/usage
# Serverless Devs的官网是通过Serverless Devs部署的: http://short.devsapp.cn/cicd/github/action/practice
- run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
- run: s deploy
整个核心流程是:
- 下载
serverless-devs
- 配置密钥信息
- 项目部署(执行
s deploy
命令)
但是在实际生产过程中,我们可能需要自定义使用一些功能,此时可以参考Github Action的文档:https://docs.github.com/cn/actions
例如,我在下载serverless-devs
之后,配置密钥之后,我需要进行build
等操作,操作之后,我在删除临时生成的文件夹"./abc",此时我们可以:
...
- run: npm install
- run: npm install -g @serverless-devs/s
# 默认密钥配置指令是阿里云密钥配置指令,更多可以参考:
# 如何通过Github Action使用Serverless Devs做CI/CD:http://short.devsapp.cn/cicd/github/action/usage
# Serverless Devs的官网是通过Serverless Devs部署的: http://short.devsapp.cn/cicd/github/action/practice
- run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
- run: s build
- run: rm -rf ./abc
- run: s deploy
所以,具体的流程,我们完全可以根据需求自定义。
账号信息配置
在上一个流程中,我们涉及到密钥信息的配置,我们可以使用Serverless Devs为我们提供的s config add
命令进行。
例如,阿里云的账号体系需要AccountID
,AccessKeyID
,AccessKeySecret
等内容,此时我们可以:
- 将密钥信息配置到Github Secrets中
我们创建多对密钥信息:
例如,我此处配置了三对密钥:
ALIYUN_ACCOUNT_ID
对应阿里云密钥体系中的AccountID
;ALIYUN_ACCESS_KEY_ID
对应阿里云密钥体系中的AccessKeyID
;ALIYUN_ACCESS_KEY_SECRET
对应阿里云密钥体系中的AccessKeySecret
我此时则可以对应配置:
s config add --AccountID ${{secrets.ALIYUN_ACCOUNT_ID}} --AccessKeyID ${{secrets.ALIYUN_ACCESS_KEY_ID}} --AccessKeySecret ${{secrets.ALIYUN_ACCESS_KEY_SECRET}} -a website_access
当然,不同厂商可能需要不同的密钥信息配置,部分情况下厂商可能还需要配置临时密钥,此时可以通过s config add -h
获取密钥配置的帮助文档:
jiangyu@ServerlessSecurity ~ % s config add -h
Usage: s config add [commands] [name]
You can add an account
Example:
$ s config add
$ s config add --AccessKeyID ****** --AccessKeySecret ****** --AccountID ******
$ s config add --AccessKey ****** --SecretKey ******
Configuration parameters for cloud vendors:
alibaba: AccountID, AccessKeyID, AccessKeySecret
aws: AccessKeyID, SecretAccessKey
baidu: AccessKeyID, SecretAccessKey
huawei: AccessKey, SecretKey
google: PrivateKeyData
tencent: AccountID, SecretID, SecretKey
🧭 How to get the key: https://github.com/Serverless-Devs/docs/tree/master/zh/others/provider-config
Options:
--AccountID [AccountID] AccountID of key information
--AccessKeyID [AccessKeyID] AccessKeyID of key information
--AccessKeySecret [AccessKeySecret] AccessKeySecret of key information
--SecretAccessKey [SecretAccessKey] SecretAccessKey of key information
--AccessKey [AccessKey] AccessKey of key information
--SecretKey [SecretKey] SecretKey of key information
--SecretID [SecretID] SecretID of key information
--PrivateKeyData [PrivateKeyData] PrivateKeyData of key information
-kl , --keyList [keyList] Keys of key information, like: -kl key1,key2,key3
-il , --infoList [infoList] Values of key information, like: -kl info1,info2,info3
-a , --aliasName [name] Key pair alias, if the alias is not set, use default instead
-h, --help Display help for command
如何配置自定义Key-Value的密钥,例如某个组件是我自己开发的,我需要配置一个Key为tempToken1,Value为tempValue1,和Key为tempToken2,Value为tempValue2,别名为demo的密钥对?
此时可以通过参数-kl , --keyList [keyList]
和-il , --infoList [infoList]
自定义添加,例如:s config add -kl tempToken1,tempToken2 -il tempValue1,tempValue2 -a demo
密钥中的别名有什么?
密钥中的别名,是为了帮助Serverless Devs更快的识别出你要用的密钥信息,主要是在Yaml中体现,例如:
在此处配置的密钥信息(默认是default),如果此处配置了密钥别名是"default",那么系统就会在执行相关操作的时候,去获取名为"default"的密钥信息;我的一个应用中,涉及到部署到多个平台,需要多个密钥信息,如何配置?
例如,当存在项目:
此时,该app中涉及到两个Service,分别用了不同的组件以及不同的密钥内容website_access
,fc_access
我们可以通过配置多个密钥信息来进行CI/CD的配置
- 在Github Secrets处配置对应的Key-Value
- 在生成的
.github/workflow/serverless-devs.yml
文件中配置密钥信息:s config add -kl tempToken1,tempToken2 -il tempValue1,tempValue2 -a website_access s config add -kl tempToken3,tempToken4 -il tempValue3,tempValue4 -a fc_access