Drone CI 中文文档

插件卡片

Drone 宣布推出由 Microsoft Adaptive Cards 提供支持的用户界面插件

这是一项强大的新功能,允许 Drone 插件扩展构建执行视图并提供其执行的相关信息。

插件卡片允许 Drone 用户深入了解其构建的执行情况,并使他们能够更快地检测潜在问题。

如果使用支持的插件,插件卡片将在插件执行结束时自动出现在构建的执行视图中。

卡片是什么样子的

根据呈现的数据类型,不同的插件将具有不同的可视化效果。 这是 Docker 插件卡片的示例:

Drone 插件卡片

通过这张卡片,你可以一目了然地看到与 docker 插件执行期间生成的镜像有关的所有重要信息。

支持的版本

  • Drone Server - v2.6.0+
  • Drone Runner Docker - v1.8.0+ / Drone Kubernetes Runner - 最新版本

支持的插件

  • Drone-docker
  • Snyk
  • Gitleaks

如何为我的插件添加自适应卡片支持?

插件卡片建立在开放的自适应卡片格式之上。这使得插件开发人员更容易添加增强的输出功能,而无需对 Drone Server 进行任何更改。

卡片由模板(用户看到的内容)和插件的输出(构建的原始数据)组成。这些由 Drone 组合以在 Drone UI 中显示卡片。

在插件执行期间,Drone 会下载插件模板。你可以在此处找到模板外观的示例,并在渲染卡片时下载。

下面是 docker 插件生成的 JSON Payload 结构。这是卡片上显示的原始信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
    "Id": "sha256:d9437eae98f2787931b0fae86cc79c3993cd3ed031f84f67a41fdff5bcb436c9",
    "RepoTags": ["drone-test:latest", "5699c94024237b8b4838717f4f7a55d55cab66bb:latest"],
    "RepoDigests": ["drone-test@sha256:2ab4cd8ec41a0f7d68c34289a52dffa4d483abbdd10bcd68fd4da3e904a81f76"],
    "Parent": "sha256:bdca5d527305e375f37d177e745224d0d7fce56eb1454210d9a6f2441a40d31b",
    "Comment": "",
    "Created": "2022-01-05T12:04:34.3483105Z",
    "Container": "eafafc780d73493be11f546777ff303341b2094671b244ed804eff49a722d40a",
    "DockerVersion": "20.10.9",
    "Author": "",
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 186298129,
    "VirtualSize": 186298129,
    "Metadata": {
        "LastTagTime": "2022-01-05T12:04:34.392555Z"
    }
}

将 Drone 卡片功能添加到插件

创建模板

开始之前,你首先要考虑希望在屏幕上显示的信息及其外观。这成为卡片的模板。创建它的最简单方法是使用此自适应卡片设计器。

本示例中的 docker 模板是使用 Github 页面托管和提供的。提及插件的目录结构如下:

  • /docs/template.json
  • /docs/sample_data.json

卡片输入

这假设你的插件是用 Golang 编写的,但只要正确创建了 JSON 输出,你也可以选择用任何其他语言编写。

卡片结构的结构如下。这将是写入日志的内容,供 Runner 提取信息并将其发布到 Drone Server。

1
2
3
4
CardInput struct {
    Schema string          `json:"schema"` // template url
    Data   json.RawMessage `json:"data"` // template data
}

下面对卡片数据进行编码,以便 Runner 从日志中提取它:

1
2
3
4
5
6
7
8
func writeCardTo(out io.Writer, data []byte) {
    encoded := base64.StdEncoding.EncodeToString(data)
    io.WriteString(out, "\u001B]1338;")
    io.WriteString(out, encoded)
    io.WriteString(out, "\u001B]0m")
    io.WriteString(out, "\n")
    }
}

此代码允许插件同时支持 CI 和 Drone。创建卡片输入结构后,必须将其写入「dev/stdout」。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func writeCard(path string, card interface{}) {
    data, _ := json.Marshal(card)
    switch {
    case path == "/dev/stdout":
        writeCardTo(os.Stdout, data)
    case path == "/dev/stderr":
        writeCardTo(os.Stderr, data)
    case path != "":
        ioutil.WriteFile(path, data, 0644)
    }
}