Drone 宣布推出由 Microsoft Adaptive Cards 提供支持的用户界面插件
这是一项强大的新功能,允许 Drone 插件扩展构建执行视图并提供其执行的相关信息。
插件卡片允许 Drone 用户深入了解其构建的执行情况,并使他们能够更快地检测潜在问题。
如果使用支持的插件,插件卡片将在插件执行结束时自动出现在构建的执行视图中。
卡片是什么样子的
根据呈现的数据类型,不同的插件将具有不同的可视化效果。
这是 Docker 插件卡片的示例:
通过这张卡片,你可以一目了然地看到与 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)
}
}
|