2.4.4 Serverless架构与CI/CD工具的结合
CI/CD是一种通过在应用开发阶段引入自动化流程以频繁向客户交付应用的方法。如图2-54所示,CI/CD的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD主要针对集成新代码时所引发的问题。具体而言,CI/CD可以让持续自动化和持续监控贯穿于应用的整个生命周期(从集成、测试阶段到交付和部署阶段)。这些关联的事务通常被统称为“CI/CD管道”,由开发和运维团队以敏捷方式协同支持。
图2-54 CI/CD的概念与内容简图
在Serverless架构下,通常会有很多函数构成一个完整的功能或服务,这种比较细粒度的功能往往会给后期项目维护带来极大的不便,包括但不限于函数管理、项目的构建、发布层面等的不便。此时在Serverless架构中,CI/CD就显得尤为重要。更加科学、安全的持续集成和部署过程不仅会让整体的业务流程更加规范,也会在一定程度上降低人为操作、手工集成部署所产生错误的概率,同时也会大规模减轻运维人员的工作负担。
如果想要通过CI/CD平台,科学且方便地进行Serverless应用的持续集成、交付和部署,通常情况下我们需要借助相应的开发者工具,例如Serverless Framework、Serverless Devs等。Serverless开发者工具配置到CI/CD平台的流程可以简化为图2-55。
图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.AccessKey-Secret}} -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页面,如图2-56所示。
图2-56 GitHub Secrets页面
创建和配置密钥信息,如图2-57所示。
图2-57 创建和配置密钥信息页面
此处配置了3对密钥,如图2-58所示。
图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 config add --AccountID $ACCOUNTID --AccessKeyID $ACCESS-KEYID --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的环境变量管理页面,如图2-59所示。
图2-59 Gitee的环境变量管理页面
创建和配置密钥信息,如图2-60所示。
图2-60 创建和配置密钥信息页面
此处配置了3对密钥,如图2-61所示。
图2-61 Gitee仓库完成密钥配置页面
3.与Jenkins的集成
在将Serverless Devs集成到Jenkins之前,需要先基于Jenkins官网安装并运行Jenkins。
本地启动Jenkins,通过浏览器进入链接http://localhost:8080并配置完成基础设置,之后新增凭据设置,如图2-62所示。
可以根据需要,增加密钥信息。以阿里云为例,新增3个全局凭据:
jenkins-alicloud-account-id : 阿里云accountId jenkins-alicloud-access-key-id : 阿里云accessKeyId jenkins-alicloud-access-key-secret : 阿里云accessKeySecret
图2-62 Jenkins凭据设置页面
此时,可以对自身的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 ${ACCESSKEYSECRET} -a default
·执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
s deploy -y
效果如图2-63所示。
图2-63 云效命令配置页面
由于在命令中引用了3个重要的环境变量:ACCOUNTID、ACCESSKEYID、ACCESSKEY-SECRET,因此还需要在环境变量中增加图2-64所示的类似内容。
图2-64 环境变量配置页面
5. CI/CD平台集成总结
通过上面几个案例不难发现,在做自动化发布时,最核心的3个流程如下。
·下载工具:命令为npm install-g @Serverless-devs/s。
·配置密钥:命令为s config add--AccountID $ACCOUNTID--AccessKeyID $ACCESSK-EYID--AccessKeySecret $ACCESSKEYSECRET-a default。
·项目部署:命令为s deploy。
虽然只是以GitHub Action、Gitee Go、Jenkins、云效几个工具作为案例,实际上无论哪个工具与CI/CD平台集成,上述3个核心流程都不会发生本质变化。另外,上面所列举的流程更多是在做自动化发布,在发布之前有时还需要进行一些测试和重新构建,以便根据具体的实际需要进行适当的完善。
综上所述,如果想非常简单、快速、科学地完成Serverless应用的CI/CD建设,一个完善的开发者工具是必不可少的。Serverless Devs是一款多云开发者工具。我们可以通过该工具非常简单、快速、方便地部署AWS、阿里云、腾讯云等多个云厂商的函数计算等相关服务。同时,Serverless Devs也是一个开源项目,便于用户随时随地贡献组件、应用。