快捷搜索:  汽车  科技

devops10大开源工具(DevOps工具链管理器DevStream)

devops10大开源工具(DevOps工具链管理器DevStream)默认情况下,dtm(DevStream 的命令行工具)会尝试使用 ./config.YAML 作为主配置文件。主配置文件主要包含 3 个部分:主配置文件DevOps 中通用的一些概念,比如 Git、Docker、Kubernetes、Continuous Integratoin、Continuous Delivery 和 GitOps,这些也是 DevStream 的核心概念。DevStream 中涉及到几个自己的概念:Config(配置)、Tool(工具)、State(状态)、Resource(资源),这几个概念构成了 DevStream 的整个工作流,下面我们来具体了解下这几个概念。DevStream 通过配置文件来定义你的 DevOps 工具链,一共包括 3 个配置文件:

DevStream 是一个开源的 DevOps 工具链管理器,将主流 DevOps 全生命周期的开源工具管理起来,提供了包括安装部署、最佳实践配置等功能,因开发者而生,由开发者开发,为开发者服务。

devops10大开源工具(DevOps工具链管理器DevStream)(1)

想象你正在开始一个新的项目或组建一个新的团队。在写第一行代码之前,你需要一个能够高效运转 SDLC(软件开发生命周期)和承载开发至部署全过程的工具。

通常情况下,你需要以下几个部分来高效地工作。

  • 项目管理软件或 issue 追溯工具(JIRA 等)
  • 源代码管理(github、Bitbucket 等)
  • 持续集成(jenkins、CircleCI、Travis CI 等)
  • 持续交付/部署(Flux CD/Flux2、Argo CD 等)
  • 密钥和证书的单一事实来源(A single source of truth)(密钥管理器,如 HashiCorp 的 Vault)
  • 集成化的日志和监控工具(例如,ELK、Prometheus/Grafana)
  • ......

实际的情况可能远不止这些,要找到合适的组件本身就不容易了,再将这些工具整合起来就更难了,需要花费大量的时间和精力。而 DevStream 就是为简化整合 DevOps 组件而构建的工具,有点类似于 yumapt 这些软件包管理工具,DevStream 就是 DevOps 工具领域的软件包管理器。

核心概念

DevOps 中通用的一些概念,比如 Git、Docker、Kubernetes、Continuous Integratoin、Continuous Delivery 和 GitOps,这些也是 DevStream 的核心概念。

DevStream 中涉及到几个自己的概念:Config(配置)、Tool(工具)、State(状态)、Resource(资源),这几个概念构成了 DevStream 的整个工作流,下面我们来具体了解下这几个概念。

Config(配置)

DevStream 通过配置文件来定义你的 DevOps 工具链,一共包括 3 个配置文件:

  • main config File(主配置文件)
  • variable config file(变量配置文件)
  • tool config file(工具配置文件)

主配置文件

默认情况下,dtm(DevStream 的命令行工具)会尝试使用 ./config.YAML 作为主配置文件。主配置文件主要包含 3 个部分:

  • varFile:var 文件的文件路径
  • toolFile:工具文件的文件路径
  • state:与状态相关的设置

如下所示的 config.yaml 文件就是一个主配置文件:

#config.yaml varFile:variables.yaml toolFile:tools.yaml state: backend:local options: stateFile:devstream.state

变量配置文件

变量配置文件是一个包含键值对的 YAML 文件,可以在工具配置文件中使用。

如下所示的 variables.yaml 文件就是一个变量配置文件:

#variables.yaml githubUsername:cnych repoName:dtm-test-go defaultBranch:main dockerhubUsername:cnych

工具配置文件

工具配置文件包含工具列表。工具文件包含以下内容:

  • 目前只有一个配置块,即 tools
  • tools 是一个字典列表
  • 每个字典都定义了一个由 DevStream 插件管理的 DevOps 工具
  • 每个字典(工具)都有以下必填字段:
    • name:工具/插件的名称,字符串,不带下划线
    • instanceID:该工具实例的 id
    • 一个配置文件中可以有重复的名称,也可以在一个配置文件中有重复的 instanceID,但是name instanceID 的组合在一个配置文件中必须是唯一的
  • 每个工具都有一个可选字段,即 options,它是一个包含该特定插件参数的字典
  • 每个工具都有一个可选字段,即 dependsOn,用来定义相关依赖项

如下所示的 tools.yaml 文件就定义了一个工具配置文件:

