写点什么

我的第一款 Drone 插件

  • 2019-11-28
  • 本文字数:2046 字

    阅读完需:约 7 分钟

我的第一款 Drone 插件

前言

Drone 是一款基于 Docker 的 CI 工具,不仅运行环境是容器化的,甚至于 CI 流中的每一个插件也是 docker 容器。基于容器的 Drone 插件一大特色就是允许我们使用任何语言去开发插件,Python, PHP, Nodejs, bash… 这些都是可以的。每个开发者都可以使用自己熟悉的语言去开发自己想要的插件。Drone 的官方插件市场罗列了很多插件,并且在文档提供了 Golang 和 Bash 版本的插件开发文档,并开源了一个插件脚手架。


官方插件里有一个 drone-telegram 插件,不过插件目前是不支持自定义 telegrame 请求地址的,对于我这种机器部署在国内需要使用反代的方式访问 telegram 的用户来说不是很方便。搜索到 node-telegram-api 这个模块可以配置,下面我就简单说说基于 Nodejs 写一个 Telegram 消息通知的插件。


1 原理

Docker 容器在启动的时候可以设置一个启动命令,这样我们就可以做到实例化插件容器的时候就执行插件脚本。另外 Drone 运行插件的时候会将本次 CI 构建相关的信息以及插件配置信息以环境变量的形式注入到插件容器实例中。所有的语言都是可以去读取系统环境变量的,这也让其支持所有语言成为了可能。


  • 插件配置会以 PLUGIN_xxx 的形式注入,例如 PLUGIN_TOKEN。

  • 构建相关的信息会以 CI_xxx 或者 DRONE_xxx 的形式注入,例如 DRONE_COMMIT, CI_COMMIT_AUTHOR_NAME。

2 编写插件

编写插件很简单,只需要注意需要获取的配置使用 PLUGIN_ 获取即可,例如 telegram 需要使用的 PLUGIN_TOKEN 等。下面是具体的插件代码:


const render = require('drone-render');const TelegramBot = require('node-telegram-bot-api');
const { PLUGIN_TOKEN, PLUGIN_TO, TELEGRAM_TOKEN, TELEGRAM_TO, PLUGIN_LANG, PLUGIN_MESSAGE, PLUGIN_BASE_API_URL} = process.env;
const TOKEN = PLUGIN_TOKEN || TELEGRAM_TOKEN;const TO = PLUGIN_TO || TELEGRAM_TO;
if(PLUGIN_LANG) { render.locale(PLUGIN_LANG);}const bot = new TelegramBot(TOKEN, { baseApiUrl: PLUGIN_BASE_API_URL});bot.sendMessage(TO, render(PLUGIN_MESSAGE));
复制代码


可以看到其实代码非常的简单。

3 Dockerfile

插件写好之后就需要创建 Dockerfile 文件制作镜像了。由于 Dockerfile 的每一个指令都会为容器创建一个 layer,所以这里有个小技巧是将 npm install 依赖安装这种不怎么会变化的操作提前,频繁变化的插件脚本的拷贝置后。这样在多次打包发布的时候会占优势,仅仅只会传后面变化的部分,减小传输体积。


FROM mhart/alpine-node:8.9.3
WORKDIR /telegram-nodeCOPY package.json /telegram-node/package.jsonRUN npm install
COPY index.js /telegram-node/index.jsENTRYPOINT [ "node", "/telegram-node/index.js" ]
复制代码


最后就是编译并发布我们的 docker 容器以供其它人方便使用:


docker build lizheming/drone-telegram-node .docker push lizheming/drone-telegram-node
复制代码

4 测试

本地使用如下命令启动镜像即可测试插件是否工作:


docker run --rm \    -e PLUGIN_TOKEN=xxxxxxx \    -e PLUGIN_TO=xxxxxxx \    -e PLUGIN_MESSAGE=test \    -e PLUGIN_BASE_API_URL=xxxx \    lizheming/drone-telegram-node
复制代码

5 问题

secrets 参数获取

经常有些密钥之类的参数不想写在 .drone.yml 配置文件中暴露给所有项目可见的用户,这时候我们就会使用 drone secrets 添加变量,具体可参考我之前写的文章《如何使用Drone》


这里需要注意的是 secrets 定义的变量名即最后 drone 注入进入的环境变量名称,所以不能随意使用。例如你的配置是:


pipline:  telegram:    image: lizheming/drone-telegram-node    secrets: [ telegram_token, telegram_to ]    message: hello
复制代码


最后你在插件内部就能使用 process.env.TELEGTAM_TOKEN 来获取对应的密钥变量。

插件不生效

