作者 | Anycodes
眾所周知,隨著時間的發展,Serverless 命令行工具也逐漸的玩出了更多的花樣,就目前來看,常見的形態有兩種,一種是通過 Yaml 來進行資源的描述,另外一種是純粹的命令行操作,而不依賴這些內容。
第一種通過 Yaml 來進行資源描述,其好處不言而喻,目前主流的 Serverless 開發者工具均是類似的模式,例如阿里雲的 Funcraft,著名的開源項目 Serverless Framework 等,通過 Yaml,使用者可以通過簡單的命令,進行復雜的操作,例如開發者在 Yaml 中描述好服務、函數等配置,描述好代碼位置,只需要 deploy 就可以將本地項目部署到線上,非常方便。但是這裡有一個非常明顯的劣勢,在很多時候我們的企業管理者,給每個人分配的權限是固定的,例如運維人員只能更新某些內容,開發人員只能更新某些代碼,某些負責可以發佈版本等,那麼這個時候”一把梭”的行為就顯得非常尷尬,想為開發者做更多,但是有些開發者不需要你做更多,那麼”高階能力”和”原子能力”的平衡就顯得至關重要的。
第二種模式,雖然是不需要依賴 Yaml,在很多時候使用起來可能會稍微複雜一些,例如我們創建一個函數可能涉及到很多流程:創建服務,創建函數,創建觸發器…,相對比上面所說的一條指令而言,確實複雜很多,但是這種無 Yaml 的模式,更適合做原子操作,可以最大程度解決上述問題,同時這種做法也可以在一定程度上進行更多的拓展,例如某些本不需要依賴 Yaml 的行為:查詢服務列表,查詢函數列表……
所以這兩種模式各有優缺點,我們在使用的時候完全可以組合來使用,達到最大的一個生產效能。那麼一個新問題來了,以阿里雲函數計算為例,如何同時擁有這兩種模式的使用方法呢?
其實 Serverless Devs 天然支持 Yaml 描述和非 Yaml 描述的能力,例如阿里雲函數計算的 FC 組件就是一個可以依靠 Yaml 描述進行資源操作的組件,而 FC-API 組件則是 API 相關的原子性操作。
本文將會以這樣一個案例/場景為例,為讀者介紹這兩者的使用方法:
1.通過 Serverless Devs 快速創建一個服務/函數/觸發器
2.通過無 Yaml 的模式對其中的代碼部分進行單獨的更新
3.更新之後發佈一個版本
4.通過 Git+Github Action 實現一個代碼自動化發佈和版本自動化發佈的能力
快速創建函數
我們只需要通過s init並且選擇阿里雲函數計算的 Python3 Http 函數即可:
創建完成之後,我們只需要進入到對應的文件夾,並且執行s deploy,即可將項目快速部署到線上。在進入到項目後,我們可以在項目下看到一個s.yaml的文件,這個文件就是資源描述文件:
其完整的描述:
https://github.com/devsapp/fc/blob/main/docs/Others/yaml.md
此時我們可以通過s deploy進行項目的部署:
部署完成,我們可以打開系統分配給我們的域名,我們可以看到內容:
通過無 Yaml 模式更新函數
我們可以編輯index.py,將Hello world!變為Hello world Serverless Devs!
然後我們就要接觸一個新的組件 FC-API :
https://github.com/devsapp/fc-api
我們可以執行幫助文檔:s cli fc-api -h:
此時我們需要明確的是,當我們執行s cli的時候,系統就不去讀 Yaml,而直接進行相關方法的調用。
如果我們對這個方法還是不清楚,我們可以:s cli fc-api updateFunction -h
此時我們只需要按照規範,填寫好地區,服務名,函數名,以及要更新的字段即可:
s cli fc-api updateFunction --region cn-hangzhou --serviceName fc-deploy-service --functionName http-trigger-function--code '{"zipFile": "./"}'
完成之後,我們可以再去看一下之前的頁面是否同步更新了:
此處可能有疑問,你的幫助文檔寫的是:--code string [JSON String] The code of the function. The code must be packaged into a ZIP file.
你是怎麼知道傳遞--code '{"zipFile": "./"}'的?
因為在我們看幫助文檔的時候,題已經提醒了我們這是一個 JSON String,同時在幫助文檔最上面是有鏈接地址:
```
Usage
s cli fc-api updateFunction
API Document: https://help.aliyun.com/document_detail/189986.html
Options
--region stringThe region of fc endpoint.
--access stringSpecify the key name.
--props stringThe json string of props.
--serviceName stringThe name of the service.
--functionName stringThe description of the function.
--code string[JSON String]The code of the function.The code must be packaged into a ZIP file.
>此時,我們可以打開 https://help.aliyun.com/document_detail/189986.html:


>此時為了方便,Serverless devs 支持本地路徑,會幫助你進行打包等操作。
當然,我們還可以更刺激一些,修改其他內容,如單純修改一些 timeout:
s cli fc-api updateFunction —region cn-hangzhou —serviceName fc-deploy-service —functionName http-trigger-function —timeout 70

## 通過無 Yaml 模式發佈版本
和上面一樣,我們可以用`s cli fc-api -h `查看一下版本發佈的方法:`s cli fc-api publishVersion -h`

嘗試拼接參數:
s cli fc-api publishVersion —region cn-hangzhou —serviceName fc-deploy-service —description “This is a test version”
得到結果:

## CI/CD 組件的使用
當我們想要把上面只更新代碼,發佈版本的能力集成到 CI/CD,或者某些自動化流程中,如何操作呢?
以 GithubAction 為例,我們可以直接執行`s cli cicd`:

接下來,我們對`./.github/workflow/serverless-devs.yml`進行自定義編輯:
```yaml
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 cli fc-api updateFunction --region cn-hangzhou --serviceName fc-deploy-service --functionName http-trigger-function --code '{"zipFile":"./"}'
- run: s cli fc-api publishVersion --region cn-hangzhou --serviceName fc-deploy-service
我們只是在最後加了兩個人 run,一個是發佈代碼,一個是發佈版本,此時我們可以創建一個 Github 倉庫,嘗試一下:
創建完成之後,我們可以按照案例提醒,進行密鑰的配置:
# 默認密鑰配置指令是阿里雲密鑰配置指令,更多可以參考:
# 如何通過 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
接下來, 我們通過 git init 等一系列指令,完成代碼推到倉庫:
此時,我們再次修改代碼:
修改完成之後,我們將代碼 push 到測試倉庫,可以看到,我們在 Action 中可以看到一個 workflow 在執行:
稍等片刻,當這個流程完成:
我們打開之前的頁面,可以看到,網頁內容已經順利被更新:
總結
本文以阿里云為例,通過在 Github 上使用 Servelress Devs 單純對代碼進行更新,並進行版本發佈,該流程是比較常見的,也是比較通用的,希望讀者可以發揮想象力,將這個流程應用到自己的項目中。
(文章轉載自 Go Serverless)
Serverless Devs 參與的貢獻
Serverless Devs 的開源為國內外開發者提供了 Serverless 工具的新選擇,讓開發者可以以更短的路徑體驗到多雲 Serverless 產品,以更快的速度創建和部署 Serverless 應用,以更簡單和更自動化的方法進行項目管理/運維,未來期待更多開發者參與共建。
目前代碼已經在 Gitee(碼雲)和 GitHub 上正式開放:
- Github 地址:https://github.com/serverless-devs
- Gitee 地址:https://gitee.com/organizations/serverless-devs/projects
- Serverless Devs 官網:https://www.serverless-devs.com