開發與維運

只更新代碼,然後發佈版本:基於 Serverless Devs 原子化操作阿里雲函數計算

image

作者 | 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 函數即可:

image

創建完成之後,我們只需要進入到對應的文件夾,並且執行s deploy即可將項目快速部署到線上。在進入到項目後,我們可以在項目下看到一個s.yaml的文件,這個文件就是資源描述文件:
image

其完整的描述:

https://github.com/devsapp/fc/blob/main/docs/Others/yaml.md

此時我們可以通過s deploy進行項目的部署:
image

部署完成,我們可以打開系統分配給我們的域名,我們可以看到內容:

image

通過無 Yaml 模式更新函數

我們可以編輯index.pyHello world!變為Hello world Serverless Devs!

image

然後我們就要接觸一個新的組件 FC-API :

https://github.com/devsapp/fc-api

我們可以執行幫助文檔:s cli fc-api -h
image

此時我們需要明確的是,當我們執行s cli時候,系統就不去讀 Yaml,而直接進行相關方法的調用。

如果我們對這個方法還是不清楚,我們可以s cli fc-api updateFunction -h

image

此時我們只需要按照規範,填寫好地區,服務名,函數名,以及要更新的字段即可:

s cli fc-api updateFunction --region cn-hangzhou --serviceName fc-deploy-service --functionName http-trigger-function--code '{"zipFile": "./"}'

完成之後,我們可以再去看一下之前的頁面是否同步更新了:
image

此處可能有疑問,你的幫助文檔寫的是:--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

![image](https://user-images.githubusercontent.com/21079031/124550239-f5fb9900-de62-11eb-819b-9e662cb80fe6.png)

![image](https://user-images.githubusercontent.com/21079031/124550302-0ca1f000-de63-11eb-974e-9453449e525b.png)

>此時為了方便,Serverless devs 支持本地路徑,會幫助你進行打包等操作。

當然,我們還可以更刺激一些,修改其他內容,如單純修改一些 timeout:

s cli fc-api updateFunction —region cn-hangzhou —serviceName fc-deploy-service —functionName http-trigger-function —timeout 70

![image](https://user-images.githubusercontent.com/21079031/124550447-3bb86180-de63-11eb-836a-01d102a6eab9.png)

## 通過無 Yaml 模式發佈版本

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

![image](https://user-images.githubusercontent.com/21079031/124550575-715d4a80-de63-11eb-8182-bd154507e19d.png)

嘗試拼接參數:

s cli fc-api publishVersion —region cn-hangzhou —serviceName fc-deploy-service —description “This is a test version”

得到結果:

![image](https://user-images.githubusercontent.com/21079031/124550685-9ce03500-de63-11eb-95bf-ed59c494fd7d.png)

## CI/CD 組件的使用

當我們想要把上面只更新代碼,發佈版本的能力集成到 CI/CD,或者某些自動化流程中,如何操作呢?

以 GithubAction 為例,我們可以直接執行`s cli cicd`:

![image](https://user-images.githubusercontent.com/21079031/124550942-07917080-de64-11eb-8b57-d59eba0cdc47.png)

接下來,我們對`./.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 倉庫,嘗試一下:
image

創建完成之後,我們可以按照案例提醒,進行密鑰的配置:

# 默認密鑰配置指令是阿里雲密鑰配置指令,更多可以參考:

# 如何通過 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

image

image

接下來, 我們通過 git init 等一系列指令,完成代碼推到倉庫:

image

此時,我們再次修改代碼:

image

修改完成之後,我們將代碼 push 到測試倉庫,可以看到,我們在 Action 中可以看到一個 workflow 在執行:

image

稍等片刻,當這個流程完成:

image

我們打開之前的頁面,可以看到,網頁內容已經順利被更新:

image

總結

本文以阿里云為例,通過在 Github 上使用 Servelress Devs 單純對代碼進行更新,並進行版本發佈,該流程是比較常見的,也是比較通用的,希望讀者可以發揮想象力,將這個流程應用到自己的項目中。

(文章轉載自 Go Serverless)

Serverless Devs 參與的貢獻

Serverless Devs 的開源為國內外開發者提供了 Serverless 工具的新選擇,讓開發者可以以更短的路徑體驗到多雲 Serverless 產品,以更快的速度創建和部署 Serverless 應用,以更簡單和更自動化的方法進行項目管理/運維,未來期待更多開發者參與共建。

目前代碼已經在 Gitee(碼雲)和 GitHub 上正式開放:


Leave a Reply

Your email address will not be published. Required fields are marked *