Skip to main content

2 posts tagged with "阿里云"

View All Tags

通过Gitee+Serverless Devs快速实现函数代码更新与版本发布

Anycodes

Anycodes

Serverless Devs

在上一篇文章中,我们介绍了如何通过Github + Github Action进行单纯的代码更新以及版本发布,在本篇文章中,将会分享如何通过Gitee + Gitee Go实现:

  1. 单纯更新函数代码
  2. 进行版本发布

实践准备#

首先,我们在开始正式实践之前,我们要做几个事情:

  1. 安装Serverless开发者工具
  2. 部署一个函数到线上

安装Serverless开发者工具#

通过 npm 包管理安装:适用于已经预装了 npm 的 Windows、Mac、Linux 平台。在 Windows、Mac、Linux 平台执行以下命令安装 Serverless Devs Tool工具。

$ npm install @serverless-devs/s -g

或者 通过 yarn 进行安装

$ yarn global add @serverless-devs/s

说明:

  • 如果在 Linux 或 MacOS 下执行该命令报错且报错信息为 未找到命令,请执行命令 ln -s serverless-devs安装位置 /usr/bin,serverless-devs安装位置可以通过find / -name s 查找。
  • 如果在 Linxu 下执行该命令报错且报错信息为 Error: EACCES: permission denied,请执行命令 sudo npm install @serverless-devs/s -g
  • 如果安装过程较慢,可以考虑使用淘宝 npm 源,安装命令为 npm --registry=https://registry.npm.taobao.org install @serverless-devs/s -g

部署一个函数到线上#

  1. 在本地初始化一个基于nodejs运行时的koa项目
s init nodejs-koa

初始化的时候会让我们填写相关内容,例如项目目录,选择密钥等:

image

如何配置阿里云密钥信息,可以参考:http://www.serverless-devs.com/docs/provider-config/alibabacloud

  1. 进入到项目目录,并进行部署操作:

image

稍等片刻,即可看到项目已经完成部署:

image

我们打开项目页面:

image

至此,我们的准备环节完成。

基于Gitee的CD能力建设#

在这一步,我们需要做几个事情:

  1. 有一个Gitee仓库
  2. 在仓库中push我们的代码
  3. 配置环境变量
  4. 开启Gitee Go
  5. 更新代码

Gitee仓库的准备#

创建一个Gitee仓库:

image

push代码到仓库#

image

推送后:

image

配置环境变量#

此时,我们将阿里云的密钥等信息配置到环境变量:

image

例如配置:

image

配置后的效果:

image

开启Gitee Go#

此时开启Gitee Go:

image

然后:

image

点击创建流水线,并输入流水线内容:

image

流水线文件名:deploy.yml

流水线配置:

name: koa-cicd
displayName: 'KOA自动部署流水线'
triggers: # 流水线触发器配置
push: # 设置 master 分支 在产生代码 push 时精确触发(PRECISE)构建
- matchType: PRECISE
branch: master
commitMessage: '' # 通过匹配当前提交的 CommitMessage 决定是否执行流水线
stages: # 构建阶段配置
- stage: # 定义一个 ID 标识为 deploy-stage ,名为「 Deploy Stage 」的阶段
name: deploy-stage
displayName: 'Deploy Stage'
failFast: false # 允许快速失败,即当 Stage 中有任务失败时,直接结束整个 Stage
steps: # 构建步骤配置
- step: npmbuild@1 # 采用 npm 编译环境
name: deploy-step # 定义一个 ID 标识为 deploy-step ,名为「 Deploy Step 」的阶段
displayName: 'Deploy Step'
inputs: # 构建输入参数设定
nodeVersion: 14.15 # 指定 node 环境版本为 14.15
goals: | # 安装依赖,配置相关主题、部署参数并发布部署
node -v
npm -v
npm install -g @serverless-devs/s
s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default
cd src && npm install
s cli fc-api updateFunction --region cn-hangzhou --serviceName koademo --functionName http-trigger-function --code '{"zipFile":"./"}'
s cli fc-api publishVersion --region cn-hangzhou --serviceName koademo

其实核心部分只有5句话:

