Mi primer complemento de Drone

Mi primer complemento de Drone

Computación en la nube Yihong Son 360

Declaración de heroína

El autor de este artículo es el Sr. Yihong, un ingeniero front-end de Qiwu Group. Es el autor de la popular plataforma de blogs de código abierto Firekylin (más de 1.2k estrellas). Hoy comparte un complemento Drone.io para notificaciones de Telegram. basado en Nodejs. Este artículo se publicó por primera vez en Yihong Courtyard y la reimpresión ha sido autorizada por el autor.
PD: La tecnología de primera línea rica y las formas de expresión diversificadas están en la "charla de tecnología de primera línea de HULK", ¡preste atención!

Prefacio



Drone es una herramienta de CI basada en Docker. No solo el entorno operativo está en contenedores, sino que incluso todos los complementos del flujo de CI son también un contenedor de Docker. Una característica importante del complemento Drone basado en contenedores es que nos permite usar cualquier lenguaje para desarrollar complementos, Python, PHP, Nodejs, bash ... Todos son posibles. Cada desarrollador puede usar su lenguaje familiar para desarrollar el complemento que desee. El mercado de complementos oficial de Drone enumera muchos complementos y proporciona versiones de Golang y Bash de la documentación de desarrollo de complementos en la documentación, y un andamio de complementos de código abierto.

Hay un complemento de telegrama de drones en el complemento oficial, pero el complemento actualmente no admite la personalización de la dirección de solicitud de telegrama, lo que no es muy conveniente para los usuarios que necesitan usar el acceso antigeneracional al telegrama cuando el La máquina se despliega en China. Después de la búsqueda, se puede configurar el módulo node-telegram-api. Permítanme hablar brevemente sobre cómo escribir un complemento de notificación de mensajes de Telegram basado en Nodejs.
Mi primer complemento de Drone

1

principio

Se puede establecer un comando de inicio cuando se inicia el contenedor Docker, de modo que podamos ejecutar el script del complemento al crear una instancia del contenedor del complemento. Además, cuando Drone ejecuta el complemento, la información relacionada con esta compilación de CI y la información de configuración del complemento se inyectará en la instancia del contenedor del complemento en forma de variables de entorno. Todos los idiomas pueden leer las variables de entorno del sistema, lo que hace posible admitir todos los idiomas.

  • La configuración del complemento se inyectará en forma de PLUGIN_xxx, como PLUGIN_TOKEN.
  • La información relacionada con la construcción se inyectará en forma de CI_xxx o DRONE_xxx, como DRONE_COMMIT, CI_COMMIT_AUTHOR_NAME.

2

Escribe un complemento

Escribir un plug-in es muy sencillo, solo hay que prestar atención a la configuración que debe obtenerse mediante PLUGIN_ para obtenerla, como por ejemplo, PLUGIN_TOKEN que necesita utilizar Telegram. El siguiente es el código de complemento específico:


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));

Puede ver que el código es realmente muy simple.

3

Dockerfile

Una vez escrito el complemento, debe crear un Dockerfile para crear un espejo. Dado que cada instrucción del Dockerfile creará una capa para el contenedor, hay un pequeño truco aquí: avanzar en la operación de pequeños cambios de la instalación dependiente de la instalación de npm y luego copiar los scripts de complementos que cambian con frecuencia. De esta forma, tendrá una ventaja cuando se empaque y se libere varias veces, y solo la parte cambiada se transmitirá más tarde, reduciendo el volumen de transmisión.


FROM mhart/alpine-node:8.9.3

WORKDIR /telegram-node
COPY package.json /telegram-node/package.json
RUN npm install

COPY index.js /telegram-node/index.js
ENTRYPOINT [ "node", "/telegram-node/index.js" ]

El último paso es compilar y publicar nuestro contenedor de ventana acoplable para la conveniencia de otros:


docker build lizheming/drone-telegram-node .
docker push lizheming/drone-telegram-node

4

prueba

Utilice el siguiente comando para iniciar el espejo localmente y probar si el complemento funciona:


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

problema

Adquisición de parámetros secretos

A menudo, algunos parámetros, como las claves, no quieren escribirse en el archivo de configuración .drone.yml y exponerse a todos los usuarios visibles para el proyecto. En este momento, usaremos secretos de drones para agregar variables. Para obtener más detalles, consulte mi artículo anterior "Cómo utilizar Drone".
https://imnerd.org/how-to-use-drone.html#Secrets

Cabe señalar aquí que el nombre de la variable definido por secretos es el nombre de la variable de entorno inyectada en el último dron, por lo que no se puede utilizar de forma arbitraria. Por ejemplo, su configuración es:


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

Finalmente, puede usar process.env.TELEGTAM_TOKEN dentro del complemento para obtener la variable clave correspondiente.

El complemento no tiene efecto

Un problema que encontré al escribir un complemento fue que mi Dockerfile inicial era el siguiente:


FROM mhart/alpine-node:8.9.3

WORKDIR /telegram-node
COPY package.json /telegram-node/package.json
RUN npm install

COPY index.js /telegram-node/index.js
ENTRYPOINT [ "node", "index.js" ]

Desde que configuré el directorio de trabajo WORKDIR, la ejecución normal de la ventana acoplable puede encontrar mi archivo de entrada como $ {WORKDIR} /index.js. Sin embargo, dado que el dron necesita acceder al código del proyecto al ejecutar el complemento, sobrescribirá la configuración de WORKDIR reflejada a través de comandos. Como resultado, mi complemento funciona bien, pero no se puede ejecutar incluso si se carga en el dron. Finalmente, lo revisé y descubrí que mi complemento no se ejecutó porque el archivo de entrada no se pudo encontrar después de que se reprodujo la configuración del directorio de trabajo.

6

posdata

Todo el código del complemento se ha publicado en Github: https://github.com/lizheming/drone-telegram-node

Mi primer complemento de Drone
La imagen espejo lizheming / drone-telegram-node
también se ha publicado en Docker Hub. La ventaja de este complemento sobre el complemento oficial es que puede establecer la dirección de la interfaz API de telegramas, que es más adecuada para servicios domésticos que utilizan métodos anti-generación. Si desea usar notificaciones de telegramas de drones en servidores domésticos, puede usarlo. Si no sabe cómo configurar la API de Telegram, también puede consultar mi artículo "Visite Telegram Against Generation".
https://imnerd.org/telegram-api-proxy.html

Supongo que te gusta

Origin blog.51cto.com/15127564/2667403
Recomendado
Clasificación