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 全生命周期的开源工具管理起来,提供了包括安装部署、最佳实践配置等功能,因开发者而生,由开发者开发,为开发者服务。
想象你正在开始一个新的项目或组建一个新的团队。在写第一行代码之前,你需要一个能够高效运转 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 组件而构建的工具,有点类似于 yum、apt 这些软件包管理工具,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 同时支持 local 和 s3 后端存储来保存 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 属性下的 bucket、region 和 key 都是 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 中的每个状态都是一个包含名称、插件、选项和资源的结构
我们将创建的插件称为资源,插件的 Read() 接口将返回对该资源的描述,该描述又存储为状态的一部分。
DevStream 的整个工作流如下图所示:
- 首先获取工具状态
- 如果状态中没找到工具,则调用 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 命令来验证是否安装成功。
使用基本命令安装完成后我们就可以使用 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-plugin 和 validate-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
在该主配置文件中我们指定了 varFile 和 toolFile 两个配置文件,已经使用了本地存储状态信息。
同样在该目录下面创建对应的变量配置文件 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_USERNAME 与 DOCKERHUB_TOKEN,Docker 的 Token 信息可以访问页面 https://hub.docker.com/settings/security?generateToken=true 去创建获取。
第三个插件是 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 的时候则只需要执行后面两个工具链即可。
我们上面定义的工具链最终会为我们在 GitHub 上创建一个 Golang Web 的脚手架应用代码仓库。
会使用 Github Actions 来进行 CI 操作,构建 Docker 镜像。
CI 流程最后会推送镜像到 Docker Hub。
然后会在 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 查看部署的应用详情。
最后如果想要删除整个工具链则只需要执行 dtm delete 命令即可。
整个流程体验非常顺畅(除了因为某些原因访问 GitHub 超级慢之外),我们只需要根据需要在配置文件中定义对应的插件即可,关于插件的具体配置方式可以参考官方文档 https://docs.devstream.io/en/latest/plugins/plugins-list/ 了解更多相关信息。
只需要在一个 YAML 配置文件中定义你所需要的 DevOps 工具,只需按一个命令就能建立起整个 DevOps 工具链和 SDLC 工作流了,所以说 DevStream 是神器完全不为过。
Git 仓库:https://github.com/devstream-io/devstream
k8s技术圈