npm install -g @serverless-devs/s
s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default
cd src && npm install
s cli fc-api updateFunction --region cn-hangzhou --serviceName koademo --functionName http-trigger-function --code '{"zipFile":"./"}'
s cli fc-api publishVersion --region cn-hangzhou --serviceName koademo
  1. npm install -g @serverless-devs/s: 安装Serverless Devs工具
  2. s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default: 根据刚才配置的环境变量,取环境变量内容配置密钥
  3. cd src && npm install: 进入src目录,并安装依赖
  4. s cli fc-api updateFunction --region cn-hangzhou --serviceName koademo --functionName http-trigger-function --code '{"zipFile":"./src/"}' : 更新函数代码
  5. s cli fc-api publishVersion --region cn-hangzhou --serviceName koademo : 发布函数版本

更新代码#

此时,我们可以对Index.js内容进行更改:

image

然后保存,稍等片刻,可以在流水线中看到这个发布流程:

image

此时,我们可以点到流程中查看详情:

image

稍等片刻,可以看到CD流程完成:

image

完成之后,我们可以点击查看线上的代码:

image

总结#

基于Serverless架构进行项目开发,与CI/CD的集成,搞定自动化发布等是必不可少的“课程”,希望通过本文,读者可以对相关的流程有进一步的思路,可以应用到自己的项目中。

只更新代码,然后发布版本:基于Serverless Devs原子化操作阿里云函数计算

Anycodes

Anycodes

Serverless Devs

众所周知,随着时间的发展,Serverless命令行工具也逐渐的玩出了更多的花样,就目前来看,常见的形态有两种,一种是通过Yaml来进行资源的描述,另外一种是纯粹的命令行操作,而不依赖这些内容。

第一种通过Yaml来进行资源描述,其好处不言而喻,目前主流的Serverless开发者工具均是类似的模式,例如阿里云的Funcraft,著名的开源项目Serverless Framework等,通过Yaml,使用者可以通过简单的命令,进行复杂的操作,例如开发者在Yaml中描述好服务、函数等配置,描述好代码位置,只需要deploy就可以将本地项目部署到线上,非常方便。但是这里有一个非常明显的劣势,在很多时候我们的企业管理者,给每个人分配的权限是固定的,例如运维人员只能更新某些内容,开发人员只能更新某些代码,某些负责可以发布版本等,那么这个时候"一把梭"的行为就显得非常尴尬,想为开发者做更多,但是有些开发者不需要你做更多,那么"高阶能力"和"原子能力"的平衡就显得至关重要的。

第二种模式,虽然是不需要依赖Yaml,在很多时候使用起来可能会稍微复杂一些,例如我们创建一个函数可能涉及到很多流程:创建服务,创建函数,创建触发器...,相对比上面所说的一条指令而言,确实复杂很多,但是这种无Yaml的模式,更适合做原子操作,可以最大程度解决上述问题,同时这种做法也可以在一定程度上进行更多的拓展,例如某些本不需要依赖Yaml的行为:查询服务列表,查询函数列表......

所以这两种模式各有优缺点,我们在使用的时候完全可以组合来使用,达到最大的一个生产效能。那么一个新问题来了,以阿里云函数计算为例,如何同时拥有这两种模式的使用方法呢?

其实Serverless Devs天然支持Yaml描述和非Yaml描述的能力,例如阿里云函数计算的FC组件就是一个可以依靠Yaml描述进行资源操作的组件,而FC-API组件则是API相关的原子性操作。

本文将会以这样一个案例/场景为例,为读者介绍这两者的使用方法:

  1. 通过Serverless Devs快速创建一个服务/函数/触发器
  2. 通过无Yaml的模式对其中的代码部分进行单独的更新
  3. 更新之后发布一个版本
  4. 通过Git+Github Action实现一个代码自动化发布和版本自动化发布的能力

快速创建函数#

我们只需要通过s init并且选择阿里云函数计算的Python3 Http函数即可:

image

创建完成之后,我们只需要进入到对应的文件夹,并且执行s deploy,即可将项目快速部署到线上。在进入到项目后,我们可以在项目下看到一个s.yaml的文件,这个文件就是资源描述文件:

image

其完整的描述:https://github.com/devsapp/fc/blob/main/docs/Others/yaml.md

此时我们可以通过s deploy进行项目的部署:

image

部署完成,我们可以打开系统分配给我们的域名,我们可以看到内容:

