云函数场景下的DevOps实践--CODING企业版

云函数提供Serverless本地开发工具,支持本地调试、代码打包、函数发布等功能。CODING 企业版是专为企业打造的软件开发协作平台,提供敏捷开发、代码托管、持续集成等服务。当前CODING企业版平台默认支持代码仓库托管、CI/CD自动化pipline。

本文将介绍如何基于CODING的代码托管、CI /CD pipline功能,结合Serverless本地开发工具的功能,提供云函数的DevOps 能力,完成DevOps 检出、构建、测试、部署等持续集成的自动化流程。

代码托管

>>>>

初始化本地函数

云函数scf init 命令可以进行项目初始化操作。基于Git仓库模板项目可以快速创建出一个简单的模板项目,进行进一步的开发。

>>>>

本地调试和本地调用

云函数通过 native invoke 子命令完成本地触发运行。当前支持nodejs和python语言开发的云函数在本地进行调试和调用。

>>>>

将本地生成的函数推送到CODING代码仓库

CODING企业版提供用户代码托管的平台支持Git代码仓库,其控制台支持代码浏览、分支管理、发布和标签管理等功能。

  • 创建项目以及代码仓库

CODING中一个项目对应一个 Git代码仓库,创建 Git 仓库前需要先创建项目,项目地址即是Git 仓库的地址。项目地址分为 HTTPS 和 SSH 两种方式。创建项目时可以指定代码模板来创建。

  • 管理项目代码仓库

CODING创建的Git仓库项目可以在本地使用Git工具做相关分支、标签等管理。可以在CODING控制台做版本对比和合并的相关操作。

  • 提交初始化项目到CODING对应的代码仓

使用scf cli init命令行初始化的项目,包括项目的模板配置文件template.yaml,以及初始化的云函数的代码,这里只需将云函数的代码推送到CODING创建的仓库中,提交代码之前,需要将项目的模板配置文件template.yaml复制到函数中。

Serverless本地开发工具的本地调试、打包部署等命令依赖模板配置文件template.yaml。将该配置文件放在函数目录内上传到CODING的代码仓库,即可在持续集成的线上环境使用Serverless本地开发工具。

配置代码仓库CI/CD pipline

CODING 持续集成基于Jenkins 提供服务和能力,并做了大量优化工作。配置持续集成所用的脚本为Jenkinsfile。Jenkinsfile 定义了持续集成中的工作流水线(pipeline),实现对步骤的流式化封装和管理。流水线可以顺序执行,也可以并行执行,利用该pipeline可以自动化完成该项目的DevOps持续集成、持续部署的流程。

每一次的目标代码变动,都会触发CODING 持续集成按照 Jenkinsfile 里的流水线自动化执行一次。

>>>>

创建持续集成的任务

在持续集成菜单配置持续集成的触发机制,默认配置代码更新时自动执行。也可以配置推送新标签,推送新分支等触发机制。

>>>>

创建持续集成的pipline

  • 定义持续集成的流程

在CODING控制台配置持续集成的详细过程,也是在编排流水线(pipeline)。默认使用的时的是“图形化编辑器”,提供了可视化、易上手的编排工具。左边展示的是流水线,按照简易模板分成了“开始”、“检出”、“构建”、“测试”以及“部署”共 5 个阶段。流水线上每一个阶段具体的执行命令都可以自定义,选中某个阶段,可以对选中的阶段进行更详细的步骤配置。本实践自定义jenkins file的方式定义持续集成的流程。

  • 定义持续集成的pipline

定义持续集成的Jenkins pipline,依赖Serverless本地开发工具提供的本地代码运行、打包以及发布的能力。使用Serverless本地开发工具需要用户提供腾讯云认证的相关信息,将认证的相关信息通过pipline环境变量的方式提供。

  • Jenkins pipline配置文件

该自定义Jenkins pipline配置文件定义了检出、构建(安装依赖)、测试、部署这些DevOps持续集成流程,最终部署流程将代码压缩包部署到腾讯云函数服务。

