Friday, May 27, 2011

Continous integration i Python?

Czy ktoś widział może kiedyś budowanie projektu pisanego w Pythonie?
Może nie jestem czegoś świadom, albo myślę zbyt szablonowo ale: continous-integration jest dobrze zdefiniowane dla projektów, które trzeba kompilować. Wiadomo. Developer nie kompiluje kodu sam. System CI sam sprawdza za niego czy kod pozytywnie przechodzi etap kompilacji i wysyła powiadomienia.

Ale jak odnieść się do tego w świetle Pythona. No dobra, wyciągamy kod źródłowy z repozytorium - i co? Przecież go nie skompiluję. Wszystko, na stać moją wyobraźnię na dzień dzisiejszy, to hmm... scan pylint, pychecker, pep8, odpalanie metody .compile() na każdym module? Jeżeli już zdecydujemy się na skany: to jak zachować się w przypadku jakiś komunikatów. Kod nie musi być źle napisany, zresztą zakładamy, że przeszedł review, ale wtedy co? Sfailować build tylko dlatego, że kod Pythona programisty nie odpowiada pylint. To niczego nie udowadnia.

Piszę ten post w związku z sytuacją jaka miała miejsce kilka dni temu. Rozumiem, żeby w trakcie budowania projektu Pythonowego odpalać testy w ramach. W moim przypadku nie mam nawet czasu aby je pisać więc nie ma co odpalać. Przyjmuję argument, że to co wychodzi na produkcję powinno być numerowane. To bardzo pomocne i użyteczne. Jednak w Python 2 wszystko co sobie wyobrażam to otagowywanie kolejnych wersji w repozytorium. Podmienianie egga, który wywala serwer Apache ponieważ przestają mu się zgadzać sumy kontrolne - to jakaś porażka. To nie wiem co innego mógłbym robić? Dodawać komentarz z numerem buildu w jakimś umówionym pliku? Dodam jeszcze, że to aplikacja internetowa pisana w Django.

Jeżeli ktoś jest w temacie to jestem bardzo zainteresowany wymianą doświadczeń w tym temacie.

2 comments:

Anonymous said...

Dla małego, nowo-powstałego projektu dedykowany serwer CI nie jest niezbędny. Natomiast dla projektu który:
* przeznaczony jest dla kilku wersji pythona
* uruchamiany jest w roznych srodowiskach (windows, unix)
* ma zależności z poza pythona (rozne wersje aplikacji/bibliotek)
* ma dużo unit testów / testów integracyjnych, na których zakończenie trzeba czekać dłużej niż 5 min.
* itp.

Serwer CI jest bardzo przydatny. Pozwala prowadzic statystyki dla całego teamu (widac kto psuje build, łamie konwencje itp.), przyspiesza prace (jak klepiesz kod to odpalasz testy tylko dla fragmetu w ktorym dłubiesz, serwer CI natomiast testuje całość, wiec nie musisz czekać długo na rezultat); usprawnia tworzenie paczek instalacyjnych (eggi, deb'y, rpm'y), może odpalać jakiś benchamark i weryfikować czy commit nie powoduje znaczacych odchylow wydajnosci aplikacji itd.

Johny JKJK said...

Nigdy nie myślałem w ten sposób o CI... Ciekawe podejście. Dzięki!