Serverless架构与CI/CD工具的结合

CI/CD 是一种通过在应用开发阶段引入自动化流程以频繁向客户交付应用的方法。如图所示,CI/CD 的核心概念是持续集成、持续交付持续部署

作为一个面向开发和运营团队的解决方案,CI/CD 主要针对集成新代码时所引发的问题。具体而言,CI/CD 可以让持续自动化和持续监控贯穿于应用的整个生命周期(从集成、测试阶段到交付和部署阶段)。这些关联的事务通常被统称为“CI/CD管道”,由开发和运维团队以敏捷方式协同支持。



CI/CD的概念与内容简图

在Serverless架构下,通常会有很多函数构成一个完整的功能或服务,这种比较细粒度的功能往往会给后期项目维护带来极大的不便,包括但不限于函数管理、项目的构建、发布层面等的不便。此时在Serverless架构中,CI/CD就显得尤为重要。更加科学、安全的持续集成和部署过程不仅会让整体的业务流程更加规范,也会在一定程度上降低人为操作、手工集成部署所产生错误的概率,同时也会大规模减轻运维人员的工作负担。

如果想要通过CI/CD平台,科学且方便地进行Serverless应用的持续集成、交付和部署,通常情况下我们需要借助相应的开发者工具,例如 Serverless Framework、Serverless Devs 等。Serverless开发者工具配置到CI/CD平台的流程可以简化为图2-55。



Serverless开发者工具配置到CI/CD平台的流程

1.与GitHub Action的集成

在GitHub Action的Yaml文件中,增加Serverless Devs相关下载、配置以及命令执行相关内容。例如,在GitHub仓库中创建文件.github/workflows/publish.yml,文件内容如下:

name: Serverless Devs Project CI/CD

