/如何做Serverless自动化部署?

如何做Serverless自动化部署?

引言


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

它能给我们带来如下好处

  • 缩短发布周期

  • 降低风险

  • 提高代码质量

  • 更高效的反馈循环

  • 可视化过程

因此在Serverless越来越流行的今天,如何让Serverless的项目也能快速的搭建CI/CD,是这篇文章的重点。

习惯了CI/CD的用户都期望有一个快速搭建自动化部署的教程,这篇文章会以下面几个流行的平台来讲解如何搭建自动化部署,让你能够推送代码的同时完成自动化部署。

  • Github

  • Jenkins

  • Coding

一、基于GitHub的自动化部署

GitHub Actions是Github推出的自动化软件开发工作流。通过Actions可以执行任何任务,其中就包括CI/CD。

GitHub Actions:

https://docs.github.com/cn/actions

(一)前提条件

已托管你的Serverless项目代码到Github。
项目中必须包含Serverless framework部署需要用到的serverless.yml。serverless.yml的使用方式请参考官网文档:https://cloud.tencent.com/document/product/1154/51080

如果是Web函数,需保证根目录有scf_bootstrap文件,具体请参考官网文档:https://cloud.tencent.com/document/product/583/56126
(二)操作步骤

为了让这个部署过程更简单,我在GitHub的市场中发布一个腾讯云 Serverless部署的Action来帮助大家快速完成自动化部署。

在GitHub的Marketplace中搜索tencent serverless (https://github.com/marketplace/actions/tencent-serverless-action) 就可以找到。

如下图,里面有详细的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 scfon: #监听的事件和分支配置  push:    branches:      - mainjobs:  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 scfon: #监听的事件和分支配置  push:    branches:      - mainjobs:  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 scfon: #监听的事件和分支配置  push:    branches:      - mainjobs:  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的使用方式请参考官网文档:https://cloud.tencent.com/document/product/1154/51080
如果是Web函数,需保证根目录有scf_bootstrap文件,具体请参考官网文档:https://cloud.tencent.com/document/product/583/56126

(二)操作步骤

根据不同语言的需要,我把所有语言需要用到的语法都写在下面的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实践,在腾讯云云函数公众号与大家分享。


如果您对用Serverless实现自动化部署技术感兴趣,欢迎添加小助手(微信号:skychoud)加入技术交流群和产品技术大咖一起探讨!


本文来自微信公众号“腾讯云开发者”(ID:QcloudCommunity)。大作社经授权转载,该文观点仅代表作者本人,大作社平台仅提供信息存储空间服务。