#tools.yaml tools: -name:github-repo-scaffolding-golang instanceID:default options: owner:[[githubUsername]] org:"" repo:[[repoName]] branch:[[defaultBranch]] image_repo:[[dockerhubUsername]]/[[repoName]] -name:jira-github-integ instanceID:default dependsOn:["github-repo-scaffolding-golang.default"] options: owner:[[githubUsername]] repo:[[repoName]] jiraBaseUrl:https://xxx.atlassian.net jiraUserEmail:foo@bar.com jiraProjectKey:zzz branch:main

配置文件中的变量可以看到我们是通过 [[ varNameHere ]] 来定义的。DevStream 将使用提供的 var 文件来渲染上面的配置。

state

主配置文件中还包括一个 state 属性,state 部分指定存储 DevStream 状态的位置。到目前的 v0.6.0 版本开始,DevStream 同时支持 locals3 后端存储来保存 DevStream 的状态。

如果使用的是 local 模式,那么 state.options.stateFile 是必须配置的属性。如果使用 s3 这种后端存储模式,则对应的配置如下所示:

varFile:variables.yaml toolFile:tools.yaml state: backend:s3 options: bucket:devstream-remote-state region:ap-southeast-1 key:devstream.state

其中 state.options 属性下的 bucketregionkey 都是 s3 后端的必填字段。在真正使用的时候我们需要通过环境变量来配置 AWS 的相关密钥信息:

exportAWS_ACCESS_KEY_ID=ID_HERE exportAWS_SECRET_ACCESS_KEY=SECRET_HERE exportAWS_DEFAULT_REGION=REGION_HERE

注意:同样我们也可以将多个 YAML 文件放在同一个文件中,并用三个破折号 (---) 分隔不同的文件。

Tool(工具)
  • 每个工具对应着一个插件,可以用来安装、配置或集成一些 DevOps 工具。
  • 每个工具都有其名称、InstanceID 和选项。
  • 每个工具都可以有其依赖项,这些依赖项由 dependsOn 字段指定。

dependsOn 是一个字符串数组,每个元素都是一个依赖。每个依赖项都以 TOOL_NAME.INSTANCE_ID 的格式命名。

State(状态)

State 记录了您的 DevOps 工具链的当前状态,它包含每个工具的配置和当前状态。

  • 状态是一个 Map
  • Map 中的每个状态都是一个包含名称、插件、选项和资源的结构
Resource(资源)

我们将创建的插件称为资源,插件的 Read() 接口将返回对该资源的描述,该描述又存储为状态的一部分。

DevStream 的整个工作流如下图所示:

devops10大开源工具(DevOps工具链管理器DevStream)(2)

  • 首先获取工具状态
  • 如果状态中没找到工具,则调用 Create() 接口创建
  • 如果状态中找到了工具,则从状态中进行配置对比,如果有变化,则调用 Update() 接口进行更新
  • 如果没有变化则调用 Read() 接口从资源中获取描述信息
  • 如果没有对应的资源,则调用 Create() 接口创建资源
  • 如果有对应的资源,则从状态中进行资源对比,如果有变化,同样调用 Update() 接口更新
  • 如果没任何变化则忽略
安装

DevStream 的命令行工具叫 dtm,我们只需要下载该文件即可,前往 Release 页面 https://github.com/devstream-io/devstream/releases 打开最新的版本,下载对应平台的安装包(目前只支持 Linux 和 MacOS 系统)。

比如我这里是 Mac m1 平台,则下载 https://devstream.gateway.scarf.sh/releases/v0.7.0/dtm-darwin-arm64 这个安装包,

标记 dtm 为可执行文件,然后将其移动到 PATH 路径下面去:

$mvdtm-darwin-arm64dtm $chmod xdtm $sudomvdtm/usr/local/bin

现在我们可以通过执行 dtm 命令来验证是否安装成功。

devops10大开源工具(DevOps工具链管理器DevStream)(3)

使用基本命令

安装完成后我们就可以使用 dtm 工具了,直接执行 dtm 命令会显示目前所有的可用命令。

比如使用 dtm list plugins 命令可以查看目前 DevStream 支持的插件列表。

$dtmlistplugins argocd argocdapp devlake github-repo-scaffolding-golang githubactions-golang githubactions-nodejs githubactions-python gitlab-ce-docker gitlab-repo-scaffolding-golang gitlabci-generic gitlabci-golang hashicorp-vault helm-generic jenkins jira-github-integ kube-prometheus openldap tekton trello trello-github-integ