1、检出

Checkout该Git仓库项目的代码。这里用户也可以自定义添加代码检查或者安全检查等流程。

2、构建

这里主要针对云函数场景,对nodejs或者python项目安装对应项目的安装依赖。其中,Nodejs项目可以使用npm安装包依赖;Python项目可以使用pip安装相关依赖包。针对go语言等编译性的语言,这里还可以完成编译等工作。

3、测试

项目中可以运行各个项目自己开发的单元测试或者集成测试任务。本实践主要针对云函数本地测试调用函数。

4、部署

云函数完成开发以及持续集成之后,需要将函数代码压缩包部署到云函数服务才能运行。本实践主要是使用 Serverless本地开发工具deploy命令将函数创建到云函数服务。后续Serverless本地开发工具添加了云函数版本发布的命令,这里可以集成云函数新版本的发布。

配置文件:

代码语言:javascript
复制
1.  pipeline {  
2.    agent any  
3.    stages {  
4.      stage('检出') {  
5.        steps {  
6.          sh 'ci-init'  
7.          checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])  
8.        }  
9.      }  
10.    stage('构建') {  
11.      agent {  
12.        docker {  
13.          image 'nikolaik/python-nodejs:latest'  
14.          args '-v /root:/root'  
15.        }  
16.  
17.      }  
18.      steps {  
19.        echo '安装依赖'  
20.        dir(path: '/root/workspace') {  
21.          sh 'npm install'  
22.        }  
23.  
24.      }  
25.    }  
26.    stage('测试') {  
27.      agent {  
28.        docker {  
29.          image 'nikolaik/python-nodejs:latest'  
30.          args '-v /root:/root'  
31.        }  
32.  
33.      }  
34.      steps {  
35.        sh 'pip install scf'  
36.        sh 'scf --version'  
37.        dir(path: '/root/workspace') {  
38.          sh "scf configure set --region=${env.region} --appid=${env.appid} --secret-id ${env.secretid} --secret-key ${env.secretkey}"  
39.          sh 'scf native invoke --no-event'  
40.        }  
41.  
42.      }  
43.    }  
44.    stage('部署') {  
45.      agent {  
46.        docker {  
47.          image 'nikolaik/python-nodejs:latest'  
48.          args '-v /root:/root'  
49.        }  
50.  
51.      }  
52.      steps {  
53.        sh 'pip install scf'  
54.        sh 'scf --version'  
55.        dir(path: '/root/workspace') {  
56.          sh "scf configure set --region=${env.region} --appid=${env.appid} --secret-id ${env.secretid} --secret-key ${env.secretkey}"  
57.          sh 'scf package --template-file ./template.yaml'  
58.          sh 'scf deploy -f --template-file ./deploy.yaml'  
59.        }  
60.  
61.      }  
62.    }  
63.  }  
64.}
  • 持续集成运行状态
1、检出:显示了该项目代码检出的结果。
2、构建:本项目是Nodejs项目,此任务主要是使用npm工具安装项目依赖,本次构建安装依赖成功。
3、测试:项目测试是通过Serverless本地开发工具调用函数来测试函数是否能够成功的运行。
4、部署:本次构建部署是调用Serverless本地开发工具的deploy命令将函数部署到云函数中,后续部署可以考虑集成函数版本发布的能力。

总结

当前实践利用了CODING平台默认支持代码仓库托管、CI/CD自动化pipline的功能来实现云函数的DevOps流程。后续可以考虑结合CODING企业版制品库,构建函数压缩包到制品库,利用制品库的版本管理能力发布到云函数对应的版本。

文章参考

云函数:https://cloud.tencent.com/product/scf

CODING企业版:https://coding.net/

Serverless本地开发工具:

https://cloud.tencent.com/document/product/583/33447

Jenkins 语法:

https://jenkins.io/zh/doc/book/pipeline/syntax/