Skip to content

Acelera las ejecuciones en CI #2702

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

Merged
merged 10 commits into from
Nov 6, 2023
Merged

Acelera las ejecuciones en CI #2702

merged 10 commits into from
Nov 6, 2023

Conversation

rtobar
Copy link
Collaborator

@rtobar rtobar commented Oct 20, 2023

Este PR modifica el job Test del workflow Test (i.e., el pipeline que se corre en cada PR y push a 3.12) con los siguientes cambios:

  • Checkout del submodule cpython se hace como parte de actions/checkout (no hay beneficio en hacerlo por cuentra propia)
  • Re-agrupa y comenta los distintos pasos del workflow
  • Configure apt and dpkg para correr de manera más eficiente, evitando la ejecución de algunos triggers que son innecesarios y que consumen CPU.
  • Instala locales-all para evitar la generación de los locales en español, ya que esta generación consume un largo tiempo de CPU, mientras que bajar el paquete es mucho más rápido. También se evita correr apt update.
  • Por último, y lo más complejo: cuando el workflow corre como parte de un PR, se calculan los archivos .po que han cambiado dentro del PR, y se corren los chequeos (sphinx-lint, powrap, pospell) sólo sobre estos archivos. Si el workflow corre como parte de un push a 3.12 todos los archivos se chequean.

@cmaureir
Copy link
Collaborator

Ah, entonces instalamos las cosas a nivel de configuración de la máquina, pero no cuando la comenzamos ¿verdad?

@rtobar
Copy link
Collaborator Author

rtobar commented Oct 23, 2023

Ah, entonces instalamos las cosas a nivel de configuración de la máquina, pero no cuando la comenzamos ¿verdad?

Eso pensaba hacer, pero la verdad es que no es tan simple. La único opción de tener un sistema pre-configurado es usar imágenes Docker y correr todo dentro de un container en vez de directo en "ubuntu-22.04" (aunque probablemente ese ya sea un container...), y aún no he explorado esa opción. Lo que si probé acá, y que parece dsr algo de mejoría, es configurar apt y dpkg para saltarse algunos pasos (e.g., no generar páginas de.manual, no usar fsync, etc). Pero lejos el paso de setup que de demora más es la generación de los locales en español. Me gustaría explorar el tratar de cachear eso de alguna forma, actualmente ese paso demora cerca de un minuto.

@rtobar rtobar closed this Oct 23, 2023
@rtobar rtobar reopened this Oct 23, 2023
@rtobar
Copy link
Collaborator Author

rtobar commented Oct 23, 2023

Ooops, botón equivocado...

La verdad es que tampoco he tenido mucho tiempo de hacer nada muy serio que requiera sentarse en un computador (he estado desde el celular todos estos días), pero cuando encuentre un tiempito me gustaría dedicarle una horita a seguir explorando estás posibilidades

@rtobar rtobar force-pushed the faster-ci branch 6 times, most recently from 6db80ea to ea578de Compare November 1, 2023 02:38
rtobar and others added 2 commits November 1, 2023 10:41
Hacerlo por nuestra cuenta no trae ningún beneficio, ya que
actions/checkout ya usa --depth=1 (además de otras opciones).
Esto nos permitirá ver mejor en qué pasó en particular nos estamos
demorando más.
@rtobar rtobar force-pushed the faster-ci branch 5 times, most recently from 38985b3 to b2f46b8 Compare November 1, 2023 03:44
rtobar and others added 6 commits November 1, 2023 15:34
Todos los pasos estaban antes aglomerados. Ya que queremos agregar más
pasos, es beneficioso agrupar los pasos existentes para clarificar qué
lógica se está llevando a cabo.

Signed-off-by: Rodrigo Tobar <rtobar@icrar.org>
Esto se logra deshabilitando algunos triggers (nostros nos encargamos de
postgresql-common) y corriendo con ciertas opciones, como deshabilitando
fsyncs
Para los paquetes que usamos no es necesario realizar esta operación,
con lo cual nos ahorramos un poco de tiempo.
Al instalar locales-all se evita la generación de los locales en español
al momento de instalar language-pack-es. Esta generación de locales toma
un tiempo considerable de CPU, por lo que instalar locales-all es
finalmente menos costoso.
El job Test del workflow Test corre durante pull requests y durante
pushes al branch principal del repositorio. En el primer caso, los PRs
contienen normalmente un solo archivo .po que ha cambido, pero aún así
los chequeos que se corren en CI se hacen contra todos los archivos .po,
lo cual es ineficiente. En particular, pospell toma alrededor de un
minuto y medio en correr, cuando tomaría alrededor de un segundo en
correr sobre un solo archivo.

