English version:《Dagger In-Depth: Everything You Need to Know》
Author: @Tiexin Guo(郭铁心)
翻译:Runrunniu
1 什么是 Dagger?
TL;DR:Dagger 是在 Docker 容器中本地运行 CI/CD 流水线的工具
说实话,Dagger 很难有具体的定义。媒体称之为“DevOps 平台”;风投机构称其为“DevOps 操作系统”。
但 Dagger 并不能这样定义。在咱们讲 Dagger 是什么之前,先来理解以下内容:
2 Dagger 的特点
2.1 BuildKit
Dagger 的配置在 BuildKit 中执行,这是 Docker 的外围执行引擎 (镜像构建神器)。
BuildKit 作为 Moby 我的项目一部分被开发,是一个凋谢框架,用于组装专门的容器零碎,而无需 Docker 从新组装。实质上,它是一个工具包,可能高效、可反复地将源代码转换为构建工具。2017 年,BuildKit 首次公布,并在 2018 年 9 月与 Docker Engine 一起公布了 2018 版本。
2.2 CUE
与大多数 CI 零碎不同,你不须要用 Dagger 编写 YAML,只须要编写 CUE。
CUE 是一种开源的数据验证语言和推理引擎,实质上是逻辑编程,旨在简化波及定义和应用数据的工作。实际上是 JSON 的超集,纯熟应用 JSON 的用户能够疾速上手,另外 CUE 还具备内置的主动格式化性能。
只管它不是通用编程语言,但它有很多利用,例如数据验证、数据模板、配置、查问、代码生成,甚至脚本编写等等。
2.3 请等一下
既然为配置执行重用 Docker 的局部,为什么不重复使用另一部分的文件呢?
Dagger 的创始人 Solomon Hykes 在他们的官网 Discord 频道上明确地答复了这个问题:
· 咱们须要一个正式标准的独立社区,具备类型零碎、包装管理器、原生 Yaml 和 json 相互配合的申明性语言。
· Docker 文件也是专门构建的,但 Dagger 更通用。
· Docker 文件无奈反对不同版本的需要。
3 Dagger 能做些什么?
3.1 这不是 Dagger
首先,咱们援用对于 Dagger 的官网文献来避开歧义:
· Dagger 不会取代 CI,只是会通过在增加 Wrapper Layer 进行改良。
Dagger 没有 替换 现有的 CI,而是通过增加 Wrapper Layer 来改良 CI。
咱们能够把“Wrapper”换成比拟官网高级的说法——“可移植开发层”。
3.2 所以 Dagger 只是一个 Wrapper?
咱们来看看 DevOps/cloud 的其余例子:
· Terraform。须要治理简单的环境,即便有能够重复使用的模快和角色,依然须要跨环境重复使用代码。Terragrunt 是一个能提供额定工具来放弃配置简略、不反复的 Wrapper layer。
· AWS CDK。它实质上是 CloudFormation 之上的一个 Wrapper layer,容许应用相熟的编程语言来定义和预置 AWS 云基础设施。这样就不用解决 CloudFormation 的不可读配置。当然,代码仍会转换为 CloudFormation 的可读格局,并且由 CloudFormation 治理基础架构;AWS CDK 与 AWS API 不会间接交互。
· 至于 CDKTF(CDK for Terraform),其实和 AWS CDK 没有什么不同,兴许 AWS CDK 给 CDKTF 带来了灵感,并且 AWS 的 jsii 库能够实现多语言性能。它是 Terraform 之上的一个 Wrapper layer,可将代码转换为 Terraform HCL,这样就不用学习 HCL。但实质上,基础设施由 Terraform HCL 治理,而不是间接由代码治理。所以,它是另一个 Wrapper。
那么 Dagger 到底是做什么的呢?Dagger 到底包装了什么?
3.3 Dagger 能做什么
在 CI 零碎中,你能够以某种格局(最有可能是 YAML)定义一些步骤和操作,。例如,在 Jenkins 中,兴许你会编写一些 groovy 文件。在 GitHub Actions 中,你会编写一些蕴含多个步骤的 YAML。
Dagger 在 Docker 中运行这些“步骤和操作”。那么 Dagger docker 自身在哪里运行呢?这是个好问题:能够在本地运行或在 CI 零碎中。Dagger 不会包装 CI 流水线和零碎,它把所有琐碎的步骤和操作放在一个 Docker 容器中,在 CI 零碎中运行,就像在编写一个大的 Docker 文件,它会运行 git 克隆、源代码动态扫描、测试、构建、工件上传等等所有内容。
4 Dagger 到底是什么
说 Dagger 是 Wrapper,这没错。
但它不蕴含 CI 零碎,而是将流水线步骤和操作包装到一个容器中(必须用 Dagger 的语法编写这些步骤和操作),并且包装的后果能够在另一个 CI 中运行。
从这个意义上说,Dagger 是 另一个 CI 零碎,只是 CI 在容器中运行,而大多数 CI 零碎恰好可能运行容器。
5 Dagger 的劣势
Dagger 有三大劣势
5.1 本地开发
首先,不须要装置 任何 该应用程序的特定依赖项,Dagger 治理 Docker 内的所有两头步骤和长期依赖项。
如果咱们探讨 CI,这可能不是一个劣势,但如果咱们议论本地开发,这就是 Dagger 的一个劣势。
Go 和 Nodejs,要么须要装置模块,要么甚至可能须要切换 Node 版本能力装置。而当初你能够在一个容器内实现所有这些操作,并且只将最终后果发送到本地。
5.2 自建 CI
当初能够在本地运行流水线,因为你能够轻松地在本地启动和运行 Docker 桌面。
不过,咱们当初都有功能齐全的电脑;你能够在本地运行 CI 零碎,那为什么还要在这些零碎上节约钱呢?只有 Docker 可用,就能够在任何中央运行,如果不想购买 CI 作为服务,你能够在本人的基础架构中运行 Dagger。
5.3 迁徙到另一个 CI
既然“步骤和操作”须要一个容器,能够在 CI 零碎中运行。
如果你须要迁徙到另一个 CI 零碎,则无需再反复 CI 步骤。例如,你不想再应用公司的旧 Jenkins 实例,但曾经在应用 Dagger 和 Jenkins,当初想尝试一下 GitHub Actions。
在这种场景下,有两点要做:
· 如果当初正在应用 Jenkins,并且想要将这些 Jenkins 流水线迁徙到 Dagger 中,则须要手动实现。老本与用 GitHub Actions 的语法重写整个流水线雷同(如果工作量不大的话)。
· 你仍须要理解新的 CI 零碎如何触发作业、如何应用语法等。Dagger 的确提供了一个防止 CI 锁定的解决方案,但这并不是一个从根本上解决灵活性以及运行规定问题的计划。
对于 DevOps 工程师来说,可能满足不同团队、不同需要、不同优先级的 DevOps 工具链更具吸引力。每个组件都是可模块化和可插拔的,能够少做很多繁琐的工作。
现实状态下,你能够在可读的 YAML 配置文件中定义所需的 DevOps 工具,并且通过命令能够设置或更改整个 DevOps 工具链和 SDLC 工作流程。
如果你对“DevOps toolchain as code”感兴趣,欢送理解 DevStream!
6 当初应该应用 Dagger 吗?
Dagger 有前途吗?大略有的。当初就用 Dagger 吗?倒也不用,起因有三:
· Dagger 我的项目自身依然应用 GitHub Actions。因为它有局限性,不能通过 GitHub Actions 实现所有事件。
· 咱们通常不会每 6 个月更改一次 CI 零碎。如果 4 年更新一次,那何必用这个 Wrapper?
· Dagger 是最近新公布的,还没有反对很多 CI 零碎,临时不能保障在不同的 CI 零碎中失常应用。
欢送大家探讨,下期文章见!
本文由博客群发一文多发等经营工具平台 OpenWrite 公布