阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |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:59970

评论

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

Omnifocus Pro 3中文破解下载 附安装教程

影影绰绰一往直前

Serial for Mac激活版下载(全功能串行终端管理软件)

影影绰绰一往直前

Serial下载 Serial破解版

安全好用性价比高的远程协同运维软件有吗?

行云管家

IT运维 远程运维 运维协同

面向线上的springboot开发框架-Aradin

liudaac

springboot SpringCloud Alibaba spring-cloud java框架 脚手架

基于 Letterize.js + Anime.js 实现炫酷文本特效

南城FE

CSS JavaScript 前端开发 动画 文字动画

mac外接显示屏,下方程序坞跑到外接显示器上,怎么拖回mac里呢?

Rose

Mac

mac电脑OCR文字识别推荐 Cisdem OCRWizard激活最新

mac大玩家j

Mac软件 ocr识别工具

适用于苹果Mac的 5 个最佳 SSH 客户端软件

影影绰绰一往直前

Programming Abstractions in C阅读笔记:p196

codists

浪潮云蝉联中国云原生安全市场第一位

浪潮云

云安全

推荐15个苹果Mac用户都说好用的应用软件

Rose

Mac软件 苹果电脑 装机必备

Linux常用命令用法及实现方式

小齐写代码

小程序开发还犯迷糊?快戳这份华为云实用技巧效率翻倍

YG科技

物理机服务器优势

Geek_f19a80

服务器

第27期 | GPTSecurity周报

云起无垠

Mac电脑批量重命名:A Better Finder Rename 12 免激活

胖墩儿不胖y

Mac软件 重命名工具 文件夹重命名软件

如何快速配置一个新的SpringBoot项目

Lahm Chen

Spring Frame

CodeWhisperer 使用经验分享

亚马逊云科技 (Amazon Web Services)

人工智能 机器学习 云上探索实验室 Amazon CodeWhisperer

快get2023年跨境电商出海指南,华为云教你把握快速捞金机遇

YG科技

当“996”开发模式都没用了,华为云这款轻量应用服务器才是终极答案

YG科技

3D渲染和动画制作:KeyShot 2023 Pro最新注册机

Rose

3D渲染 动画制作 KeyShot Pro破解版 KeyShot Pro 2023下载 KeyShot Pro注册机

云上应用技术架构-LNMP应用

深蓝

Navicat Premium 15 for Mac(数据库开发工具)v15.0.36中文激活版

mac

Navicat Premium 苹果mac Windows软件 数据库管理软件

Red Giant Trapcode Suite for Mac(红巨星粒子插件)激活破解版下载

影影绰绰一往直前

小程序游戏风口有点“堵”?华为云耀云服务器L实例为企业疏难解困

YG科技

热门PDF编辑和管理软件:Acrobat Pro DC 2022中文直装版 附一键激活补丁

Rose

Acrobat Pro DC 2022 PDF编辑器下载 Acrobat Pro DC 2022破解

数据恢复软件Disk Drill for Mac 完美激活版下载

影影绰绰一往直前

Mac交互式原型设计Axure RP 10中文授权码

Rose

Axure RP 10 下载 Axure RP 10中文版 Axure RP 10授权

低代码平台加持后紧急交付项目如何突破极限

鲸品堂

低代码 企业号11月PK榜

MathWorks Matlab R2023b Mac报错 License Manager Error -8

Rose

数学软件 Matlab R2023b破解补丁 Matlab R2023b报错

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