只更新程式碼,然後釋出版本:基於 Serverless Devs 原子化操作阿里雲函式計算

Serverless發表於2021-07-10

作者 | 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進行專案的部署:

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

我們可以編輯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:

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

fe6.png)

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

25b.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-01d102a6

eab9.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-bd154507

e19d.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-ed59c494fd

7d.png)

CI/CD 元件的使用

當我們想要把上面只更新程式碼,釋出版本的能力整合到 CI/CD,或者某些自動化流程中,如何操作呢?

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

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

dc47.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:

      - 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}} --AccessKeySecr

et ${{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



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69981534/viewspace-2780713/,如需轉載,請註明出處,否則將追究法律責任。

相關文章