使用 dtm show config 命令可以显示默认的配置信息,其实就是3个主要配置文件的配置样例,如下所示:

$dtmshowconfig #defaultconfig.yamlsample: #varfilepath youcansetittoabsolutepathorrelativepath. varFile:variables.yaml#hereisarelativepath.(defaultsis./variables.yaml) #toolfilepath youcansetittoabsolutepathorrelativepath. toolFile:tools.yaml#hereisarelativepath. #stateconfig state: backend:local#backendcanbelocalors3 options: stateFile:devstream.state #tools.yamlsample: tools: -name:github-repo-scaffolding-golang instanceID:default options: owner:[[githubUsername]] org:"" repo:[[repoName]] #variables.yamlsample: githubUsername:daniel-hutao repo:go-webapp-demo

此外我们还可以在 show config 命令后面添加一个 --plugin 参数,来显示指定插件的配置信息,比如我们查看 argocd 的配置,如下所示:

$dtmshowconfig--pluginargocd tools: #nameofthetool -name:argocd #idofthetoolinstance instanceID:default #format:name.instanceID;Ifspecified dtmwillmakesurethedependencyisappliedfirstbeforehandlingthistool. dependsOn:[] #optionsfortheplugin options: #needtocreatethenamespaceornot default:false create_namespace:true repo: #nameoftheHelmrepo name:argo #urloftheHelmrepo url:https://argoproj.github.io/argo-helm #Helmchartinformation chart: #nameofthechart chart_name:argo/argo-cd #releasenameofthechart release_name:argocd #k8snamespacewhereArgoCDwillbeinstalled namespace:argocd #whethertowaitforthereleasetobedeployedornot wait:true #thetimetowaitforanyindividualKubernetesoperation(likeJobsforhooks).Thisdefaultsto5m0s timeout:5m #whethertoperformaCRDupgradeduringinstallation upgradeCRDs:true #customconfiguration(Optional).Youcanreferto[ArgoCDvalues.yaml](https://github.com/argoproj/argo-helm/blob/master/charts/argo-cd/values.yaml) values_yaml:| controller: service: port:8080

如果我们想要开发自己的插件,可以使用 dtm develop 命令:

$dtmdevelop Developisusedfordevelopanewplugin Usage: dtmdevelop[command] AvailableCommands: create-pluginCreateanewplugin validate-pluginValidateaplugin Flags: -h --helphelpfordevelop GlobalFlags: --debugdebuglevellog Use"dtmdevelop[command]--help"formoreinformationaboutacommand.

其中包含 create-pluginvalidate-plugin 两个子命令,一个用于创建一个新的插件,一个用于校验插件使用,比如创建一个名为 plugin-demo 的插件:

$dtmdevelopcreate-plugin 2022-07-0212:10:29✖[FATAL]thenamemustbenot"" youcanspecifyitby--nameflag $dtmdevelopcreate-plugin--nameplugin-demo 2022-07-0212:10:45ℹ[INFO]Rendertemplatefilesfinished. 2022-07-0212:10:45ℹ[INFO]Persistallfilesfinished. TheDevStreamPMC(projectmanagementcommittee)sincerelythankyouforyourdevotionandenthusiasmincreatingnewplugins! Tomaketheprocesseasyasabreeze DevStream(dtm)hasgeneratedsometemplatedsourcecodefilesforyoutoflattenthelearningcurveandreducemanualcopy-paste. Inthegeneratedtemplates dtmhasleftsomespecialmarksintheformatof"TODO(dtm)". PleaselookfortheseTODOsbyglobalsearch.Onceyoufindthem youwillknowwhattodowiththem.Also pleaseremembertocheckourdocumentationoncreatinganewplugin: **README_when_create_plugin.md** Sourcecodefilescreated. Happyhacking buddy! PleasegiveusfeedbackthroughGitHubissuesifyouencounteranydifficulties.Weguaranteethatyouwillreceiveunrivaledhelpfromourpassionatecommunity!

上面的命令会创建一个插件开发的脚手架,结构如下所示:

