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

Nouveau processus de publication #5306

Merged
merged 10 commits into from
May 31, 2019

Conversation

artragis
Copy link
Member

@artragis artragis commented Apr 11, 2019

Contexte

le watchdog actuel pose plusieurs problèmes

  • watchdog n'est pas compatible avec python 3.7
  • il plante de manière incontrôlée
  • il n'est pas parallélisable : si un billet est publié pendant qu'il en exporte un autre ça marche pas
  • il ne permet pas de bien analyser les problèmes de publication
  • il complexifie un module qui a déjà sa dose de complexité :)
  • il a été codé en python 2.7 ce qui ne tient pas compte de pas mal d'amélioration des modules de concurrence qu'on a dans la 3.5

Solution proposée

  • on passe par la publication d'un "event" qui est une entité SQL
  • une boucle infinie vient s'assurer qu'un event a été posté, et le prend en charge
  • le tout est parallélisé grâce aux modules ajoutés à python 3.5
  • comme on a une entité SQL on peut avoir un résumé de ce qui ne marche pas depuis l'interface d'admin
  • on peut lancer des exports depuis l'interface web sans que ça ne bloque d'autres choses
  • ça facilitera l'intégration d'une fonctionnalité d'export pdf/epub pour la beta

État d'avancement

  • refaire le watchdog
  • mettre un bouton "re générer les exports" dans l'interface web, accessible aux auteurs et aux modo

