Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

armar un paquete .deb de quartz. #110

Open
edux opened this issue Dec 31, 2021 · 30 comments
Open

armar un paquete .deb de quartz. #110

edux opened this issue Dec 31, 2021 · 30 comments
Assignees

Comments

@edux
Copy link
Member

edux commented Dec 31, 2021

Tenemos este script en python https://github.com/sysarmy/disneyland/blob/master/quartz/quartz.py y lo que quisiera es tener un Makefile o similar que buildee un .deb que al instalarlo:

  • me instale las dependencias
  • me agregue un cronjob para correrlo cada 5 minutos

y que al desinstalar

  • remueva dependencias
  • remueva el cronjob
  • borre los files que haya creado.

Al ser python deberia poder correr en cualquier distro, sin embargo el target inicial es raspbian, o sea que cualquiera con una raspi tirada pueda bajar este paquete e instalarlo.

Nota: asi como esta ahora esto necesita unos parametros, api key, url, etc. eso lo voy a sacar en una proxima version para que sea instalar y que salga andando, pero mientras tanto podes usar este para armar le pipeline. Puntos extra si logras meterlo en github actions y que el paquete se suba al repo de github.

some links https://earthly.dev/blog/creating-and-hosting-your-own-deb-packages-and-apt-repo/

@Mr-Lettuce
Copy link
Contributor

Aqui estoy! que necesitas hacer?

@edux
Copy link
Member Author

edux commented Jan 4, 2022

@Mr-Lettuce ahi puse un update pegale una mirada a ver si se entiende.

@Mr-Lettuce
Copy link
Contributor

Hola Edu! Si perfecto, voy a chusmear algunas cosillas que me dan dudas y lo armo, no se bien como aun xD pero lo hago.

@edux
Copy link
Member Author

edux commented Jan 4, 2022

Investiga un poco y tira un plan aca y le hacemos review, asi lo vamos charlando, idealmente deberia ser algo entretenido y no un bodrio.

@Mr-Lettuce
Copy link
Contributor

Nono me parece genial! siempre tuve intriga de como funciona el makefile, no sabia que podia buildear un .deb, ya habia buscado quartz, dpk-deb y RIPE Atlas, pero bueno quiero ver si me sale bien y como hago para que al desinstalar no te lleve una dependencia que tal vez necesita otro programa en el sistema, aunque se supone que esta todo metido en el quartz, cuestion de probar y googlear un rato

@mabeett
Copy link

mabeett commented Jan 4, 2022

Hola chicos, espero que estén muy bien:
respecto de debianzar software Python una manera está indicada en Guide for Debian Maintainers, Apartado 8.4, de alguna manera pasa por pip. No tengo experiencia en eso, pero conozco de lo demás. Existe una guia de ubuntu bastante más sencilla que la de debian.

En caso de la solución tenga que pasar por lo que dpkg y apt pueden hacer enumero

  • instalar las dependencias: descripto e debian/control, Lo mastica dpkg, pero las dependecias en sí las fetchea apt-get/apt/aptitude.

  • agregar un cronjob para correrlo cada 5 minutos: es archivo en /etc/cron.d/, hay que estudiar si es el archivo en el rootdir del package o tiene que ser un script after/pre install. Creo que paquete cron es el que necesita el directorio /etc/cron.d. confirmar, será dependencia.

  • remover dependencias: es tarea de dpkg/apt: con apt autoremove foo, si se trajeron dependencias solo porque foo las pidió estas vuelan.

  • remover el cronjob: se va con el paquete.

  • borrar files que haya creado: en la declaración del paquete se separan los llamados configuration files, Si se desinstala el paquete con --purgue vuelan los confiles, de no ser así permanecen el sistema de archivos. Ejemplo ver sudo cat /var/lib/dpkg/info/${PAQUETE}.conffiles /

Estoy disponible en otros medios si les vengo bien,

@Mr-Lettuce
Copy link
Contributor