image

通过无Yaml模式更新函数#

此时,我们可以编辑index.py,将Hello world!变为Hello world Serverless Devs!

image

然后我们就要接触一个新的组件FC-API:https://github.com/devsapp/fc-api

我们可以执行帮助文档:s cli fc-api -h

image

此时我们需要明确的是,当我们执行s cli的时候,系统就不去读Yaml,而直接进行相关方法的调用。

如果我们对这个方法还是不清楚,我们可以:s cli fc-api updateFunction -h

image

此时我们只需要按照规范,填写好地区,服务名,函数名,以及要更新的字段即可:

s cli fc-api updateFunction --region cn-hangzhou --serviceName fc-deploy-service --functionName http-trigger-function --code '{"zipFile": "./"}'

完成之后,我们可以再去看一下之前的页面是否同步更新了:

image

此处可能有疑问,你的帮助文档写的是:--code string [JSON String] The code of the function. The code must be packaged into a ZIP file. 你是怎么知道传递--code '{"zipFile": "./"}'的?

因为在我们看帮助文档的时候,题已经提醒了我们这是一个JSON String,同时在帮助文档最上面是有链接地址:

Usage
s cli fc-api updateFunction
API Document: https://help.aliyun.com/document_detail/189986.html
Options
--region string The region of fc endpoint.
--access string Specify the key name.
--props string The json string of props.
--serviceName string The name of the service.
--functionName string The description of the function.
--code string [JSON String] The code of the function. The code must be packaged into a ZIP file.

此时,我们可以打开https://help.aliyun.com/document_detail/189986.html:

image

image

此时为了方便,Serverless devs支持本地路径,会帮助你进行打包等操作。

当然,我们还可以更刺激一些,修改其他内容,例如单纯修改一些timeout:

s cli fc-api updateFunction --region cn-hangzhou --serviceName fc-deploy-service --functionName http-trigger-function --timeout 70

image

通过无Yaml模式发布版本#

和上面一样,我们可以用s cli fc-api -h 查看一下版本发布的方法:s cli fc-api publishVersion -h

image

尝试拼接参数:

s cli fc-api publishVersion --region cn-hangzhou --serviceName fc-deploy-service --description "This is a test version"

得到结果:

image

CI/CD组件的使用#

当我们想要把上面只更新代码,发布版本的能力集成到CI/CD,或者某些自动化流程中,如何操作呢?

以Github Action为例,我们可以直接执行s cli cicd:

image

接下来,我们对./.github/workflow/serverless-devs.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
# 默认密钥配置指令是阿里云密钥配置指令,更多可以参考:
# 如何通过Github Action使用Serverless Devs做CI/CD:http://short.devsapp.cn/cicd/github/action/usage
# Serverless Devs的官网是通过Serverless Devs部署的: http://short.devsapp.cn/cicd/github/action/practice
- run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
- run: s cli fc-api updateFunction --region cn-hangzhou --serviceName fc-deploy-service --functionName http-trigger-function --code '{"zipFile":"./"}'
- run: s cli fc-api publishVersion --region cn-hangzhou --serviceName fc-deploy-service

其实,我们只是在最后加了两个人run,一个是发布代码,一个是发布版本,此时我们可以创建一个Github仓库,尝试一下:

image

创建完成之后,我们可以按照案例提醒,进行密钥的配置:

# 默认密钥配置指令是阿里云密钥配置指令,更多可以参考:
# 如何通过Github Action使用Serverless Devs做CI/CD:http://short.devsapp.cn/cicd/github/action/usage
# Serverless Devs的官网是通过Serverless Devs部署的: http://short.devsapp.cn/cicd/github/action/practice

image

image

接下来, 我们通过git init等一系列指令,完成代码推到仓库:

image

此时,我们再次修改代码:

image

修改完成之后,我们将代码push到测试仓库,可以看到,我们在Action中可以看到一个workflow在执行::

image

稍等片刻,当这个流程完成:

image

我们打开之前的页面,可以看到,网页内容已经顺利被更新:

image

总结#

本文以阿里云为例,通过在Github上使用Servelress devs单纯对代码进行更新,并进行版本发布,该流程是比较常见的,也是比较通用的,希望读者可以发挥想象力,将这个流程应用到自己的项目中。