如何做Serverless自动化部署

前言 如何做Serverless自动化部署
文章图片

随着敏捷和DevOps的流行,CI/CD已经成了所有开发者在开发过程中必不可少的最佳实践,主要目标是以更快的速度、更短的周期向用户交付行之有效的软件。
它能给我们带来如下好处:

  • 缩短发布周期
  • 降低风险
  • 提高代码质量
  • 更高效的反馈循环
  • 可视化过程
因此在Serverless越来越流行的今天,如何让Serverless的项目也能快速的搭建CI/CD,这是这篇文章的重点。
习惯了CI/CD的用户可能都期望有一个快速搭建自动化部署的教程,所以这篇文章会以下面几个流行的平台来讲解如何搭建自动化部署,让你能够推送代码就自动完成部署。
  • Github
  • Jenkins
  • Coding
基于 GitHub 的自动化部署 GitHub Actions是Github推出的自动化软件开发工作流。 通过Actions可以执行任何任务,其中就包括 CI/CD。
如何做Serverless自动化部署
文章图片

前提条件
  • 已托管你的 Serverless 项目代码到Github。
  • 项目中必须包含Serverless framework部署需要用到的serverless.ymlserverless.yml的使用方式请参考官网。
  • 如果是Web函数,需保证根目录有scf_bootstrap文件,具体请参考官网。
操作步骤
为了让这个部署过程更简单,我在GitHub的市场中发布一个腾讯云Serverless部署的Action来帮助大家快速完成自动化部署。
在GitHub的Marketplace中搜索tencent serverless就可以找到。如下图。里面有详细的Action代码。
如何做Serverless自动化部署
文章图片

首先,在Actions里面选择Set up a workflow yourself,如下图。
如何做Serverless自动化部署
文章图片

如果知道如何使用Action,那么直接用下面这句就可以了,里面封装了安装Serverless framework和执行部署命令的步骤。
- name: serverless scf deploy uses: woodyyan/tencent-serverless-action@main

如果不知道如何使用Action,可以根据不同的语言选择下列不同的yml写法,下面我列举了Python、Java、NodeJS的写法。
【如何做Serverless自动化部署】适用于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可以在腾讯云的访问控制里面获取。
如何做Serverless自动化部署
文章图片

配置完成之后,每次推送代码,都将会自动触发部署流程,同时在Actions中可以实时看到执行结果与错误日志。如下图。
大家还可以根据项目需要,在流程中添加测试、安全检查、发布等步骤。
如何做Serverless自动化部署
文章图片

基于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实践,与大家分享。
如果有任何疑问或在操作中遇到任何困难可以在文章下方留言,我会回复大家。

    推荐阅读