Hola Matias! espero te encuentres muy bien tu tambien.
Queria agraderte la informacion, me fue de mucha utilidad, actualmente sigo con un poquito de covid y se me dificulta mucho concentrarme, pero en breve retomo esto y subo el codigo para que lo revisen si es posible.
Saludos!

@Mr-Lettuce
Copy link
Contributor

Buenas gente! vengo con unos problemillas que quisiera ver de resolver de la mejor manera:
El paquete en ubuntu:latest funciona (o funcionaba antes de mucho manoseo), el tema es raspbian, que si no es de las ultimas versiones (que corresponden a debian 10/11) no tiene pre-compilado python >= 3.7, del cual depende icmplib, el cual requiere el script de python que se va a correr.
Por ende esta la opcion de automatizar la descarga del .tar.gz de python y compilarlo directamente, pero esto va a dejar residuos en algun lado seguro, y a su vez depende de varios paquetes mas.
Desconozco en que version de raspbian se va a instalar esto, que dicen ustedes?

Por otro lado el paquete instala el quartz.py como un binario mas en /usr/bin, crea el cronjob, ejecuta un postinst que setea el path de java, instala dependencias de python con pip3 y edita el archivo de configuracion del "quartz" ingresando los valores directamente en la terminal cosa de no tener que ir a editarlo despues, y el postrm borra ese archivo/directorio de configuracion y chequea que haya volado el cronjob tambien porlas

Cuando este todo impecable y funcionando lo implemento con github actions que ya lo estuve chusmeando

@edux
Copy link
Member Author

edux commented Jan 17, 2022

no trae 3.7 no recuerdo como lo instale en mi raspi, pero tengo esto:

ii python3.7 3.7.3-2+deb10u3 armhf Interactive high-level object-oriented language (version 3.7) ii python3.7-dev 3.7.3-2+deb10u3 armhf Header files and a static library for Python (v3.7) ii python3.7-minimal 3.7.3-2+deb10u3 armhf Minimal subset of the Python language (version 3.7) ii python3.7-venv 3.7.3-2+deb10u3 armhf Interactive high-level object-oriented language (pyvenv binary, version 3.7)

Tenes algo para probar? quizas es mas facil si podemos probar algo y ahi vemos.

@Mr-Lettuce
Copy link
Contributor

Buenas Edu!
Bueno, creo que me mande alguna con el pull request y lo volvi a abrir -_-
Al final no paraba de dar error el icmplib aun con python 3.7, asiq lo inclui directamente dentro del .deb y tuve que cambiar un par de cosas mas, en teoria deberia instalarse bien, cualquier cosa avisame que falla y lo sigo tocando, lo probe en raspbian 10 pero sin los datos no puedo verificar el script a ver si necesita instalar algo mas.

@edux
Copy link
Member Author

edux commented Jan 22, 2022

Lo quise probar pero me esta pidiendo java como requirement:

pi@pi-72-df:~/tmp/disneyland/quartz $ sudo dpkg -i quartz_0.1_all.deb
Selecting previously unselected package quartz.
(Reading database ... 111965 files and directories currently installed.)
Preparing to unpack quartz_0.1_all.deb ...
Unpacking quartz (0.1) ...
dpkg: dependency problems prevent configuration of quartz:
quartz depends on java8-runtime; however:
Package java8-runtime is not installed.