Este commit introduce una serie de pasos en el job Test que calcula la
lista de archivos .po sobre los cuales se correrán el resto de los
chequeos. Cuando el trabajo corre como parte de un PR, sólo los archivos
.po que han cambiado en el PR (si es que los hay) son incluidos. Cuando
el trabajo corre como parte de un push a la rama principal del
repositorio, todos los archivos son incluidos.

Signed-off-by: Rodrigo Tobar <rtobar@icrar.org>
Mírese el commit anterior para más detalles.

Signed-off-by: Rodrigo Tobar <rtobar@icrar.org>
@rtobar rtobar marked this pull request as ready for review November 1, 2023 08:13
@rtobar rtobar changed the title Explorando speedups en CI Acelera las corridas en CI Nov 1, 2023
@rtobar rtobar requested a review from cmaureir November 1, 2023 08:19
@mmmarcos
Copy link
Collaborator

mmmarcos commented Nov 1, 2023

No conocía esos actions para optimizar el uso de ubuntu-latest, me parece muy bien 🔥

Lo único que no estoy seguro es la parte de détección de archivos po modificados. Me parece que eso es algo que puede ser útil tener localmente y sería mejor integrarlo en los scripts. Por ejemplo, powrap ya tiene una opción --modified para correr sólo sobre los arcihvos modificados. De la misma forma podríamos tener algo así en el check_spell.py.
De hecho creo que esto es exactamente lo que hace pre-commit: corre localmente y ejecuta los checks sólo sobre los archivos modificados.

@rtobar
Copy link
Collaborator Author

rtobar commented Nov 1, 2023

@mmmarcos gracias por los comentarios!

Respecto a tener una lógica común que se puede reusar en todos los scripts: ésto no es tan fácil, porque lo que se busca tener es una lista de los archivos que han sido modificados en el PR con respecto a la rama base. Esa información es posbile obtenerla sólo si estás al tanto de la existencia del PR en primer lugar, por lo que no sería algo que se podría hacer de manera local (de forma fácil... con suficiente complejidad sí se puede armar algo así teoréticamente).

Por ejemplo, powrap ya tiene una opción --modified para correr sólo sobre los arcihvos modificados

Efectivamente, pero esa opción corre sólo sobre los archivos modificados localmente: https://github.com/AFPy/powrap/blob/03a472d4823a9d68af68c4575a93c572c4152165/powrap/powrap.py#L159. Esto es diferente a lo que se necesita para evaluar PRs, donde queremos la lista de archivos que se ha modificado en el PR respecto a la rama base.

[...] De hecho creo que esto es exactamente lo que hace pre-commit: corre localmente y ejecuta los checks sólo sobre los archivos modificados.

Si mal no entiendo, pre-commit por defecto detecta los archivos que están incluidos en el commit que se está creando en ese momento, y todos los hooks se corren sobre ellos, si corresponde. Así que, de nuevo, es una semántica diferente a la que se necesita para los PRs.

@mmmarcos
Copy link
Collaborator

mmmarcos commented Nov 1, 2023

Gracias por la explicación @rtobar ahora veo mejor la diferencia :)

Tenés una idea de cuanto tiempo se puede ganar? O hay que mergear la PR primero para ver?
Igual, me parece bien de mergear 👍

@cmaureir cmaureir changed the title Acelera las corridas en CI Acelera las ejecuciones en CI Nov 1, 2023
@rtobar
Copy link
Collaborator Author

rtobar commented Nov 1, 2023

Tenés una idea de cuanto tiempo se puede ganar?

Con estos cambios estamos cortando al menos unos dos minutos de ejecución, que de dividen más o menos en 1.5 minutos de pospell que ahora son alrededor de un segundo más/menos, y otro minuto en tiempo de instalación de paquetes de sistema.

Co-authored-by: Cristián Maureira-Fredes <cmaureir@users.noreply.github.com>
@rtobar
Copy link
Collaborator Author

rtobar commented Nov 6, 2023

@cmaureir si estás feliz con los cambios podrías aprobar y mergear? Gracias! Serio bueno empezar a ver estos cambios andando en el resto de los PRs.

Copy link
Collaborator

@cmaureir cmaureir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Muchas gracias por la investigación y trabajo

@cmaureir cmaureir merged commit 811360b into 3.12 Nov 6, 2023
@rtobar rtobar deleted the faster-ci branch November 3, 2024 12:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants