Regresión superficial de git fetch en discourse_docker

Hola,

Un commit reciente en docker_discourse rompe la capacidad de especificar una etiqueta (por ejemplo, v2.6.0) en el valor version: de app.yml. Esto es útil para instalar versiones anteriores de Discourse con fines de prueba.

El problema se manifiesta de la siguiente manera al especificar version: v2.6.0 al utilizar e2eb085714dfcf2aa0117b0f2fdf39b762b0e18d:

I, [2020-12-05T10:59:38.848743 #1]  INFO -- : > cd /var/www/discourse && git remote set-branches origin v2.6.0
I, [2020-12-05T10:59:38.852600 #1]  INFO -- : 
I, [2020-12-05T10:59:38.852639 #1]  INFO -- : > cd /var/www/discourse && git fetch --depth 1 origin v2.6.0
From https://github.com/discourse/discourse
 * tag                 v2.6.0     -> FETCH_HEAD
I, [2020-12-05T10:59:41.405163 #1]  INFO -- : 
I, [2020-12-05T10:59:41.405307 #1]  INFO -- : > cd /var/www/discourse && git checkout v2.6.0
error: pathspec 'v2.6.0' did not match any file(s) known to git
I, [2020-12-05T10:59:41.411796 #1]  INFO -- : 

En lugar de la salida esperada al utilizar el commit anterior a ese:

I, [2020-12-05T11:22:14.717910 #1]  INFO -- : > cd /var/www/discourse && git fetch origin v2.6.0
From https://github.com/discourse/discourse
 * tag                     v2.6.0     -> FETCH_HEAD
I, [2020-12-05T11:22:15.672616 #1]  INFO -- : 
I, [2020-12-05T11:22:15.672683 #1]  INFO -- : > cd /var/www/discourse && git checkout v2.6.0
Note: checking out 'v2.6.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at d6121249d3 Version bump to v2.6.0
7 Me gusta

No lo llamaría un bug en sí mismo, pero queremos ofrecer alguna especie de instrucciones sobre cómo instalar versiones antiguas de Discourse, incluso si eso implica una plantilla más complicada o algo similar.

@Falco está investigando.

7 Me gusta

Estoy de acuerdo en que la profundidad debería ser configurable, quizás mediante una variable de entorno, con un valor predeterminado de “shallow”; pero que sea configurable con una simple variable de entorno.

1 me gusta

Creo que el problema aquí es que las etiquetas no se conocen localmente al realizar el checkout, como en el siguiente problema (no relacionado con Discourse):

Ejecutar git fetch --all debería resolver el problema, pero no sé cuánto podría aumentar el tamaño de la imagen (a menos que otra instrucción elimine las referencias no utilizadas más adelante).

Dicho esto, creo que git clone --depth 1 https://github.com/discourse/discourse.git --branch=$version lo solucionaría, ya que la opción --branch permite tanto ramas como etiquetas, pero no lo he probado y no sé si hay alguna razón para que el clone utilice (actualmente) la rama master.

Al ejecutar git clone --depth 1 https://github.com/discourse/discourse.git --branch=v2.6.0, el tamaño total de la carpeta es de 212MB, y la carpeta .git dentro tiene 46MB, así que creo que está bien.

Eso duplica el tamaño del repositorio :slightly_frowning_face:

El problema es que, en el momento de la construcción de la imagen, no sé qué rama querrás en el futuro.

La configuración actual se modificó para reducir el tamaño de la imagen, logrando una reducción del 25 % en su tamaño comprimido (250 MB), lo cual es una gran ventaja. Funciona correctamente cuando se utilizan ramas normales como stable y beta o tests-passed.

Como solución alternativa, si deseas cambiar a una etiqueta, puedes aplicar esto a tu archivo app.yml:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
+    - exec:
+        cd: $home
+        cmd:
+          - git fetch --depth=1 origin tag v2.5.0 --no-tags
+          - git checkout v2.5.0

Otra solución alternativa consiste en agregar una clave base_image en el nivel superior de app.yml con el valor de una imagen base más antigua. Dado que ni siquiera intentamos mantener la compatibilidad de las nuevas imágenes para ejecutar versiones antiguas de Discourse, esto puede ser necesario si retrocedes lo suficiente en el tiempo.

9 Me gusta

Tienes razón, en ese momento no conocemos la versión; parece que la imagen base utiliza la versión actual más la rama tests-passed, aunque la rama tendrá el commit correspondiente al momento en que se construyó la imagen.

¿No tendría el método actual reconstrucciones más lentas, incluso cuando se usa la rama tests-passed?

Simplemente considera las siguientes instrucciones:

En la imagen base:

git clone --depth 1 https://github.com/discourse/discourse.git
cd discourse/
git remote set-branches --add origin tests-passed

En web.template.yml

git reset --hard
git clean -f
git remote set-branches --add origin master
git pull
...
Cuando se ejecuta `git pull`, **se descarga todo el repositorio**, lo que puede tardar varios minutos, ya que antes solo se hizo un clonado superficial. Puedes probar ejecutando solo las instrucciones anteriores localmente y verás. No digo que sea mejor tener todo el repositorio en la imagen base, pero el código en `web.template.yml` se ejecutará en cada reconstrucción, incluso si solo se agregó un plugin o se cambió una configuración en `app.yml`. Lo que normalmente hago en mis proyectos (que no son de Discourse) es crear una nueva imagen para cada nueva versión, pero eso puede no ser viable para ti (considerando cómo lo haces actualmente). ¿No has notado algún aumento en el tiempo de reconstrucción? (o quizás no es tan significativo en comparación con el tiempo total de reconstrucción en la mayoría de los casos)

Actualización

Volví a probar los pasos anteriores y fueron rápidos. Supongo que en el primer intento ejecuté otra instrucción que modificó el árbol de git y, al final, intenté descargar todo cuando ejecuté git pull.

2 Me gusta

¿Estás seguro de eso?

➜  discoursesmall git:(6a42acbf) docker run --rm -it discourse/base:2.0.20201125-2246
root@b481d11669ba:/# cd /var/www/discourse/
root@b481d11669ba:/var/www/discourse# du -sh .                                                     
774M    . 
root@b481d11669ba:/var/www/discourse# git pull
...
root@b481d11669ba:/var/www/discourse# du -sh .                                                                
778M    . 
5 Me gusta

@lucasbasquerotto tienes razón al señalar que el git pull no es estrictamente necesario; de hecho, lo hemos eliminado aquí

Esto debería permitir que otras ramas (o forks) funcionen de manera más armoniosa con discourse_docker de ahora en adelante :slight_smile:

5 Me gusta

Sí, veo que realiza un fetch y luego un checkout en la rama correcta después del pull, así que creo que el git pull no es necesario (aunque no lo he probado).

En cuanto a las etiquetas, parece que aún necesito obtenerlas por separado, pero parece viable. Además, las ramas se utilizan con más frecuencia, por lo que las etiquetas deberían ser más bien un caso excepcional.

1 me gusta

¿Es seguro asumir que la opción de versión en el archivo de configuración standalone.yml no tiene efecto?

Aún tiene un efecto, pero ahora solo se puede establecer en ramas.

3 Me gusta

Estoy obteniendo el mismo error. Estaba usando la versión 2.5.1.

Al hacer esto, obtengo el siguiente error:

I, [2020-12-31T11:50:24.701475 #1]  INFO -- : > cd /var/www/discourse && find /var/www/discourse ! -user discourse -exec chown discourse {} \+
chown: no se puede hacer referencia a '/var/www/discourse/public/plugins/styleguide': No existe el archivo o el directorio

La reconstrucción no funcionará. ¿Alguna ayuda?

Intenta agregar la clave mencionada y usar una imagen más antigua de discourse/base - Docker Image

2 Me gusta

Esto no funciona porque ocurre después del código que falla porque no puede recuperar la versión. Lo que sí funcionó fue crear un archivo version.template.yml junto a web.template.yml con el siguiente contenido:

params:
  home: /var/www/discourse

run:
  - exec:
      cd: $home
      hook: code
      cmd:
        - git fetch --tags

Y luego incluir este archivo en containers/app.yml, antes de web.template.yml, de la siguiente manera:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/version.template.yml"
  - "templates/web.template.yml"

Para que eso funcione, no debes usar la clave de nivel superior version en tu archivo app.yml, solo ese nuevo código. Al hacerlo, no falla.

3 Me gusta

Gracias por aclararlo: esa es exactamente la parte que me faltaba. Para quienes estén confundidos de la misma manera que yo, obtener una etiqueta de lanzamiento de Discourse se puede hacer de la siguiente manera:

  • Asegurarse de que el parámetro version no esté establecido en app.yml, por ejemplo:
    params:
      db_default_text_search_config: "pg_catalog.english"
      #  version: stable
    
  • Agregar código para verificar la versión deseada hacia el final de app.yml, por ejemplo:
    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - git clone https://github.com/discourse/docker_manager.git
    +    - exec:
    +        cd: $home
    +        cmd:
    +          - git fetch --depth=1 origin tag v2.5.0 --no-tags
    +          - git checkout v2.5.0
    

Al ejecutar ./launcher rebuild app, esto es lo que sucede:

  • Se verifica la versión predeterminada (es decir, la rama test_passed).
  • Se obtiene y verifica la etiqueta v2.5.0, reemplazando efectivamente la versión anterior.
1 me gusta

This topic was automatically closed 0 minutes after the last reply. New replies are no longer allowed.