dpkg: error processing package quartz (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
quartz

Tenes los building steps para empaquetar esto? tipo makefile o como lo hayas armado?

@edux
Copy link
Member Author

edux commented Jan 22, 2022

lo otro que me olvide de decir es que sino existe icmplib le va a tirar ping normal asi que si es un bardo hacer la dependencia vayamos sin eso que va a andar igual.

@mabeett
Copy link

mabeett commented Jan 22, 2022

Buenas,
sobre python3.7 en rpi:

pi@raspberrypi:~ $ apt-cache madison python3.7
 python3.7 | 3.7.3-2+deb10u3 | http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages

sobre OS en que estoy viendo esto:

pi@raspberrypi:~ $ lsb_release -a 
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster

sobre el hardware:

pi@raspberrypi:~ $ cat /proc/cpuinfo | tail -n 14
processor	: 3
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 126.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

Hardware	: BCM2711
Revision	: c03111
Serial		: 10000000c38xxxxx (redacted)
Model		: Raspberry Pi 4 Model B Rev 1.1

El resto no entiendo bien. Mañana releo si me hago el tiempo y aporto de poder hacerlo.

@edux
Copy link
Member Author

edux commented Jan 22, 2022

claro pero como estas armando el .deb, esos comandos o secuencia de pasos son las que te consulto si podemos mirar. sin apuro.

@Mr-Lettuce
Copy link
Contributor

Ahhh pero que salaaamee, cuando me dijiste de armar un paquete de quartz pense que iba a ser el quartz scheduler y tenia java como requerimiento, de ahi quedo -_- eso va a volar
El icmplib me lo pedia creo que el kdevelop cuando quise correr el script para ver justamente que requerimientos de python necesitaba
Sry tantos errores jajaja a la noche cambio esas cosas y lo actualizo, el .deb lo estoy armando a mano y despues con el dpkg --build, mire como hacer el makerfile pero estoy muuy verde todavia para usarlo la verdad

@Nachichuri
Copy link
Member

Buenas! Cómo va? Avisá si te puedo dar una mano @Mr-Lettuce! :)

@Mr-Lettuce
Copy link
Contributor

Hola Emilio! Todo bien?
Colgue, pero faltaria ver que tal fue la prueba de la 2da version donde corregi las dependencias (saque java y icmplib) pero al margen te consulto: el script de postrm no elimina archivos de config ya que los instala como root, entonces tira error cuando lo corre, tenes idea si se puede resolver eso de alguna forma?

@Nachichuri
Copy link
Member

Querés pegar info del error acá?? O también pushear el código con el que estás buildeando el deb también, así vemos cómo lo hace :)

@Mr-Lettuce
Copy link
Contributor

Ahi lo subi aca:
https://github.com/Mr-Lettuce/disneyland/tree/master/quartz/quartz_0.2_all

Pero ya no me da el error, supongo que tendria algo mal codeado
Asi como esta lo que hace es meter el .py en /usr/bin, crea el cronjob, pregunta para configurar los parametros de quartz e instala las dependencias de python que me pedia para correr el script aunque nunca lo pude correr por los parametros justamente, hay lineas de codigo anuladas porque me quedo en la cabeza que era el quartz scheduler en un principio y requeria java, por lo que vas a ver cosas que nada que ver jajaja

@Nachichuri
Copy link
Member

Buenas @Mr-Lettuce! Todo bien?

Ahí pude probarlo en mi raspi, te cuento cómo me fue. No pude instalar el .deb, lo tuve que volver a compilar, pero sacando eso todo bien:

pi@raspberrypi:~/HDD/disneyland/quartz $ sudo chmod 0555 quartz_0.2_all/DEBIAN/postinst
pi@raspberrypi:~/HDD/disneyland/quartz $ sudo chmod 0555 quartz_0.2_all/DEBIAN/postrm
pi@raspberrypi:~/HDD/disneyland/quartz $ dpkg-deb --build quartz_0.2_all
dpkg-deb: building package 'quartz' in 'quartz_0.2_all.deb'.
pi@raspberrypi:~/HDD/disneyland/quartz $ sudo dpkg -i quartz_0.2_all.deb 
Selecting previously unselected package quartz.
(Reading database ... 55856 files and directories currently installed.)
Preparing to unpack quartz_0.2_all.deb ...
Unpacking quartz (0.1) ...
Setting up quartz (0.1) ...
Setting up quartz (0.1) ...
 Configurar los parametros de Quartz?
y
escribe Si o No por favor
si
Configurando Ripe Atlas
Ingresar la URL: localhost 
Ingresa el ISP: Telecentro
Ingresa la API KEY: nOlAtEnGo:c
 Instalando dependencias de Python
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting logging42
  Downloading https://www.piwheels.org/simple/logging42/logging42-0.0.7-py3-none-any.whl (5.4 kB)
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (2.25.1)
Collecting configparser
  Downloading https://www.piwheels.org/simple/configparser/configparser-5.2.0-py3-none-any.whl (19 kB)