在编写插件的时候我碰到的一个问题是我最开始的 Dockerfile 是如下这样的:


FROM mhart/alpine-node:8.9.3
WORKDIR /telegram-nodeCOPY package.json /telegram-node/package.jsonRUN npm install
COPY index.js /telegram-node/index.jsENTRYPOINT [ "node", "index.js" ]
复制代码


由于我设置了 WORKDIR 工作目录,正常的 docker run 是可以找到我的入口文件为 ${WORKDIR}/index.js 的。但是 drone 在执行插件的时候由于需要访问项目代码,所以会通过命令覆盖掉镜像的 WORKDIR 配置。导致了我的插件正常运行没问题,但是上到 drone 怎么也执行不了。最后查了才发现是因为复现了工作目录配置后入口文件找不到压根就没执行我的插件的问题。

6 后记

插件的所有代码已经发布在Github



镜像 lizheming/drone-telegram-node 也已发布到 docker hub 上。本插件相对于官方的插件的优势是能够设置 telegram API 接口的地址,对于国内服务使用反代的方式来说比较适合。如果想要在国内服务器上使用 drone telegram 消息通知的可以使用。不知道如何设置 telegram API 反代的也可以参考我的文章《反代访问Telegram》


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/-h1bZp4N-6F_89XmSH214g


2019-11-28 11:591054

评论

发布
暂无评论
发现更多内容

关于Python中math 和 decimal 模块的解析与实践

华为云开发者联盟

Python 开发 华为云 华为云开发者联盟

L2 网络 Mint Blockchain 正式对外发布测试网

NFT Research

blockchain NFT 测试网络

探索基于Stable Diffusion的智能绘画大模型

百度开发者中心

人工智能 深度学习 图像 大模型

互联网大厂面试题解析之大疆一面

派大星

Java 面试题 互联网大厂面试

Text Workflow for mac(文本格式转换工具) v1.9.1直装激活版

iMac小白

Eudic欧路词典 for Mac(英语词典翻译查询工具) v4.6.2激活版

iMac小白

Microsoft Remote Desktop for Mac(微软远程连接软件) v10.9.6直装激活版

iMac小白

抖音技术分享:飞鸽IM桌面端基于Rust语言进行重构的技术选型和实践总结

JackJiang

网络编程 即时通讯 IM

JAVA请求示例获取1688商品详情数据API接口item_get-获得阿里巴巴商品详情(按关键词搜索商品列表)

Anzexi58

API 文档

BEANZ NFT 概览与数据分析

Footprint Analytics

blockchain NFT

多种方式获取淘宝商品详情数据,关键词搜索商品列表,店铺ID获取店铺所有商品,按图搜索获取商品详情数据

Anzexi58

API 文档

WPF性能优化:性能分析工具

EquatorCoco

性能优化 服务器 WPF

QCN9274 and QCN6224 are different, why is one a high match and the other a low match?

wifi6-yiyi

OpenMLDB v0.8.5 发布:认证功能完善,安全升级全面实施

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

京东商品详情数据获取item_get-获得JD商品详情,Java请求示例API接口

Anzexi58

奇点云:SAFe框架下,我们对平台软件工程生产线做了4项改造

奇点云

大数据平台 制造业 奇点云

请求示例JAVA获取淘宝商品详情数据API接口item_get-获得淘宝商品详情(按关键词搜索商品列表)

Anzexi58

API 文档

vivo 在离线混部探索与实践

vivo互联网技术

云计算 大数据 DevOps

iPaaS如何实现安全通信保障

RestCloud

信息安全 ipaas

J17资本合伙人SKY LAI确认出席Hack .Summit() 2024区块链开发者盛会

TechubNews

大模型+搜索:构建完整技术栈,为企业定制化注入新活力

百度开发者中心

数字 大模型 人工智能、

颠覆软件工程、“杀死”开发者?回溯大模型落地应用这一年 | 盘点

思码逸研发效能

Sermant 的整体流程学习梳理

华为云开源

开源 字节码 微服务治理 sermant

骚操作之 持有 ReadOnlySpan 数据

八苦-瞿昙

C#

用户使用433MHz无线模块时,出现偶尔无法收发数据的原因?

Geek_ab1536

AudFree Tidable Music Converter for Mac(Tidal音乐转换器) v2.14.0免激活版

iMac小白

干货!Windbg 在 TDengine 内存泄漏调试中的应用与实践分享

TDengine

tdengine 时序数据库 内存泄漏 windbg

文生视频Sora模型发布,是否引爆AI芯片热潮

申公豹

人工智能

我的第一款 Drone 插件_服务革新_怡红公子_InfoQ精选文章