【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

我的第一款 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:59972

评论

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

明道云新增四项国产信创平台兼容性认证

明道云

Vue3入门指北(三)ref和reactive

Augus

Vue 9月月更

OpenHarmony主干开发板家族新添两成员,主干开发板数达20款

科技热闻

本地生活与小程序技术融合迎战增量市场

Onegun

小程序 小程序容器 本地生活

原生Redis跨数据中心双向同步优化实践

京东科技开发者

数据中心 幂等性 同步 数据容灾 Redis 数据结构

议题征集:NGINX Sprint China 2022 线上大会

NGINX开源社区

nginx 开源软件 Sprint

必修课!深度解析金融级分布式数据库一致性技术

腾讯云数据库

数据库 腾讯云 tdsql 腾讯云数据库

百度工程师带你探秘C++内存管理(理论篇)

百度Geek说

c++ Linux 开发语言 企业号九月金秋榜

IaC 存储最佳实践

SEAL安全

DevOps 基础设施 DevSecOps 基础设施即代码 IaC

本周四晚19:00知识赋能第八期第3课丨涂鸦小游戏的实现

OpenHarmony开发者

OpenHarmony

瓜分 28 万现金大奖,Tapdata 数据源 Connector 大赛等你来战!

tapdata

开源 开发者 开源项目 挑战赛

最高增强至1440p,阿里云发布端侧实时超分工具,低成本实现高画质

阿里云大数据AI技术

机器学习 企业号九月金秋榜

软件测试 | 测试开发 | 测试面试 | 某互联网大厂测试面试真题,你能回答出多少?

测吧(北京)科技有限公司

测试

orbeon form 的配置介绍

Jerry Wang

angular SAP commerce form 9月月更

少儿编程是智商税?还是未来的生存技能?

博文视点Broadview

2022华为开发者大赛开学动员 开启想象力无限创新

华为云开发者联盟

云计算 后端 企业号九月金秋榜

软件测试 | 测试开发 | Web自动化之显式等待与隐式等待

测吧(北京)科技有限公司

软件测试 | 测试开发 | Web 控件定位与常见操作

测吧(北京)科技有限公司

测试

点赞破百万!字节算法大佬亲撰30W字数据算法笔记:GitHub标星93K

程序知音

Java 数据结构 数据结构与算法 后端技术

沉舟侧畔千帆过 | 高德的OceanBase Cloud实践之路

followtry

最佳实践 分布式数据库 数据库迁移 oceanbase

当面试官问你:如何才能带领好团队?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 测试面试 | 某个版本/模块问题很多,但上线时间紧迫怎么办?

测吧(北京)科技有限公司

测试

如何使用 eunomia 让eBPF 的部署更简单? | 第 49 期

OpenAnolis小助手

Linux 直播 ebpf sig 龙蜥大讲堂

如何通过 Nginx 解决跨域问题

观测云

Vue3入门指北(二)创建应用实例

Augus

Vue 9月月更

EasyNLP带你实现中英文机器阅读理解

阿里云大数据AI技术

自然语言处理 深度学习 PyTorch 企业号九月金秋榜

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

华为云开发者联盟

Python 人工智能 企业号九月金秋榜

Notebook交互式完成目标检测任务

华为云开发者联盟

人工智能

软件测试 | 测试开发 | 测试面试真题|从手工到测开,一位测试媛宝妈的 BAT 大厂逆袭之旅

测吧(北京)科技有限公司

测试

Vue3入门指北(四)computed (计算属性)

Augus

Vue 9月月更

软件测试 | 测试开发 | web 控件的交互进阶

测吧(北京)科技有限公司

测试

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