前言
隨著敏捷和DevOps的流行,CI/CD已經成了所有開發者在開發過程中必不可少的最佳實踐,主要目標是以更快的速度、更短的週期向使用者交付行之有效的軟體。
它能給我們帶來如下好處:
- 縮短髮布週期
- 降低風險
- 提高程式碼質量
- 更高效的反饋迴圈
- 視覺化過程
因此在Serverless越來越流行的今天,如何讓Serverless的專案也能快速的搭建CI/CD,這是這篇文章的重點。
習慣了CI/CD的使用者可能都期望有一個快速搭建自動化部署的教程,所以這篇文章會以下面幾個流行的平臺來講解如何搭建自動化部署,讓你能夠推送程式碼就自動完成部署。
- Github
- Jenkins
- Coding
基於 GitHub 的自動化部署
GitHub Actions是Github推出的自動化軟體開發工作流。 通過Actions可以執行任何任務,其中就包括 CI/CD。
前提條件
- 已託管你的 Serverless 專案程式碼到Github。
- 專案中必須包含Serverless framework部署需要用到的
serverless.yml
。serverless.yml
的使用方式請參考官網。 - 如果是Web函式,需保證根目錄有
scf_bootstrap
檔案,具體請參考官網。
操作步驟
為了讓這個部署過程更簡單,我在GitHub的市場中釋出一個騰訊雲Serverless部署的Action來幫助大家快速完成自動化部署。
在GitHub的Marketplace中搜尋tencent serverless就可以找到。如下圖。裡面有詳細的Action程式碼。
首先,在Actions裡面選擇Set up a workflow yourself,如下圖。
如果知道如何使用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_ID
和TENCENT_SECRET_KEY
,所以需要在Github程式碼倉庫的設定中的Secrets裡面配置這兩個變數。如下圖所示。ID和KEY可以在騰訊雲的訪問控制裡面獲取。
配置完成之後,每次推送程式碼,都將會自動觸發部署流程,同時在Actions中可以實時看到執行結果與錯誤日誌。如下圖。
大家還可以根據專案需要,在流程中新增測試、安全檢查、釋出等步驟。
基於Jenkinsfile的自動化部署
Jenkinsfile是通用於Jenkins、Coding等平臺的,因此只需要配置好Jenkinsfile,則能在這些平臺上完成自動化部署。
前提條件
- 已託管你的 Serverless 專案到 Coding/Github/Gitlab/碼雲等平臺。
- 專案中必須包含Serverless framework部署需要用到的
serverless.yml
。serverless.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_ID
和TENCENT_SECRET_KEY
這兩個變數。
總結
作為開發者,總是希望所有程式碼工作都是自動化完成,都能提高效率。因此,熟練的掌握如何快速配置自動化的CI/CD流程,是每個開發者必須掌握的技能之一。
在這裡分享這些開箱即用的配置,也是希望能大大減少大家的學習成本,快速上手開始核心業務開發。
未來我還會繼續探索更多的適用於Serverless的DevOps實踐,與大家分享。
如果有任何疑問或在操作中遇到任何困難可以在文章下方留言,我會回覆大家。