Collecting argparse
  Downloading https://www.piwheels.org/simple/argparse/argparse-1.4.0-py2.py3-none-any.whl (23 kB)
Collecting loguru
  Downloading https://www.piwheels.org/simple/loguru/loguru-0.6.0-py3-none-any.whl (65 kB)
     |████████████████████████████████| 65 kB 135 kB/s 
Installing collected packages: loguru, logging42, configparser, argparse
Successfully installed argparse-1.4.0 configparser-5.2.0 logging42-0.0.7 loguru-0.6.0
 Todo listo, ponele

En mi caso tenía las dependencias instaladas así que no tuve errores, entiendo que si faltan, con dpkg saltan los dependency problems, pero nada que un apt-get --fix-broken install no pueda arreglar.

Pude ver que se copiaron bien los archivos:

pi@raspberrypi:~/HDD/disneyland/quartz $ ls -alh /etc/cron.d | grep quartz
-rw-r--r--  1 root root   46 Feb 15 18:43 quartz
pi@raspberrypi:~/HDD/disneyland/quartz $ ls -alh /usr/bin | grep quartz
-rw-r--r--  1 root root    6.1K Feb 15 18:43 quartz01.py

Pero no se creó el quartz.conf:

pi@raspberrypi:~/HDD/disneyland/quartz $ cat ~/.config/quartz.conf
cat: /home/pi/.config/quartz.conf: No such file or directory

Mi sospecha es porque la función setquartzdata está haciendo:

# [...]
mkdir ~/.config/ && cat << EOF > ~/.config/quartz.conf
[quartz]
api_key = $ripekey
url = $ripeurl
isp = $ripeisp
EOF
# [...]

Y en mi caso el directorio ~/.config/ ya estaba creado, entiendo que por eso no se ejecutó el resto... El tema es que como en el postrm haces un rm ~/.config/quartz.conf está fallando también al momento de desinstalar:

pi@raspberrypi:~/HDD/disneyland/quartz $ sudo apt-get remove quartz 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  quartz
0 upgraded, 0 newly installed, 1 to remove and 34 not upgraded.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
(Reading database ... 55858 files and directories currently installed.)
Removing quartz (0.1) ...
dpkg: error processing package quartz (--remove):
 installed quartz package post-removal script subprocess returned error exit status 1
dpkg: too many errors, stopping
Errors were encountered while processing:
 quartz
Processing was halted because there were too many errors.
needrestart is being skipped since dpkg has failed
E: Sub-process /usr/bin/dpkg returned an error code (1)

Y este mismo error se ocurre aunque le mande con purge.

Espero que esta info te sirva cuando lo puedas retomar, si querés una mano para resolverlo avisame y te mando una PR a tu fork :)

Saludos!


OS:

pi@raspberrypi:~/HDD/disneyland/quartz $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

@Mr-Lettuce
Copy link
Contributor

Hola Emilio!!
Antes que nada muchas gracias por la data! si que me sirve, no se bien porque lo tuviste que volver a compilar, capaz hubo algun drama cuando lo empaqueto la vm en mi pc o algo asi (idk)

Con respecto al script que arma la conf lo arme asi porque cuando lo instalas lo corre como sudo, entonces el .conf esta en el home de root, y cuando corre el cronjob tambien lo corre como root, se puede cambiar igualmente si no es la idea, no le quise cambiar nada al script de python original la verdad
Y justamente creo que el problema del postrm es que intenta borrar el .conf de root, sin embargo la ultima vez que lo probe aca lo corrio sin problemas, pero todas las veces anteriores me hacia exactamente lo mismo que te hizo a vos por lo que puedo ver. Al mkdir de la carpeta de config le voy a agregar un if para que no la intente crear si ya existe, pero no veo el error en los mensajes, por lo que seguramente te creo la carpeta en /root pero no la borro el postrm (sorry jajaja)

@Nachichuri
Copy link
Member

Joya! Con eso solucionado entiendo que cumpliría con lo que se había planteado en el issue (sacando la instalación de dependencias)