on:
push:
branches: [ master ] jobs:
serverless-devs-cd:
runs-on: ubuntu-latest
steps: - uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 12
registry-url: https://registry.npmjs.org/
- run: npm install
- run: npm install -g @serverless-devs/s
- run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID
${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
- run: s deploy

与GitHub Action集成主要包括以下几部分内容。

  • 通过NPM安装最新版本的 Serverless Devs 开发者工具:
run: npm install -g @serverless-devs/s
  • 通过config命令进行密钥等信息的配置:
run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.
AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
  • 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
run: s deploy

关于密钥的配置:密钥信息是通过${{secrets.*}}获取的,此时,需要将所需要的密钥和对应的Key配置到GitHub Secrets中,例如在上面的案例中,需要AccountID、AccessKeyID、AccessKeySecret三个密钥的 Key 就可以配置相关内容。

找到GitHub Secrets页面,如图所示。



GitHub Secrets页面

创建和配置密钥信息,如图所示。



创建和配置密钥信息页面

此处配置了3对密钥,如图2-58所示。



GitHub仓库配置密钥结果页面

2.与Gitee Go的集成

在开启Gitee Go的服务之后,在流水线的 Yaml 文件中,可以增加 Serverless Devs 的相关下载、配置以及命令执行相关内容。

例如,在GitHub仓库中创建文件.github/workflows/publish.yml,文件内容如下:

name: serverless-devs
displayName: 'Serverless Devs Project CI/CD'
triggers: #流水线触发器配置
push:
- matchType: PRECISE
branch: master
commitMessage: ''
stages:
- stage:
name: deploy-stage
displayName: 'Deploy Stage'
failFast: false steps: #构建步骤配置
- step: npmbuild@1 #采用NPM编译环境
name: deploy-step
displayName: 'Deploy Step'
inputs: #构建输入参数设定
nodeVersion: 14.15 #指定 node 环境版本为 14.15
goals: | #安装依赖,配置相关主题、部署参数并发布部署
node -v
npm -v
npm install -g @serverless-devs/s
s co nfig add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default
s deploy

与GitHub Action集成的流程类似,与Gitee Go集成主要包括以下几部分内容。

  • 通过NPM安装最新版本的 Serverless Devs 开发者工具:
npm install -g @serverless-devs/s
  • 通过config命令进行密钥等信息的配置:
s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret
$ACCESSKEYSECRET -a default
  • 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
s deploy

关于密钥的配置:密钥信息是通过$*获取的,此时将所需的密钥和对应的Key配置到Gitee的环境变量管理中,例如在上面的案例中,需要AccountID、AccessKeyID、AccessKeySecret三个密钥的Key就可以配置相关内容。

找到 Gitee 的环境变量管理页面,如图所示。



Gitee的环境变量管理页面

创建和配置密钥信息,如图所示。



创建和配置密钥信息页面

此处配置了3对密钥,如图所示。



Gitee仓库完成密钥配置页面

3.与Jenkins的集成

在将Serverless Devs集成到Jenkins之前,需要先基于Jenkins官网安装并运行Jenkins。本地启动Jenkins,通过浏览器进入链接 http://localhost:8080并配置完成基础设置,之后新增凭据设置,如下图所示。



Jenkins凭据设置页面

可以根据需要,增加密钥信息。以阿里云为例,新增3个全局凭据:

jenkins-alicloud-account-id : 阿里云 accountId

jenkins-alicloud-access-key-id : 阿里云 accessKeyId

jenkins-alicloud-access-key-secret : 阿里云 accessKeySecret

此时,可以对自身的 Serverless Devs 项目进行完善。创建文件Jenkinsfile:

pipeline {
agent {
docker {
image 'maven:3.3-jdk-8'
} } environment {
ALICLOUD_ACCESS = 'default'
ALICLOUD_ACCOUNT_ID = credentials('jenkins-alicloud-account-id')
ALICLOUD_ACCESS_KEY_ID = credentials('jenkins-alicloud-access-key-id')
ALICLOUD_ACCESS_KEY_SECRET = credentials('jenkins-alicloud-access-key-secret')
} stages {
stage('Setup') {
steps {
sh 'scripts/setup.sh'
}
}
}
}

与Jenkins集成主要内容包括以下两部分。

  • environment部分:主要是根据上面步骤配置的密钥信息,进行密钥的处理。
  • stages部分:包括sh 'scripts/setup.sh'部分,即运行scripts/setup.sh文件,进行相关内容的准备和配置。

准备scripts/setup.sh文件,只需要在项目下创建该文件即可。

#!/usr/bin/env bash
echo $(pwd)
curl -o- -L http://cli.so/install.sh | bash
source ~/.bashrc
echo $ALICLOUD_ACCOUNT_ID
s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_KEY_
ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS
(cd code && mvn package && echo $(pwd))
s deploy -y --use-local --access $ALICLOUD_ACCESS

在该文件中,主要包括以下几个部分。

  • 安装最新版本的Serverless Devs开发者工具:
curl -o- -L http://cli.so/install.sh | bash
  • 通过config命令进行密钥等信息的配置:
s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_
KEY_ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS
  • 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目构建:
s deploy -y --use-local --access $ALICLOUD_ACCESS

完成密钥配置之后,可以创建一个Jenkins流水线。该流水线的源是目标GitHub地址。接下来,就可以开始运行 Jenkins 流水线,运行结束后可得到相关的结果。

4.与云效的集成

在云效中,可以直接选择Serverless Devs开发者工具,并在自定义命令中输入以下内容:

# input your command here
npm install -g @serverless-devs/s
s config add --AccountID ${ACCOUNTID} --AccessKeyID ${ACCESSKEYID} --AccessKeySecret
${ACCESSKEYSECRET} -a default
s deploy

与GitHub Action、Gitee Go以及Jenkins的配置类似,与云效集成同样主要包括3部分。

  • 安装最新版本的 Serverless Devs 开发者工具:
npm install -g @serverless-devs/s
  • 通过config命令进行密钥等信息的配置:
s config add --AccountID ${ACCOUNTID} --AccessKeyID
${ACCESSKEYID} --AccessKeySecret
  • 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
s deploy -y

效果如图所示。



云效命令配置页面

由于在命令中引用了3个重要的环境变量:ACCOUNTID、 ACCESSKEYID、 ACCESSKEYSECRET,因此还需要在环境变量中增加图所示的类似内容。



环境变量配置页面

5. CI/CD平台集成

总结通过上面几个案例不难发现,在做自动化发布时,最核心的3个流程如下。

  • 下载工具:命令为npm install -g @Serverless-devs/s。
  • 配置密钥:命令为s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default。
  • 项目部署:命令为s deploy。

虽然只是以GitHub Action、Gitee Go、Jenkins、云效几个工具作为案例,实际上无论哪个工具与CI/CD平台集成,上述3个核心流程都不会发生本质变化。另外,上面所列举的流程更多是在做自动化发布,在发布之前有时还需要进行一些测试和重新构建,以便根据具体的实际需要进行适当的完善。

综上所述,如果想非常简单、快速、科学地完成Serverless应用的CI/CD建设,一个完善的开发者工具是必不可少的。

Serverless Devs是一款多云开发者工具。我们可以通过该工具非常简单、快速、方便地部署AWS、阿里云、腾讯云等多个云厂商的函数计算等相关服务。同时,Serverless Devs也是一个开源项目,便于用户随时随地贡献组件、应用。

Serverless应用的可观测性

Serverless应用的可观测性被很多用户所关注。可观测性是通过外部表现判断系统内部状态的方式。在应用开发中,可观测性有助于判断系统内部的健康状况,在系统出现问题时,帮助定位问题、排查问题、分析问题;在系统平稳运行时,帮助评估风险,预测可能出现的问题。

在Serverless应用开发中,如果函数的并发度持续升高,很可能是业务推广团队业务规模迅速扩张。为了避免达到并发度限制而触发流控,开发者就需要提前提高并发度。

以阿里云函数计算为例,阿里云函数计算在可观测性层面提供了多种维度,包括Logging、Metrics以及Tracing等。如图所示:



函数计算可观测性整体图表

在控制台监控中心,我们可以查看整体的Metrics、服务级Metrics以及每个函数的Metrics,还可以看到当前函数计算的请求记录。



函数计算的请求记录

根据不同的请求记录,我们还可以查看函数计算的详细信息。



函数计算的请求详情

除了在控制台的监控中心查看函数的日志等信息,我们还可以在函数详情页面看到函数计算的详细日志信息,



函数计算的日志信息

还可以看到Tracing相关信息,如下图所示。



函数计算的Tracing相关信息

—END—



阿里云、蚂蚁集团的 4 位专家刘宇、田初东、卢萌凯、王仁达(排名不分先后)系统梳理阿里在 Serverless 架构下的 AI 经验,联袂推出新书《Serverless 架构下的 AI 应用开发:入门、实战与性能优化》

本书是关于 Serverless 架构下机器学习实战的技术书,我们希望通过简单明了的语言、真实的案例,以及开放的源代码,为读者介绍 Serverless 架构与机器学习相关的基础知识,帮助读者在 Serverless 架构下开发、上线机器学习项目。

更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。

Serverless 架构下的 AI 应用开发的更多相关文章

  1. Serverless 架构下的服务优雅下线实践

    作者 | 行松 阿里巴巴云原生团队 应用发布.服务升级一直是一个让开发和运维同学既兴奋又担心的事情. 兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值:担心的是上线的过程会不会出现意外情 ...

  2. 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

    作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...

  3. 阿里云云开发平台助力风变科技Serverless架构升级实战

    阿里云云开发平台助力风变科技Serverless架构升级实战 背景 风变科技 一个希望通过技术去推动下一代基础教育的组织.旗下产品包括第一代的熊猫书院(读书类产品).第二代的熊猫小课(泛学科综合学习平 ...

  4. 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践

    作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...

  5. 【转】Serverless架构

    这是来自martinfowler.com的Serverless架构一文的大意翻译. 什么是Serverless?    Serverless首先是用于描述我们的应用程序是明显或充分地依赖第三方应用或服 ...

  6. Serverless 架构:用服务代替服务器

    Serverless 架构:用服务代替服务器 转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需 加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:&q ...

  7. Serverless架构

    什么是Serverless架构 Servlerless 架构是新兴的架构体系,在Serverless 架构中,开发者无需考虑服务器的问题,计算资源作为服务而不是服务器的概念出现,这样,开发者只需要关注 ...

  8. 了解Serverless架构

    1 概述 Serverless中文译为“无服务”是一种新兴起的架构模式,公司ESB产品引入Rest微服务服务机制过程,笔者刚好参与其中,其中Serverless作为一个新起的概念,跟微服务架构相关,为 ...

  9. COS 数据湖最佳实践:基于 Serverless 架构的入湖方案

    01 前言 数据湖(Data Lake)概念自2011年被推出后,其概念定位.架构设计和相关技术都得到了飞速发展和众多实践,数据湖也从单一数据存储池概念演进为包括 ETL 分析.数据转换及数据处理的下 ...

  10. 声网王浩宇:RTE 场景下的 Serverless 架构挑战【RTE 2022】

    前言 在「RTE2022 实时互联网大会」中,声网云原生边缘计算团队的负责人 @王浩宇 Dylan 以<RTE 场景下的 Serverless 架构挑战 -- 声网如何兼顾后端服务的可靠.高效和 ...

随机推荐

  1. 2018CCPC桂林 A(贪心,思维)

    题目 分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案.一开始我是想先按这种方式进行合并,然后将最 ...

  2. Apache Paimon流式湖仓学习交流群成立

    Apache Paimon是一个流式数据湖平台.致力于构建一个实时.高效的流式数据湖平台.这个项目采用了先进的流式计算技术,使企业能够实时处理和分析大量数据.Apache Paimon 的核心优势在于 ...

  3. 环形缓冲区 Ring Buffer 的实现

    环形缓冲区(Circular Buffer 或 Ring Buffer)是一种数据结构,它在逻辑上形成一个闭环.这种结构非常适用于需要固定大小的缓冲区的情况,如音频处理.网络通信.实时数据传输等.环形 ...

  4. .NET企业应用安全开发动向-概览

    太长不读版:试图从安全的全局视角触发,探讨安全的重要性,讨论如何识别安全问题的方法,介绍.NET提供的与安全相关的基础设施,以及一些与时俱进的安全问题,为读者建立体系化的安全思考框架. 引言 关于&q ...

  5. [ABC272G] Yet Another mod M

    Problem Statement You are given a sequence $A=(A_1,A_2,\dots,A_N)$ of length $N$ consisting of posit ...

  6. JQuery_1

    1.概念:一个JavaScript框架.简化js开发 JavaScript框架:本质上就是一些js文件,封装了js的原生代码. 2.快速入门: 1.步骤 1.下载JQuery jquery.xxx.j ...

  7. 12 HTTP的实体数据

    目录 数据类型和编码 HTTP协议为什么要关心 body MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型 HTTP 常用数据类型 MIM ...

  8. 解决This application failed to start because cannot find or load the qt platform plugin 'xcb'

    问题描述: 在使用linux系统训练自己的数据集合时,出现了上述问题,首先第一个想法就是先Google,但是在看了一些国内外的文章后依然没有将问题解决 问题原因: 这是由于这几天我在安装cuda.cu ...

  9. Linux磁盘专题

    物理磁盘名次和其作用 盘片:disk 盘片上下都有磁头. 磁盘面: 盘片有上下两面,每一面叫磁盘面 磁头:heads 每个磁头负责一个磁盘面,负责读取数据.将数据写入磁道. 磁头都是固定在机械臂上(机 ...

  10. 利用腾讯快捷登录协议截取 QQ ClientKey / QQKey 实战课程

    本文主要通过利用腾讯网页快捷登录协议来模拟访问并截取已登录 QQ 客户端的Token.Uin.ClientKey.Skey.P_skey等. Step 1. https://ssl.xui.ptlog ...