亲测报告|腾讯云发布了一款云原生研发管理工具
6月28日,腾讯在线上举行了 TechoDay 技术开放日,这次活动主题是“化繁为简,轻而易用”,主要发布一些轻量级的云开发与云应用。在这次最重磅的7款发布产品中,我比较感兴趣的是 Orbit 平台,这是一款云原生全生命周期管理工具。活动上,嘉宾介绍这个产品比起“传统集成、持续部署”有极其高效的先进性。
真金不怕火炼,说得这么好,我决定上手试试……
创建项目
进入 CODING DevOps 主页面,首先创建一个项目。

平台提供了两种模板可供选择:
全功能 DevOps 项目:开启一个全功能的 CODING 项目,包含代码托管、项目协同、持续集成、制品管理、持续部署、测试管理、知识管理在内的全部能力,促进研发团队的 DevOps 成熟度提升。 按需选择:可以按团队当前实际所需开启所需功能。

模板选择后填写项目基本信息:

项目创建完成后接下来就需要创建一个代码仓库了,前往代码仓库
页面点击创建代码仓库
进行新建:

同样我们也可以根据模板来创建代码仓库,还有分支模型可供选择,比如我们这里是一个简单的 Go 项目,代码非常简单。

代码仓库创建完成后将代码提交上去。

接下来我们要做的就是通过 DevOps 的方式将该项目部署到 Kubernetes 中去。
代码扫描
可以在创建代码仓库的时候开启代码扫描
功能,当创建合并请求或推送代码的时候都会触发代码扫描功能,如果没有默认开启,我们可以前往代码扫描
-> 扫描任务
页面创建一个新的任务。

创建扫描任务的时候需要去关联对应的代码仓库和分支,然后可以通过系统提供的扫描模板进行扫描,比如我们这里可以选择 Go 推荐扫描方案模板
,然后直接启动扫描任务
即可。

然后就会针对当前项目代码进行扫描了,同样也可以配置代码扫描方案,我们可以根据自己的需求配置合适的规则。
制品库
我们这是一个 Golang 项目,可以将项目构建的二进制文件上传到制品库中去,我们这里要将项目部署到 Kubernetes 集群中去,自然是打包成 Docker 镜像是最合适的,在制品管理
下面新建一个 Docker
类型的仓库。

如果你有其他制品需求也可以去创建对应的仓库,比如 Maven、NPM、Helm Chart 等等。
CI流水线
接下来需要将我们的项目进行构建打包成 Docker 镜像,推送到 Docker 仓库中去,然后部署到 Kubernetes 集群中去,这是一个非常简单的流水线。
首先来看下 CI 流水线如何实现,如果你使用的传统构建工具,比如 Jenkins、GitLab CI 等等,都需要我们去编写大量的流水线脚本,而 CODING DevOps 为我们内置了大量的模板,以及功能非常强大的可视化编辑功能,可以大大提高流水线的编写效率。
前往持续集成
-> 构建计划
页面,创建一个新的构建计划,构建计划是持续集成的基本单元,在这里你可以快速创建一个构建计划。

CODING DevOps 为我们内置了大量通用的计划模板,比如我们这里选择 GoLang + Gin + Docker
的这个计划模板。