Dos comentarios nada más, en la instalación cuando le pedís input al usuario quizás quedaría más amigable agregarle algo como ...parametros de Quartz? [s/N] con las opciones esperadas, como hace apt por ejemplo. Y también fijate que en DEBIAN/control quedó desactualizada la versión :)

Si precisás que pruebe una próxima versión pingueame! Saludos

@Mr-Lettuce
Copy link
Contributor

Dale buenisimo! Sisi ese script lo voy a limpiar y ponerlo un poco mas serio, lo del control se me paso, gracias por el aviso jajaja

Bueno genial, muchas gracias por la mano!! Saludos!

@edux
Copy link
Member Author

edux commented Feb 22, 2022

Migre el codigo a un repo separado https://github.com/sysarmy/quartz/ y le prendi el build del container que lo buildea y lo mete en el registry de github @Nachichuri cuando tengas un rato mirate https://github.com/sysarmy/quartz/pkgs/container/quartz

@edux
Copy link
Member Author

edux commented Feb 22, 2022

Para el paquete, estaba mirando esto https://github.com/marketplace/actions/build-linux-packages hay que laburarlo un poco mas para pushearlo al package manager de github pero quizas tiene sentido, asi queda automagico.

@Mr-Lettuce
Copy link
Contributor

Buenas gente! consulta, estoy intentando buildear el paquete con github actions, el del comentario de arriba justamente, me tira error de que no encuenta el archivo de las spec, y hata mire el repo del autor y no encuentro donde deberia ir el archivo, la consulta es: cuando un workflow de estos necesita usar archivos, deberia buscarlos en la raiz del repo? intente meterlo en una carpeta, en la raiz, en la propia carpeta de los workflow y nada, y tampoco encuentro nada util en google -_-

@Nachichuri
Copy link
Member

Hola Mr-Lettuce!

Ahí estuve mirando un poco el action en tu fork y veo que adentro tiene el contenido del package.yaml, pero entiendo el action tendría que tener lo que detalla en la parte de "usage" la documentación (no lo pude probar, pero sospecho que puede venir por ahí el error).

Quizás tomando como template el uso de la documentación y apuntando al YAML que ya tenés creado en el repo puede andar.

Si podés fijate si puede ser eso y cualquier cosa despues lo miramos n_n

@Mr-Lettuce
Copy link
Contributor

Hola Emilio!

Claro claro, el tema es que la doc apunta a ese archivo, y ese archivo tiene la spec del paquete en si, y lo tengo hecho pero cuando corre me dice que no encuentra ese package.yaml justamente y no entiendo el porque.
Probe de dejarlo en la raiz del repo, en una carpeta, en la propia carpeta de los workflow (por las dudas), probe con otro nombre de archivo, nada.
Estuve horas intentado y no lo pude sacar, y como es la primera vez que uso asi github pregunte porque capaz es algo re simple pero no lo se.
Y gracias por la mano como siempre!!

@Nachichuri
Copy link
Member

Hola Mr-Lettuce!

Okey, otra cosa que se me ocurre es que pueda faltar el checkout del repo entonces el action no tiene nunca el archivo de package.yaml...

Yo probaría agregando el action de checkout antes del step de build, algo así:

[...]
steps:
  - name: Checkout repository
    uses: actions/checkout@v2
  - uses: kentik/[email protected]
[...]

Entiendo que también faltaría un step extra de publish del .deb una vez que buildea.

Cualquier cosa avisame y lo vemos

@Mr-Lettuce
Copy link
Contributor

Hola Nachichuri!

Sabiaa que era una bol.... igual ahi creo que entendi mejor como es que funciona github actions al menos...

Estuve buscando lo del publish pero no encuentro como hacerlo con un .deb, puede ser? veo que se puede hacer con npm, gem, mvn, gradle, .net y docker

Igual voy a seguir buscando a ver como se puede lograr o de ultima ver que lo comitee directo al repo cada vez que buildee y listo (imagino que se puede hacer eso)

Gracias por la mano!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants