如何做Serverless自动化部署

AI觉醒者
• 阅读 1649

前言

如何做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的写法。

适用于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实践,与大家分享。

如果有任何疑问或在操作中遇到任何困难可以在文章下方留言,我会回复大家。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这