如何做Serverless自動化部署

Woody發表於2022-02-28

前言

1.png

隨著敏捷和DevOps的流行,CI/CD已經成了所有開發者在開發過程中必不可少的最佳實踐,主要目標是以更快的速度、更短的週期向使用者交付行之有效的軟體。

它能給我們帶來如下好處:

  • 縮短髮布週期
  • 降低風險
  • 提高程式碼質量
  • 更高效的反饋迴圈
  • 視覺化過程

因此在Serverless越來越流行的今天,如何讓Serverless的專案也能快速的搭建CI/CD,這是這篇文章的重點。

習慣了CI/CD的使用者可能都期望有一個快速搭建自動化部署的教程,所以這篇文章會以下面幾個流行的平臺來講解如何搭建自動化部署,讓你能夠推送程式碼就自動完成部署。

  • Github
  • Jenkins
  • Coding

基於 GitHub 的自動化部署

GitHub Actions是Github推出的自動化軟體開發工作流。 通過Actions可以執行任何任務,其中就包括 CI/CD。

2.png

前提條件

  • 已託管你的 Serverless 專案程式碼到Github。
  • 專案中必須包含Serverless framework部署需要用到的serverless.ymlserverless.yml的使用方式請參考官網
  • 如果是Web函式,需保證根目錄有scf_bootstrap檔案,具體請參考官網

操作步驟

為了讓這個部署過程更簡單,我在GitHub的市場中釋出一個騰訊雲Serverless部署的Action來幫助大家快速完成自動化部署。

在GitHub的Marketplace中搜尋tencent serverless就可以找到。如下圖。裡面有詳細的Action程式碼。

3.png

首先,在Actions裡面選擇Set up a workflow yourself,如下圖。

4.png

如果知道如何使用Action,那麼直接用下面這句就可以了,裡面封裝了安裝Serverless framework和執行部署命令的步驟。

    - name: serverless scf deploy
      uses: woodyyan/tencent-serverless-action@main

如果不知道如何使用Action,可以根據不同的語言選擇下列不同的yml寫法,下面我列舉了Python、Java、NodeJS的寫法。

適用於Python專案

# 當程式碼推動到 main 分支時,執行當前工作流程
# 更多配置資訊: https://docs.github.com/cn/actions/getting-started-with-github-actions
name: deploy serverless scf
on: #監聽的事件和分支配置
  push:
    branches:
      - main
jobs:
  deploy:
    name: deploy serverless scf
    runs-on: ubuntu-latest
    steps:
      - name: clone local repository
        uses: actions/checkout@v2
      - name: deploy serverless
        uses: woodyyan/tencent-serverless-action@main
        env: # 環境變數
          STAGE: dev #您的部署環境
          SERVERLESS_PLATFORM_VENDOR: tencent #serverless 境外預設為 aws,配置為騰訊
          TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} #您的騰訊雲賬號 sercret ID,請在Settings-Secrets中配置
          TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} #您的騰訊雲賬號 sercret key,請在Settings-Secrets中配置

適用於Java專案,請仔細看程式碼中的備註說明

name: deploy serverless scf
on: #監聽的事件和分支配置
  push:
    branches:
      - main
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
          settings-path: ${{ github.workspace }} # location for the settings.xml file
      - name: Build with Gradle # Gradle專案用這個
        uses: gradle/gradle-build-action@937999e9cc2425eddc7fd62d1053baf041147db7
        with:
          arguments: build
      - name: Build with Maven # Maven專案用這個
        run: mvn -B package --file pom.xml
      - name: create zip folder # 此步驟僅用於Java Web函式,用於存放jar和scf_bootstrap檔案。Java事件函式只需要在Serverless.yml中指定Jar目錄就好。
        run: mkdir zip
      - name: move jar and scf_bootstrap to zip folder # 此步驟僅用於Java Web函式,用於移動jar和scf_bootstrap檔案。Java事件函式只需要在Serverless.yml中指定Jar目錄就好。注意如果是Maven編譯請修改下面的jar路徑為/target。
        run: cp ./build/libs/XXX.jar ./scf_bootstrap ./zip
      - name: deploy serverless
        uses: woodyyan/tencent-serverless-action@main
        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

適用於NodeJS專案

# 當程式碼推動到 main 分支時,執行當前工作流程
# 更多配置資訊: https://docs.github.com/cn/actions/getting-started-with-github-actions
name: deploy serverless scf
on: #監聽的事件和分支配置
  push:
    branches:
      - main