在这个模板中可以直接关联对应的代码仓库,安装依赖、单元测试这些步骤也是可选的,核心的构建 Docker 镜像步骤中,我们可以指定镜像名称、Dockerfile 文件位置、构建目录以及镜像版本等等,最后关联上一个 Docker 制品库,这样当镜像构建完成后就可以推送到这个仓库中去了,这其实就是一个完全兼容的 Jenkinsfile
文件,对应的代码如下所示:
pipeline {
agent any
environment {
CODING_DOCKER_REG_HOST = "${CCI_CURRENT_TEAM}-docker.pkg.${CCI_CURRENT_DOMAIN}"
CODING_DOCKER_IMAGE_NAME = "${PROJECT_NAME.toLowerCase()}/${DOCKER_REPO_NAME}/${DOCKER_IMAGE_NAME}"
}
stages {
stage("检出") {
steps {
checkout(
[$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]]
)
}
}
stage('安装依赖') {
steps {
sh "go get -u github.com/jstemmer/go-junit-report"
}
}
stage('单元测试') {
steps {
sh "go test -v | go-junit-report > result.xml"
}
post {
always {
// 收集测试报告
junit '*.xml'
}
}
}
stage('编译') {
steps {
sh "go build -o golang-web-app ."
}
}
stage('构建镜像并推送到 CODING Docker 制品库') {
steps {
sh "docker build -t ${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION} -f ${DOCKERFILE_PATH} ${DOCKER_BUILD_CONTEXT}"
useCustomStepPlugin(
key: 'SYSTEM:artifact_docker_push',
version: 'latest',
params: [
image:"${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}",
repo:"${DOCKER_REPO_NAME}"
]
)
}
}
}
}
构建计划创建后就会开始按照上面的步骤进行构建了,整个构建过程都可以通过一个可视化的界面进行查看。

点击每一个步骤均可查看对应的日志信息。

我们这里还添加了一个测试的阶段,同样也可以看到对应的 Junit 测试报告
。

此外我们还可以对该构建计划进行重新配置,可以指定 Jenkinsfile
的来源,默认情况下会使用 CODING 提供的云主机进行构建,但是每个团队会有免费的配额,如果额度不够你还可以选择使用自定义的构建节点进行构建。

核心的流程配置
页面中允许我们通过图形化编辑器和文本编辑器两种方式来修改 Jenkinsfile
。

比如我们这里可以新增一个部署到Kubernetes集群的阶段,执行在编辑器中点击+增加阶段
即可,然后点击阶段中的+
按钮可以来选择要在该阶段添加的功能。

CD流水线
除了在构建流水线里面去执行部署之外,我们也可以在持续部署
-> Kubernetes
页面进行部署。

CODING 基于持续交付基金会旗下开源软件 Spinnaker 提供了完整的,与 DevOps 体系紧密结合的持续部署能力,仅需简单几步,即可快速实现基于 Kubernetes 的持续部署,比如我们选择体验快速发布。
当然首先需要一个 Kubernetes 集群,比如我这里去关联我的 TKE 集群。

Kubernetes 集群关联后在快速发布配置中我们选择使用现有集群。

然后选择需要部署的镜像即可。

然后配置应用部署的元信息,比如应用名称,是否通过 Service 暴露服务,端口映射等信息。

发布后可以查看发布的详细信息。

在集群中可以看到资源的详细信息。

比如我们这里可以通过 120.53.207.92:8080
端口就可以访问到我们的应用了。

到这里就证明我们的应用部署成功了,在 TKE 集群中也可以看到我们部署的应用了。

到这里我们就完成了使用 CODING DevOps 来实现一站式的 DevOps 应用了,相比起传统的工具,CODING DevOps 提供了以更加方便便捷的方式,化繁为简,不需要我们具有太深奥的知识点也能玩转。
Orbit
基于 CODING 团队帮助客户进行应用云原生化的实际经验,CODING 持续部署产品全新升级,推出一站式云原生应用生命周期管理工具——应用中心(Orbit),为企业提供降低应用云原生化门槛、提高应用交付效率和可靠性、高效自助式运维三重价值。

接入集群
基础设施是集群与数据库的调度中心,为应用的最终发布上线提前做准备。点击团队首页左下角的「基础设施」
进入管理页。

点击添加集群获取安装 CD 客户端的命令,在 Kubernetes 集群下运行该命令,安装 CD 客户端后完成集群接入。将集群纳入基础设施后,能够与各项运维工具进行数据联动与上报,在弱网络环境及私有云场景下对集群纳管的支持更加友好。