$tree. . ├──README_when_create_plugin.md ├──cmd │└──plugin │└──plugin-demo │└──main.go ├──docs │└──plugins │└──plugin-demo.md └──internal └──pkg ├──plugin │└──plugindemo │├──create.go │├──delete.go │├──options.go │├──plugindemo.go │├──read.go │├──update.go │└──validate.go └──show └──config └──plugins └──plugin-demo.yaml 12directories 11files

然后可以根据我们自己的实际需求去开发对应的插件即可,开发完成后可以校验插件的有效性。

$dtmdevelopvalidate-plugin--nameplugin-demo 2022-07-0212:13:05✔[SUCCESS]Plugin<plugin-demo>passedvalidation. 实践

接下来我们使用 DevStream 来实践下如何快速创建我们的 DevOps 工具链。

首先创建一个名为 devstream-demo 的目录:

$mkdirdevstream-demo&&cddevstream-demo

然后在该目录下创建一个名为 config.yaml 的主配置文件,文件内容如下所示:

#config.yaml varFile:variables-gitops.yaml toolFile:tools-gitops.yaml state: backend:local options: stateFile:devstream.state

在该主配置文件中我们指定了 varFiletoolFile 两个配置文件,已经使用了本地存储状态信息。

同样在该目录下面创建对应的变量配置文件 variables-gitops.yaml,内容如下所示:

#variables-gitops.yaml githubUsername:cnych repoName:dtm-test-go defaultBranch:main dockerhubUsername:cnych argocdNamespace:argocd argocdDeployTimeout:5m

该配置文件中我们定义了一些后面工具中需要使用到的变量。

接下来创建工具配置文件 tools-gitops.yaml,文件内容如下所示:

#tools-gitops.yaml tools: -name:github-repo-scaffolding-golang instanceID:default options: owner:[[githubUsername]] org:"" repo:[[repoName]] branch:[[defaultBranch]] image_repo:[[dockerhubUsername]]/[[repoName]] -name:githubactions-golang instanceID:default dependsOn:["github-repo-scaffolding-golang.default"] options: owner:${{github-repo-scaffolding-golang.default.outputs.owner}} org:"" repo:${{github-repo-scaffolding-golang.default.outputs.repo}} language: name:go version:"1.17" branch:[[defaultBranch]] build: enable:True command:"gobuild./..." test: enable:True command:"gotest./..." coverage: enable:True profile:"-race-covermode=atomic" output:"coverage.out" docker: enable:True registry: type:dockerhub username:[[dockerhubUsername]] repository:${{github-repo-scaffolding-golang.default.outputs.repo}} -name:argocd instanceID:default options: create_namespace:true repo: name:argo url:https://argoproj.github.io/argo-helm chart: chart_name:argo/argo-cd release_name:argocd namespace:[[argocdNamespace]] wait:true timeout:[[argocdDeployTimeout]] upgradeCRDs:true -name:argocdapp instanceID:default dependsOn:["argocd.default" "github-repo-scaffolding-golang.default"] options: app: name:${{github-repo-scaffolding-golang.default.outputs.repo}} namespace:[[argocdNamespace]] destination: server:https://kubernetes.default.svc namespace:default source: valuefile:values.yaml path:helm/${{github-repo-scaffolding-golang.default.outputs.repo}} repoURL:${{github-repo-scaffolding-golang.default.outputs.repoURL}}

上面的配置文件中我们定义了4个工具,每个工具的 name instanceID 需要唯一。

其中第一个工具为 github-repo-scaffolding-golang,该插件使用一个 Golang Web 应用程序的脚手架代码去创建一个 GitHub 代码仓库,使用该插件之前需要配置一个名为 GITHUB_TOKEN 的环境变量,可以前往 https://github.com/settings/tokens 创建一个 Personal access tokens,记得要有 repo 和 GitHub Actions 相关权限。

第二个工具插件为 githubactions-golang,这个插件会创建一些 Golang GitHub Actions 的工作流,同样该插件依赖 GITHUB_TOKEN 这个环境变量,如果启用了 Docker 镜像构建/推送,则还需要设置另外两个环境变量:DOCKERHUB_USERNAMEDOCKERHUB_TOKEN,Docker 的 Token 信息可以访问页面 https://hub.docker.com/settings/security?generateToken=true 去创建获取。

devops10大开源工具(DevOps工具链管理器DevStream)(4)

第三个插件是 argocd,该插件会使用 Helm chart 的方式在现有 Kubernetes 集群中安装 ArgoCD。

