写点什么

Serverless Devs 与 CI/CD 平台 / 工具集成

作者:刘宇
  • 2021 年 12 月 15 日
  • 本文字数:3835 字

    阅读完需:约 13 分钟

Serverless Devs 与 CI/CD 平台/工具集成

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


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


如果想要通过 CI/CD 平台或者工具,科学且方便的进行 Serverless 应用的持续集成与交付部署,那么通常情况下是需要借助相对应的开发者工具,例如著名的开源项目 Serverless Framework,Serverless Devs 等。整体的流程通常是:


与 Github Action 的集成

在 Github Action 的 Yaml 文件中,可以增加 Serverless Devs 的相关下载、配置以及命令执行相关能力。


例如,在仓库中可以创建该文件.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
复制代码


主要包括几个部分的内容:

  • run: npm install -g @serverless-devs/s:

  • 通过 NPM 安装最新版本的 Serverless Devs 开发者工具;

  • run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default

  • 通过config命令进行密钥等信息的配置;

  • run: s deploy

  • 执行某些命令,例如通过deploy进行项目的部署,或者build等命令进行构建等;

  1. 将密钥信息配置到 Github Secrets 中



  1. 我们创建多对密钥信息:



例如,我此处配置了三对密钥:


与 Gitee Go 的集成

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


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


name: serverless-devsdisplayName: 'Serverless Devs Project CI/CD'triggers:                                  # 流水线触发器配置  push:                                    # 设置 master 分支 在产生代码 push 时精确触发(PRECISE)构建    - matchType: PRECISE      branch: mastercommitMessage: ''                          # 通过匹配当前提交的 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 s deploy
复制代码


主要包括几个部分的内容:

  • npm install -g @serverless-devs/s:

  • 通过 NPM 安装最新版本的 Serverless Devs 开发者工具;

  • s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default

  • 通过config命令进行密钥等信息的配置;

  • s deploy

  • 执行某些命令,例如通过deploy进行项目的部署,或者build等命令进行构建等;


关于密钥的配置:密钥信息的获取是通过$*进行获取的,所以此时,需要将所需要的密钥和对应的Key配置到 Gitee 的环境变量管理即可,例如在上面的案例中,需要ACCOUNTID,ACCESSKEYID,ACCESSKEYSECRET等三个密钥的 Key ,我们就可以配置相关的内容:


  1. 找到 Gitee 的环境变量管理



  1. 我们创建多对密钥信息:



例如,我此处配置了三对密钥:


与 Jenkins 的集成

在准备将 Serverless Devs 集成到 Jenkins 之前,需要先基于 Jenkins 官网 安装并运行 Jenkins。


本地启动 Jenkins 后,通过浏览器进入链接 http://localhost:8080 配置完成基础设置后,需要新增 Credentials 设置,如下图所示:



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


jenkins-alicloud-account-id : 阿里云 accountId
jenkins-alicloud-access-key-id : 阿里云 accessKeyId
jenkins-alicloud-access-key-secret : 阿里云 accessKeySecret
复制代码


新增 Credentials 的教程可以参考这里


此时,可以对自身的 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'              }          }      }  }
复制代码


主要的内容包括两个部分:


  • 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
复制代码


在该文件中,主要包括了几个部分:


  • curl -o- -L http://cli.so/install.sh | bash

  • 下载并安装 Serverless Devs 开发者工具

  • s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_KEY_ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS

  • 配置密钥信息等内容

  • s deploy -y --use-local --access $ALICLOUD_ACCESS

  • 执行某些命令,例如通过deploy进行项目的部署,或者build等命令进行构建等;


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

与云效的集成

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


# input your command herenpm install -g @serverless-devs/ss config add --AccountID ${ACCOUNTID} --AccessKeyID ${ACCESSKEYID} --AccessKeySecret ${ACCESSKEYSECRET} -a defaults deploy
复制代码


这里主要包括三个部分:


  • npm install -g @serverless-devs/s:

  • 通过 NPM 安装最新版本的 Serverless Devs 开发者工具(虽然云效中已经拥有了相关版本的 Serverless Devs,但是实际上,这个版本可能比较老旧,所以可以通过该命令安装最新版本);

  • s config add --AccountID ${ACCOUNTID} --AccessKeyID ${ACCESSKEYID} --AccessKeySecret ${ACCESSKEYSECRET} -a default

  • 通过config命令进行密钥等信息的配置;

  • s deploy

  • 执行某些命令,例如通过deploy进行项目的部署,或者build等命令进行构建等;


效果如下:



由于在命令中,引用了三个重要的环境变量:ACCOUNTID, ACCESSKEYID, ACCESSKEYSECRET,所以还需要在环境变量中,增加类似的内容:



用户头像

刘宇

关注

阿里云Serverless云布道师 2020.01.04 加入

阿里云Serverless产品经理,国防科大在读博士,《Serverless架构》、《Serverless实践》、《人人都能学会的Serverless架构》等书籍作者,Serverless Devs发起人,Anycodes在线编程负责人。

评论

发布
暂无评论
Serverless Devs 与 CI/CD 平台/工具集成