安装后会创建一个名为 coding-cd
的命名空间,其中包含几个 Pod:
$ kubectl get pods -n coding-cd
NAMESPACE NAME READY STATUS RESTARTS AGE
coding-cd customer-dashboard-manager-656fd8f56-m2cks 1/1 Running 0 92s
coding-cd dashboard-controller-6648dc75f7-tmhsf 1/1 Running 0 2m27s
coding-cd deploy-controller-manager-56bb5ddc69-d5cjf 2/2 Running 0 2m27s
coding-cd diff-controller-manager-5d5d54dd9c-96pwx 2/2 Running 0 2m27s
coding-cd gitops-connector-68bb978cb7-hljfx 1/1 Running 0 2m27s
coding-cd source-controller-manager-75cf797dcf-dglnc 2/2 Running 0 2m27s
部署仓库
使用 Orbit 来做应用部署,我们这里采用代码和部署仓库分离的方式,使用 Helm Chart 方式来进行部署,单独创建一个用于存放 Helm Chart 包的仓库 cd-golang-gin-example
。

创建应用
进入应用中心后,点击右上角的「创建应用」
按钮,在基本信息中填写仓库的所在项目与地址就可以创建一个应用了。

创建应用后,需要将已接入的集群指定为应用的运行环境,基于集群的使用目的不同,例如用作生产/测试环境,可以在环境 Values 处进行切换。

环境创建完成后,应用中心将自动读取集群信息。除此之外,应用中心还具备集群监控与日志查看能力。
部署流程
部署流程中的阶段决定了应用在发布过程时历经的各项环节。这些阶段包含了应用部署、预置条件检查、人工确认等。建议为每个部署流程添加人工确认阶段,用以二次确认部署的有效性。

这里我们来使用人工确认 + 应用部署阶段组成此次应用发布的部署流程,进入部署流程
页面创建一个新的部署流程。

发布版本
版本管理机制能够自动将应用的镜像、配置、数据库变更集中展示于版本的创建页面。你可以根据项目协同中的迭代内容,选择应用变更范围并进行版本创建。同时版本还支持关联事项、需求、缺陷,便于用户追溯应用变更的业务侧需求来源。

创建版本后,可以点击发布按钮进行版本发布。

然后填写发布单与选择部署流程即可完成发布。

然后就会根据我们上面创建的部署流程去部署应用,首先会有一个人工确认,确认后就会进行部署了。

部署完成后可以查看当前环境的整体状况,可以查看到已部署的服务。

此外还可以对接集群的 Prometheus 来进行监控报警,以及日志数据等等。
测试环境部署后的资源对象如下所示:
$ kubectl get all -n orbit-testing
NAME READY STATUS RESTARTS AGE
pod/gin-demo-95746586-k6ttj 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/gin-demo NodePort 10.96.35.118 <none> 80:31901/TCP 10m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/gin-demo 1/1 1 1 10m
NAME DESIRED CURRENT READY AGE
replicaset.apps/gin-demo-95746586 1 1 1 10m
现在我们可以去验证应用是否正确了。

完整的应用状况如下所示。

除了我们这里为大家演示的 Orbit 的基本功能之外,还有很多更加高级的用法,比如可以实现金丝雀部署、还有许多运维插件等。

总结
整体流程如下图所示。

我们这里用两种方式来实现应用的发布流程,很明显 Orbit 这种方式比传统的应用发布优势更加明显,通过自动化能力和应用管理的能力,开发人员可以自行做到应用的发布、运维、观测,大大降低了开发与运维间的沟通成本,让发布真正做到高效、有序。
本次 TechoDay 腾讯技术开放日主要是从技术原理解析来讲述轻量化的实现路径跟价值,这里面包括很多平日开发经常用到的课题,除了 DevOps,也有微服务开发或 Serverless 相关的内容。会后,腾讯还将这些内容整理成《腾讯云轻量级工具指南》,对云原生趋势感兴趣的朋友不容错过,点击阅读全文可以获取。