pour la QA

  • ne pas oublier de faire un python manage.py migrate
  • lancer le service de publication `python manage.py publication_watchdog
  • lancer le site
  • faite trois tutos (mini, moyen, big), publiez-les
  • les exports sont bien réalisés (attention pour le pdf vous avez besoin de latex)
  • supprimez les exports
  • allez sur les tutos, cliquez sur "générer les exports"
  • vérifier que les exports sont bien générés.

@artragis artragis added C-Back Concerne le back-end Django S-Refactorisation Améliore le code existant sans forcément ajouter de nouvelle fonctionnalité labels Apr 11, 2019
@coveralls
Copy link

Coverage Status

Coverage decreased (-9.2%) to 65.105% when pulling 88c99fc on artragis:change_publication_service into 5f68e0e on zestedesavoir:dev.

1 similar comment
@coveralls
Copy link

Coverage Status

Coverage decreased (-9.2%) to 65.105% when pulling 88c99fc on artragis:change_publication_service into 5f68e0e on zestedesavoir:dev.

@coveralls
Copy link

coveralls commented Apr 11, 2019

Coverage Status

Coverage decreased (-15.2%) to 73.962% when pulling f1603ff on artragis:change_publication_service into 9577d8e on zestedesavoir:dev.

@artragis artragis changed the title [WIP]Nouveau processus de publication Nouveau processus de publication Apr 15, 2019
zds/tutorialv2/models/database.py Show resolved Hide resolved
zds/tutorialv2/models/database.py Outdated Show resolved Hide resolved
@artragis artragis added this to in review in Objectif v28.2 Apr 17, 2019
@gustavi
Copy link
Contributor

gustavi commented Apr 24, 2019

QA possible ici ?

@artragis
Copy link
Member Author

tout à fait ça serait cool d'ailleurs.

@gustavi
Copy link
Contributor

gustavi commented Apr 24, 2019

Quelques instructions pour que je teste ça ? Des cas spéciaux à prendre en compte ?

@artragis
Copy link
Member Author

Je fais le descriptif QA ce soir.

@artragis
Copy link
Member Author

C'est fait.

@gustavi
Copy link
Contributor

gustavi commented Apr 25, 2019

J'ai pas LaTeX sur ma machine actuelle (et je ne peux pas l'installer en l'état), je QA ça ce week-end (sauf si quelqu'un veut s'en charger avant).

@artragis
Copy link
Member Author

artragis commented May 1, 2019

du coup on en est où? si tu n'as pas latex c'est pas grave, au pire tu pourras tester que le publication event se met bien en ERROR

@gustavi
Copy link
Contributor

gustavi commented May 2, 2019

Je testerai demain sans LaTeX dans ce cas.

@artragis
Copy link
Member Author

On en est où?

@artragis
Copy link
Member Author

On en est où @gustavi ?

@artragis
Copy link
Member Author

on en est où ici?

@Situphen
Copy link
Member

Personnellement je suis en semaine d'examens donc je ne peux pas m'en occuper avant ce weekend.

@Situphen
Copy link
Member

Ça ne fonctionne pas si le fichier {contenu}.md est supprimé dans le dossier {contenu]__building, la tâche @PublicatorRegistry.register('md') échoue. Je n'ai pas gardé les logs mais je devrais faire de nouveaux essais dans les jours qui viennent !

@artragis
Copy link
Member Author

Ça ne fonctionne pas si le fichier {contenu}.md est supprimé dans le dossier {contenu]__building, la tâche @PublicatorRegistry.register('md') échoue.

tu es sûr que c'est bien la tâche de publication du md qui échoue? parce que bon, y'a pas trop de raison.

Par contre si tu supprimes cette publication ce sont les exports latex et pdf qui ne fonctionnent plus

@Situphen Situphen self-assigned this May 27, 2019
@Situphen
Copy link
Member

Situphen commented May 31, 2019

Rapport de mes différents essais

J'ai utilisé l'article "Conférences et séminaires scientifiques à Paris (et ailleurs)" que j'ai importé en local pour mes essais.

Ce rapport est assez long mais j'ai essayé de le garder lisible autant que possible et au moins tu as les logs complets.

Publication du contenu

Lors de la publication, 4 événements de publications apparaissent dans la base de données et les 4 finissent en "Export réalisé". Aucune erreur dans le log de la commande python manage.py publication_watchdog. J'ai bien la possibilité de télécharger le contenu en Markdown, HTML, LaTeX, PDF, EPUB ou Archive ; tout va bien. QA OK

Événements en base de données

Suppression du PDF dans contents-public/{contenu}/extra_contents

Je lance rm contents-public/{contenu}/extra_contents/{contenu}.pdf et le PDF n'est plus disponible au téléchargement, logique. Je clique sur "Exporter le tutoriel", 4 événements de publication (les même que la 1e fois) sont créés et finissent en "Export réalisé". Aucune erreur dans le log du watchdog. Le PDF est de nouveau disponible en téléchargement. QA OK

Suppression du PDF, du LaTeX, de l'EPUB et du ZIP dans contents-public/{contenu}/extra_contents

Même chose qu'en supprimant seulement le PDF. QA OK

Suppression du dossier contents-public/{contenu}/extra_contents

1er clic sur "Exporter le tutoriel"

Par rapport à précédemment, les fichiers {contenu}.html et {contenu}.md sont eux aussi supprimés. Réussite pour le PDF et l'EPUB. Échec pour l'HTML et le ZIP. QA NOT OK

Événements en base de données

ERROR:Command:error while producing zip of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 307, in publish
    make_zip_file(published_content_entity)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 569, in make_zip_file
    zip_file = zipfile.ZipFile(file_path, 'w')
  File "/usr/lib/python3.6/zipfile.py", line 1113, in __init__
    self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.zip'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 310, in publish
    raise FailureDuringPublication('Zip could not be created', e)
zds.tutorialv2.publication_utils.FailureDuringPublication: ('Zip could not be created', FileNotFoundError(2, 'No such file or directory'))
"""

The above exception was the direct cause of the following exception:

zds.tutorialv2.publication_utils.FailureDuringPublication: ('Zip could not be created', FileNotFoundError(2, 'No such file or directory'))
ERROR:Command:error while producing html of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/shutil.py", line 544, in move
    os.rename(src, real_dst)
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.html' -> '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.html'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 330, in publish
    published_content_entity.content_public_slug + '.html')))
  File "/usr/lib/python3.6/shutil.py", line 558, in move
    copy_function(src, real_dst)
  File "/usr/lib/python3.6/shutil.py", line 257, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/usr/lib/python3.6/shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.html'
"""

The above exception was the direct cause of the following exception:

FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.html'

2eme clic

Si je clique une deuxième fois sur le bouton "Exporter le tutoriel", cette fois-ci tous les exports se réalisent correctement et je n'ai pas d'erreur dans les log.

Suppression du dossier contents-public/{contenu}__building/ et de contents-public/{contenu}/extra_contents/

1e clic

Réussite de l'EPUB. Échec du PDF, de l'HTML et du ZIP. QA NOT OK

Événements de publication en base de données

ERROR:Command:error while producing zip of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 307, in publish
    make_zip_file(published_content_entity)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 569, in make_zip_file
    zip_file = zipfile.ZipFile(file_path, 'w')
  File "/usr/lib/python3.6/zipfile.py", line 1113, in __init__
    self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.zip'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 310, in publish
    raise FailureDuringPublication('Zip could not be created', e)
zds.tutorialv2.publication_utils.FailureDuringPublication: ('Zip could not be created', FileNotFoundError(2, 'No such file or directory'))
"""

The above exception was the direct cause of the following exception:

zds.tutorialv2.publication_utils.FailureDuringPublication: ('Zip could not be created', FileNotFoundError(2, 'No such file or directory'))
ERROR:Command:error while producing html of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 317, in publish
    md_flat_content = _read_flat_markdown(md_file_path)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 295, in _read_flat_markdown
    with open(md_file_path, encoding='utf-8') as md_file_handler:
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'
"""

The above exception was the direct cause of the following exception:

FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'
ERROR:Command:error while producing pdf of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 344, in publish
    md_flat_content = _read_flat_markdown(md_file_path)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 295, in _read_flat_markdown
    with open(md_file_path, encoding='utf-8') as md_file_handler:
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'
"""

The above exception was the direct cause of the following exception:

FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'

2eme clic

Réussite de l'EPUB et du ZIP. Échec du PDF et de l'HTML.

Événements de publication en base de données

ERROR:Command:error while producing html of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 317, in publish
    md_flat_content = _read_flat_markdown(md_file_path)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 295, in _read_flat_markdown
    with open(md_file_path, encoding='utf-8') as md_file_handler:
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'
"""

The above exception was the direct cause of the following exception:

FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'
ERROR:Command:error while producing pdf of Conférences et séminaires scientifiques à Paris (et ailleurs)
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 344, in publish
    md_flat_content = _read_flat_markdown(md_file_path)
  File "/home/situphen/Code/zds-site/zds/tutorialv2/publication_utils.py", line 295, in _read_flat_markdown
    with open(md_file_path, encoding='utf-8') as md_file_handler:
FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'
"""

The above exception was the direct cause of the following exception:

FileNotFoundError: [Errno 2] No such file or directory: '/home/situphen/Code/zds-site/contents-public/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs__building/extra_contents/conferences-et-seminaires-scientifiques-a-paris-et-ailleurs.md'

3eme clic

Même erreurs que pour le 2eme clic.


Conclusion

Globalement le nouveau processus fait bien son job, tout va bien lors de la première publication et on peut demander une exportation à la demande si jamais une nouvelle version de ZDS est arrivée et corrige quelques bugs liés à la publication. Bien joué @artragis !

Je me suis aventuré et j'ai supprimé les fichiers générés pour voir s'ils étaient bien regénérés par le nouveau processus. Et là, dès qu'on touche au fichier Markdown on voit que ça coince. Pas de problème lors de la publication du contenu mais lors de la génération à la demande on ne peut pas regénérer le fichier Markdown. Bon après le fichier Markdown ne va pas disparaitre de lui-même du serveur, donc la probabilité qu'un problème apparaisse est très faible.

@artragis
Copy link
Member Author

Après pour des raisons de robustesses on peut aussi faire en sorte que les dossiers soient créés lors de l'appel à api:content:generate_export au moins on aura les bons éléments au bon moment.

- chemin vers le md de base
- chemin du html (shutil.move demande à ce que les fichiers destination n'existent pas si on déplace vers un dossier)
- log de l'exception
@artragis artragis force-pushed the change_publication_service branch from 3ccf25f to bfd09e4 Compare May 31, 2019 11:48
@artragis artragis force-pushed the change_publication_service branch from 70fc220 to f1603ff Compare May 31, 2019 12:30
@Situphen Situphen merged commit aea22f5 into zestedesavoir:dev May 31, 2019
Objectif v28.2 automation moved this from in review to Done May 31, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-Back Concerne le back-end Django S-Refactorisation Améliore le code existant sans forcément ajouter de nouvelle fonctionnalité
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

None yet

4 participants