jobs:
  deploy:
    name: deploy serverless scf
    runs-on: ubuntu-latest
    steps:
      - name: clone local repository
        uses: actions/checkout@v2
      - name: install dependency
        run: npm install
      - name: build
        run: npm build
      - name: deploy serverless
        uses: woodyyan/tencent-serverless-action@main
        env: # 環境變數
          STAGE: dev #您的部署環境
          SERVERLESS_PLATFORM_VENDOR: tencent #serverless 境外預設為 aws,配置為騰訊
          TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} #您的騰訊雲賬號 sercret ID,請在Settings-Secrets中配置
          TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} #您的騰訊雲賬號 sercret key,請在Settings-Secrets中配置

最後,由於部署的時候需要用到騰訊雲的TENCENT_SECRET_IDTENCENT_SECRET_KEY,所以需要在Github程式碼倉庫的設定中的Secrets裡面配置這兩個變數。如下圖所示。ID和KEY可以在騰訊雲的訪問控制裡面獲取。

5.png

配置完成之後,每次推送程式碼,都將會自動觸發部署流程,同時在Actions中可以實時看到執行結果與錯誤日誌。如下圖。

大家還可以根據專案需要,在流程中新增測試、安全檢查、釋出等步驟。

6.png

基於Jenkinsfile的自動化部署

Jenkinsfile是通用於Jenkins、Coding等平臺的,因此只需要配置好Jenkinsfile,則能在這些平臺上完成自動化部署。

前提條件

  • 已託管你的 Serverless 專案到 Coding/Github/Gitlab/碼雲等平臺。
  • 專案中必須包含Serverless framework部署需要用到的serverless.ymlserverless.yml的使用方式請參考官網
  • 如果是Web函式,需保證根目錄有scf_bootstrap檔案,具體請參考官網

操作步驟

根據不同語言的需要,我把所有語言需要用到的語法都寫在下面的Jenkinsfile中了,適用於Python、Java、NodeJS,請仔細閱讀註釋。

pipeline {
  agent any
  stages {
    stage('檢出') {
      steps {
        checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
            userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
      }
    }
        stage('Package'){ // 此stage僅用於Java專案
       steps{
        container("maven") {
          echo 'Package start'
          sh "mvn package" // 此行用於Java Maven專案
                    sh "./gradlew build" // 此行用於Java Gradle專案
                    sh "mkdir zip" // 此行僅用於Java Web函式,用於存放jar和scf_bootstrap檔案。Java事件函式只需要在Serverless.yml中指定Jar目錄就好。
          sh "cp ./build/libs/XXX.jar ./scf_bootstrap ./zip" // 此行僅用於Java Web函式,用於移動jar和scf_bootstrap檔案。Java事件函式只需要在Serverless.yml中指定Jar目錄就好。注意如果是Maven編譯請修改下面的jar路徑為/target。
        }           
           }
    }
    stage('安裝依賴') {
      steps {
        echo '安裝依賴中...'
        sh 'npm i -g serverless'
        sh 'npm install' // 此行用於NodeJS專案
        echo '安裝依賴完成.'
      }
    }
    stage('部署') {
      steps {
        echo '部署中...'
        withCredentials([
          cloudApi(
            credentialsId: "${env.TENCENT_CLOUD_API_CRED}",
            secretIdVariable: 'TENCENT_SECRET_ID',
            secretKeyVariable: 'TENCENT_SECRET_KEY'
          ),
        ]) {
             // 生成憑據檔案
             sh 'echo "TENCENT_SECRET_ID=${TENCENT_SECRET_ID}\nTENCENT_SECRET_KEY=${TENCENT_SECRET_KEY}" > .env'
             // 部署
             sh 'sls deploy --debug'   
             // 移除憑據
             sh 'rm .env' 
        }
        echo '部署完成'
      }
    }
  }
}

使用上面的Jenkinsfile就可以在Jenkins、coding等平臺一鍵完成CI/CD配置了。

注意,需要在平臺中配置騰訊雲需要用到的TENCENT_SECRET_IDTENCENT_SECRET_KEY這兩個變數。

總結

作為開發者,總是希望所有程式碼工作都是自動化完成,都能提高效率。因此,熟練的掌握如何快速配置自動化的CI/CD流程,是每個開發者必須掌握的技能之一。

在這裡分享這些開箱即用的配置,也是希望能大大減少大家的學習成本,快速上手開始核心業務開發。

未來我還會繼續探索更多的適用於Serverless的DevOps實踐,與大家分享。

如果有任何疑問或在操作中遇到任何困難可以在文章下方留言,我會回覆大家。

相關文章