<div dir="ltr"><div><div><div>Hi Mike,<br><br></div>Thank you for sharing your example of subclassing Build. It will be very helpful.<br><br></div>Regards,<br><br></div>Alvaro<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 28, 2017 at 3:49 AM, Mike Alexeev <span dir="ltr"><<a href="mailto:mike.42.alexeev@gmail.com" target="_blank">mike.42.alexeev@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello Pierre,<div><br></div><div>Thank you for advice. </div><div>I will use reporter class instead of Build class customization.</div><div><br></div><div>Alvaro, anyway here is an example of subclassing Build:</div><div><a href="https://pastebin.com/gfq1wQLG" target="_blank">https://pastebin.com/gfq1wQLG</a> </div><div><br></div><div>Maybe it will be helpful in other cases  </div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2017-03-27 21:49 GMT+03:00 Pierre Tardy <span dir="ltr"><<a href="mailto:tardyp@gmail.com" target="_blank">tardyp@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi all,</div><div>Usually, the way to do that is to setup a custom reporter class.</div><div>You can then use the data api to fetch as many information on the build as you need to build your html report, and push it to S3.</div><div><br></div><div>The details of what you can get with rest api is documented here:</div><div><a href="https://docs.buildbot.net/0.9.5/developer/rest.html" target="_blank">https://docs.buildbot.net/0.9.<wbr>5/developer/rest.html</a></div><div><br></div><div>The best is to look at the example of reporters/utils <a href="https://github.com/buildbot/buildbot/blob/master/master/buildbot/reporters/utils.py" target="_blank">https://github<wbr>.com/buildbot/buildbot/blob/<wbr>master/master/buildbot/reporte<wbr>rs/utils.py</a></div><div><br></div><div>If you are not confident enough with twisted and async, you can just put a MasterShellCommand with a python script in the end of your builds and use the REST api to fetch the data you need.</div><div>In order to get raw logs, you can use the raw log endpoint (no need for logobservers!):</div><div><br></div><div>e.g: <a href="https://nine.buildbot.net/api/v2/logs/357614/raw" target="_blank">https://nine.buildbot.net/api/<wbr>v2/logs/357614/raw</a></div><div><br></div><div>Note that buildbot store the stdout/stderr information, which is removed when you fetch it via raw endpoint.</div><div><br></div><div>Here is an example on how to process the stream logs that we use for debugging our integration tests:</div><div><a href="https://github.com/buildbot/buildbot/blob/master/master/buildbot/test/util/integration.py#L246" target="_blank">https://github.com/buildbot/bu<wbr>ildbot/blob/master/master/buil<wbr>dbot/test/util/integration.py#<wbr>L246</a><br></div><div><br></div><div>Regards</div><span class="m_1319503988363478916HOEnZb"><font color="#888888"><div>Pierre</div><div><br></div></font></span></div><div class="m_1319503988363478916HOEnZb"><div class="m_1319503988363478916h5"><br><div class="gmail_quote"><div dir="ltr">Le lun. 27 mars 2017 à 18:41, Alvaro Erickson <<a href="mailto:alvaro.erickson@gmail.com" target="_blank">alvaro.erickson@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_1319503988363478916m_9099353080319539250gmail_msg"><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><div class="m_1319503988363478916m_9099353080319539250gmail_msg">Hi Mike,<br class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div>I too would like to see what your solution for saving a log (into plain text, not html) for all steps after a build is finished. Specifically, if you could please share the subclassed Build class for log generation. Any examples would be very helpful.<br class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div>Background: On my work project, one of the goals is they want all the build logs to be archived.<br class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div>Regards,<br class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div>Alvaro<br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="gmail_extra m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"><div class="gmail_quote m_1319503988363478916m_9099353080319539250gmail_msg">On Mon, Mar 27, 2017 at 8:52 AM, Mike Alexeev <span dir="ltr" class="m_1319503988363478916m_9099353080319539250gmail_msg"><<a href="mailto:mike.42.alexeev@gmail.com" class="m_1319503988363478916m_9099353080319539250gmail_msg" target="_blank">mike.42.alexeev@gmail.com</a>></span> wrote:<br class="m_1319503988363478916m_9099353080319539250gmail_msg"><blockquote class="gmail_quote m_1319503988363478916m_9099353080319539250gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_1319503988363478916m_9099353080319539250gmail_msg">Hello, Koutheir<div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">I have also similar problem. </div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">I need to save log from all steps after build finished.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">No html just plain text.<br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">It seems that there is no ready solution. </div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">For example there is no file storage in buildbot for files (reports, logs and other build artifacts).</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">So my solution is not universal though it can be helpful. </div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">For log generation I subclassed Build class. You can set your own custom Build class</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">to build factory in buildbot config.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">I overrided buildFinished method and added there code to collect log from all steps.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">In build instance you have access to Data API and you can read logs from DB.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">I can share example if you want.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">For file serving I use nginx.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">I added links to log in build page template and substitute path to log based on build properties.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">So every build has link on its page to log.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">I think that saving log can also be implemented as step running on Local Worker </div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">(it runs on master).  But I used custom build class because it looks cleaner (no odd steps in build).</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">By the way, can be there default implementation for file storage in buildbot? </div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">For example default solution with twisted file serving</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">and possibility to use server like nginx in bigger setups. Just like db setup - sqlite has no external</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"> processes and easy to setup, but  also you can use postgre which much more faster.</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg">What about adding post-build hook in configuration? Log-saving method for example could be</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"> set there</div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div><div class="m_1319503988363478916m_9099353080319539250gmail_msg"><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div></div>
<br class="m_1319503988363478916m_9099353080319539250gmail_msg">______________________________<wbr>_________________<br class="m_1319503988363478916m_9099353080319539250gmail_msg">
users mailing list<br class="m_1319503988363478916m_9099353080319539250gmail_msg">
<a href="mailto:users@buildbot.net" class="m_1319503988363478916m_9099353080319539250gmail_msg" target="_blank">users@buildbot.net</a><br class="m_1319503988363478916m_9099353080319539250gmail_msg">
<a href="https://lists.buildbot.net/mailman/listinfo/users" rel="noreferrer" class="m_1319503988363478916m_9099353080319539250gmail_msg" target="_blank">https://lists.buildbot.net/mai<wbr>lman/listinfo/users</a><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></blockquote></div><br class="m_1319503988363478916m_9099353080319539250gmail_msg"></div>
______________________________<wbr>_________________<br class="m_1319503988363478916m_9099353080319539250gmail_msg">
users mailing list<br class="m_1319503988363478916m_9099353080319539250gmail_msg">
<a href="mailto:users@buildbot.net" class="m_1319503988363478916m_9099353080319539250gmail_msg" target="_blank">users@buildbot.net</a><br class="m_1319503988363478916m_9099353080319539250gmail_msg">
<a href="https://lists.buildbot.net/mailman/listinfo/users" rel="noreferrer" class="m_1319503988363478916m_9099353080319539250gmail_msg" target="_blank">https://lists.buildbot.net/mai<wbr>lman/listinfo/users</a></blockquote></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>