第四个插件是 argocdapp,此插件会创建一个 ArgoCD Application 的自定义资源。需要注意使用该插件之前必须要保证 ArgoCD 已经安装。

配置定义完之后,我们只需要在根目录下面执行 dtm init,该命令就会下载所有定义的相关插件,如果你使用的是 s3 来存储状态信息,则当再次执行该命令的时候会先从远程下载对应的状态信息。

$dtminit 2022-07-0212:36:03ℹ[INFO]GotBackendfromconfig:local 2022-07-0212:36:03ℹ[INFO]Usingdir<.devstream>tostoreplugins. 2022-07-0212:36:05ℹ[INFO]Downloading:[github-repo-scaffolding-golang-darwin-arm64_0.7.0.so]... 15.05MiB/15.05MiB[=================================]100.00%3.30MiB/s4s 2022-07-0212:36:10✔[SUCCESS][github-repo-scaffolding-golang-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:36:11ℹ[INFO]Downloading:[github-repo-scaffolding-golang-darwin-arm64_0.7.0.md5]... 33B/33B[===============================================]100.00%49B/s0s 2022-07-0212:36:11✔[SUCCESS][github-repo-scaffolding-golang-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:36:11ℹ[INFO]Plugin:github-repo-scaffolding-golang-darwin-arm64_0.7.0.sodoesn'tmatchwith.md5andwillbedownloaded. 2022-07-0212:36:12ℹ[INFO]Downloading:[github-repo-scaffolding-golang-darwin-arm64_0.7.0.so]... 15.05MiB/15.05MiB[=================================]100.00%4.71MiB/s3s 2022-07-0212:36:15✔[SUCCESS][github-repo-scaffolding-golang-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:36:15ℹ[INFO]Downloading:[github-repo-scaffolding-golang-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%133.44KiB/s0s 2022-07-0212:36:15✔[SUCCESS][github-repo-scaffolding-golang-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:36:16ℹ[INFO]Downloading:[githubactions-golang-darwin-arm64_0.7.0.so]... 17.49MiB/17.49MiB[=================================]100.00%4.05MiB/s4s 2022-07-0212:36:20✔[SUCCESS][githubactions-golang-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:36:21ℹ[INFO]Downloading:[githubactions-golang-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%206.08KiB/s0s 2022-07-0212:36:21✔[SUCCESS][githubactions-golang-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:36:21ℹ[INFO]Plugin:githubactions-golang-darwin-arm64_0.7.0.sodoesn'tmatchwith.md5andwillbedownloaded. 2022-07-0212:36:22ℹ[INFO]Downloading:[githubactions-golang-darwin-arm64_0.7.0.so]... 17.49MiB/17.49MiB[=================================]100.00%4.50MiB/s3s 2022-07-0212:36:25✔[SUCCESS][githubactions-golang-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:36:26ℹ[INFO]Downloading:[githubactions-golang-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%104.90KiB/s0s 2022-07-0212:36:26✔[SUCCESS][githubactions-golang-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:36:27ℹ[INFO]Downloading:[argocd-darwin-arm64_0.7.0.so]... 78.22MiB/78.22MiB[================================]100.00%1.99MiB/s39s 2022-07-0212:37:06✔[SUCCESS][argocd-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:37:07ℹ[INFO]Downloading:[argocd-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%186.01KiB/s0s 2022-07-0212:37:07✔[SUCCESS][argocd-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:37:07ℹ[INFO]Plugin:argocd-darwin-arm64_0.7.0.sodoesn'tmatchwith.md5andwillbedownloaded. 2022-07-0212:37:08ℹ[INFO]Downloading:[argocd-darwin-arm64_0.7.0.so]... 78.22MiB/78.22MiB[================================]100.00%2.53MiB/s30s 2022-07-0212:37:39✔[SUCCESS][argocd-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:37:40ℹ[INFO]Downloading:[argocd-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%136.46KiB/s0s 2022-07-0212:37:40✔[SUCCESS][argocd-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:37:41ℹ[INFO]Downloading:[argocdapp-darwin-arm64_0.7.0.so]... 68.19MiB/68.19MiB[================================]100.00%2.41MiB/s28s 2022-07-0212:38:09✔[SUCCESS][argocdapp-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:38:10ℹ[INFO]Downloading:[argocdapp-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%256.96KiB/s0s 2022-07-0212:38:10✔[SUCCESS][argocdapp-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:38:10ℹ[INFO]Plugin:argocdapp-darwin-arm64_0.7.0.sodoesn'tmatchwith.md5andwillbedownloaded. 2022-07-0212:38:10ℹ[INFO]Downloading:[argocdapp-darwin-arm64_0.7.0.so]... 68.19MiB/68.19MiB[================================]100.00%1.39MiB/s48s 2022-07-0212:38:59✔[SUCCESS][argocdapp-darwin-arm64_0.7.0.so]downloadsucceeded. 2022-07-0212:39:01ℹ[INFO]Downloading:[argocdapp-darwin-arm64_0.7.0.md5]... 33B/33B[=========================================]100.00%120.98KiB/s0s 2022-07-0212:39:01✔[SUCCESS][argocdapp-darwin-arm64_0.7.0.md5]downloadsucceeded. 2022-07-0212:39:01✔[SUCCESS]Initializefinished.

当我们再次执行 dtm init 命令的时候可以看到没有任何相关操作,这是因为前面我们已经将相关的插件全部下载到了本地。

$dtminit 2022-07-0212:39:42ℹ[INFO]GotBackendfromconfig:local 2022-07-0212:39:42ℹ[INFO]Usingdir<.devstream>tostoreplugins. 2022-07-0212:39:42ℹ[INFO]Plugin:github-repo-scaffolding-golang-darwin-arm64_0.7.0.soalreadyexists noneedtodownload. 2022-07-0212:39:42ℹ[INFO]Plugin:githubactions-golang-darwin-arm64_0.7.0.soalreadyexists noneedtodownload. 2022-07-0212:39:43ℹ[INFO]Plugin:argocd-darwin-arm64_0.7.0.soalreadyexists noneedtodownload. 2022-07-0212:39:43ℹ[INFO]Plugin:argocdapp-darwin-arm64_0.7.0.soalreadyexists noneedtodownload. 2022-07-0212:39:43✔[SUCCESS]Initializefinished.

初始化完成后会在当前目录下面创建一个 .devstream 的目录,该目录下面就是保存下载下来的插件相关文件。

接下来我们只需要在根目录下面执行 dtm apply 命令即可根据我们的配置文件创建或更新 DevOps 工具链了。

首先要记得配置需要的环境变量,比如我们这里上面的定义几个插件需要配置下面的3个环境变量:

$exportGITHUB_TOKEN=xxx $exportDOCKERHUB_USERNAME=cnych $exportDOCKERHUB_TOKEN=xxx

另外还需要一个在本地可访问的 Kubernetes 集群。

配置完成后直接执行 dtm apply 命令即可:

$dtmapply 2022-07-0213:17:15ℹ[INFO]Applystarted. 2022-07-0213:17:15ℹ[INFO]GotBackendfromconfig:local 2022-07-0213:17:15ℹ[INFO]Usingdir<.devstream>tostoreplugins. 2022-07-0213:17:15ℹ[INFO]Usinglocalbackend.Statefile:devstream.state. 2022-07-0213:17:17ℹ[INFO]Tool(argocd/default)foundinconfigbutdoesn'texistinthestate willbecreated. 2022-07-0213:17:17ℹ[INFO]Tool(argocdapp/default)foundinconfigbutdoesn'texistinthestate willbecreated. Continue?[y/n] Enteravalue(Defaultisn):y 2022-07-0212:54:38ℹ[INFO]Startexecutingtheplan. 2022-07-0212:54:38ℹ[INFO]Changescount:4. 2022-07-0212:54:38ℹ[INFO]--------------------[Processingprogress:1/4.]-------------------- 2022-07-0212:54:38ℹ[INFO]Processing:(github-repo-scaffolding-golang/default)->Create... 2022-07-0212:54:43ℹ[INFO]Therepodtm-test-gohasbeencreated. 2022-07-0212:54:55✔[SUCCESS]Tool(github-repo-scaffolding-golang/default)Createdone. 2022-07-0212:54:55ℹ[INFO]--------------------[Processingprogress:3/4.]- 2022-07-0213:17:19ℹ[INFO]Processing:(argocd/default)->Create... 2022-07-0213:17:28ℹ[INFO]Creatingorupdatinghelmchart... 2022/07/0213:17:33creating1resource(s) 2022/07/0213:17:33creating1resource(s) 2022/07/0213:17:33creating1resource(s) 2022/07/0213:17:33creating1resource(s) 2022/07/0213:17:33Clearingdiscoverycache 2022/07/0213:17:33beginningwaitfor4resourceswithtimeoutof1m0s 2022/07/0213:17:39creating43resource(s) 2022/07/0213:17:39beginningwaitfor43resourceswithtimeoutof5m0s 2022/07/0213:17:40Deploymentisnotready:argocd/argocd-applicationset-controller.0outof1expectedpodsareready 2022/07/0213:17:42Deploymentisnotready:argocd/argocd-applicationset-controller.0outof1expectedpodsareready ...... 2022/07/0213:19:44Deploymentisnotready:argocd/argocd-applicationset-controller.0outof1expectedpodsareready 2022/07/0213:38:27Deploymentisnotready:argocd/argocd-dex-server.0outof1expectedpodsareready 2022/07/0213:38:30releaseinstalledsuccessfully:argocd/argo-cd-4.9.11 2022-07-0213:38:30✔[SUCCESS]Tool(argocd/default)Createdone. 2022-07-0213:38:30ℹ[INFO]--------------------[Processingprogress:4/4.]-------------------- 2022-07-0213:38:30ℹ[INFO]Processing:(argocdapp/default)->Create... 2022-07-0213:38:31ℹ[INFO]application.argoproj.io/dtm-test-gocreated 2022-07-0213:38:31✔[SUCCESS]Tool(argocdapp/default)Createdone. 2022-07-0213:38:31ℹ[INFO]--------------------[Processingdone.]-------------------- 2022-07-0213:38:31✔[SUCCESS]Allpluginsappliedsuccessfully. 2022-07-0213:38:31✔[SUCCESS]Applyfinished.

apply 的过程中会将执行的状态保存在定义的状态后端存储中,比如我们这里使用的是本地存储,则会在根目录的 devstream.state 文件中保存执行的状态,比如我们这里一共4个工具链,如果前两个执行完成,后面两个执行识别了,则会在该文件中保存前两个插件的状态,下一次重新 apply 的时候则只需要执行后面两个工具链即可。

devops10大开源工具(DevOps工具链管理器DevStream)(5)

我们上面定义的工具链最终会为我们在 GitHub 上创建一个 Golang Web 的脚手架应用代码仓库。

devops10大开源工具(DevOps工具链管理器DevStream)(6)

会使用 Github Actions 来进行 CI 操作,构建 Docker 镜像。

devops10大开源工具(DevOps工具链管理器DevStream)(7)

CI 流程最后会推送镜像到 Docker Hub。

devops10大开源工具(DevOps工具链管理器DevStream)(8)

然后会在 Kubernetes 中部署 ArgoCD。

$kubectlgetpods-nargocd NAMEREADYSTATUSRESTARTSAGE argocd-application-controller-01/1Running05m55s argocd-applicationset-controller-64d8c477f4-2wrg61/1Running05m55s argocd-dex-server-dbdbf5499-krmfz1/1Running05m35s argocd-notifications-controller-b67c4bdb4-22t9l1/1Running05m55s argocd-redis-df9db799b-8gbpv1/1Running05m55s argocd-repo-server-56769cdd47-zs65j1/1Running05m55s argocd-server-7d4745f689-w5pp71/1Running05m55s

最后会通过 ArgoCD 来进行 CD 操作,将我们的示例应用部署到 Kubernetes 集群中去,其实就是创建了一个 ArgoCD 的 Application 对象。

$kubectlgetapplications-nargocd NAMESYNCSTATUSHEALTHSTATUS dtm-test-goUnknownHealthy

我们也可以通过 ArgoCD 查看部署的应用详情。

devops10大开源工具(DevOps工具链管理器DevStream)(9)

最后如果想要删除整个工具链则只需要执行 dtm delete 命令即可。

整个流程体验非常顺畅(除了因为某些原因访问 GitHub 超级慢之外),我们只需要根据需要在配置文件中定义对应的插件即可,关于插件的具体配置方式可以参考官方文档 https://docs.devstream.io/en/latest/plugins/plugins-list/ 了解更多相关信息。

只需要在一个 YAML 配置文件中定义你所需要的 DevOps 工具,只需按一个命令就能建立起整个 DevOps 工具链和 SDLC 工作流了,所以说 DevStream 是神器完全不为过。

Git 仓库:https://github.com/devstream-io/devstream

devops10大开源工具(DevOps工具链管理器DevStream)(10)

k8s技术圈

猜您喜欢: