关于github:Dagger-洞见

53次阅读

共计 3090 个字符,预计需要花费 8 分钟才能阅读完成。

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 公布

正文完
 0