rulu ruru

post Jenkins, Django, virtualenv, mercurial (a Debian)

July 30th, 2011

Filed under: programming — starenka @ 19:40
Tags: , , , , , , ,

 Nedávno jsem rozcházel testovací stroj pro Django projekty postavenej na Jenkinsu a jelikož informace o tomhle setupu jsou tak nějak polovičatý a navíc porozházený po internetech, rozhod’ jsem se to malinko rozepsat. Jenkins můžete s minimálním úsilím zaměnit za Hudson a Mercurial za git, Bazaar, SVN či kýhošlaka. Debian samozřejmě taky nehraje zásadní roli.

Nejdřív rozjedeme Jenkins:

echo ‘deb http://pkg.jenkins-ci.org/debian binary/’ >> /etc/apt/sources.list
aptitude update; aptitude install jenkins

Pokud je vše v pořádku, doinstalujeme pár pluginů. Takže nakopnout browser na http://localhost:8080/pluginManager/available a zaškrtnout: Mercurial Plugin (na Mercurial), Hudson Setenv Plugin (podpora ENV proměnnejch), Cobertura Plugin (coverage reporty), Violations (hlášení o prasení kódu z pylint a spol.), ChuckNorris Plugin (ehm) a Green Balls (ano, taky vám přijde zelená kulička po úspěšným buildu lepší než modrá?)

Až dorestartujete (jo, je to v Jáááááááááávěěěěěěěěěě), šup nastavit Mercurial na http://localhost:8080/configure

Cesty se samozřejmě můžou lišit, čili Executable zjistíte pomocí which hg a Installation directory vypreparujete z dpkg -L mercurial. To je co se týče Jenkinsu samotnýho všechno a tak jady vytvořit novej (Build a free-style software project) projekt http://localhost:8080/view/All/newJob

 

 

Obrázek je za sto slov, takže jen telegraficky. V sekci SCM nastavit cestu k repozitáři projektu, Jenkins tak díky Poll SCM (Build trigger), bude vědět, že do větve někdo pushnul novou revizi a spustí build. Schedule si nastavte dle potřeb, syntax je ne-nepodobnej crontabu, samozřejmě se nemusíme bát použít nápovědu. Jakmile, se Jenkins dozví, že přibyla nová revize, sám si ji potáhne. (Občas se mu to ale nepovede, v takovým případě nezbejvá nic jinýho než wipenout celej workspace)

V Build Environment de fakto aktivujeme virtualenv v adresáři .env (viz níže) a volitelně do PHYTONPATH přihodíme další potřebný knihovny (tady 3rdparty pro modifikované knihovny třetích stran a ourawesomelibs kde jsou naše skvělý knihovny sdílený napříč projekty). 

V sekci Build se děje většina tohole celýho mažiku. Myslím, že tady nemusím recitovat slovo od slovo, co ten skript dělá, ale kdyby to byl někdo chabrus na bash, tak pro jistotu: Zjistíme, jestli už máme vytvořený virtualenv a případně ho vytvoříme. Pak si naklonujeme nebo updateneme knihovny zmíněný výše. Nakonec použijeme pipinku na doinstalovaní knihoven, který náš projekt potřebuje. Preferuju dva soubory - jeden s knihovnama potřebnýma pro projekt a další, kde jsou knihovny potřebný pro otestování, lint, coverage a napojení na Jenkins (requirements_test). Po sestavení (updatnutí) envu se spustí samotný testy.

Po buildu si necháme ještě pěkně vymalovat code coverage (Cobertura), prohřešky naprásknutý pylintem (Violations) a hlavně taky výsledky testů (JUnit test result report). Všechno předatlovat z obrázku výše.

A to mám jako všechno přepisovat, jo? 

Moc toho na psani neni, ale ok:

#ENV vars
PATH=${WORKSPACE}/.env/bin:$PATH
PYTHONPATH=${WORKSPACE}/.env/LIBS/3rdparty:${WORKSPACE}/.env/LIBS/ourawesomelibs:$PYTHONPATH

##bash

if [ -d ".env" ]; then
    echo "**> Virtualenv already exists"
else
    echo "**> Creating virtualenv"
    virtualenv .env
fi

echo "**> UPDATING LIBS"
for lib in "3rdparty" "ourawesomelibs"; do
   if [ ! -e "$WORKSPACE/.env/LIBS/" ]; then
      mkdir "$WORKSPACE/.env/LIBS/"
   fi

   cd "$WORKSPACE/.env/LIBS/"

   if [ -e "$WORKSPACE/.env/LIBS/$lib" ]; then
      cd "$WORKSPACE/.env/LIBS/$lib"
      hg pul
      hg up
   else
      hg clone ssh://chrootuser@repo.myawesomcompany.cz/home/chrootuser/repos/LIBS/$lib
   fi
done

cd "$WORKSPACE"
pip install -r requirements.pip
pip install -r requirements_test.pip
python manage.py jenkins –settings=settings.test

 

Počkej, počkej! A co máš teda v těch requirements_test a jak vypadá ten Django setting pro test?

Mimo obvyklejch nastavení je tady pár věcí, který je třeba nastavit kvůlivá Jenkinsu. Podotýkám, že tohle je setting importující z nějakýho base nastavení a přepisuje jen pár nastavení:

TEST_RUNNER = ‘django_nose.NoseTestSuiteRunner’
#PROJECT_APPS = (,) #if defined, only defined tests will be started

#excluded apps
TEST_EXCLUDES = (    
   #django itself
    ‘django.contrib.auth’,
    ‘django.contrib.contenttypes’,
    ‘django.contrib.sessions’,
    ‘django.contrib.sites’,
    ‘django.contrib.admin’,
    ‘django.contrib.sitemaps’,
   #3rd party
    ‘django_extensions’,
   #test stuff
    ‘django_nose’, ‘django_jenkins’, ’south’,
)

SOUTH_TESTS_MIGRATE = False

INSTALLED_APPS += (‘django_nose’, ‘django_jenkins’,’south’)
 

Díky TEST_EXCLUDES můžeme vyřadit některý appky, nebo konkrétní testy. Nemusíme tedy zbytečně čekat na testy origoš Django appek apod. Do INSTALLED_APPS přihodíme věci potřebný pro testování, který by nám na produkci nebo někde jinde zbytečně strašily. Pokud by nám na prázdný testovací db z nějakýho důvodu haprovaly migrace, mužeme použít SOUTH_TEST_MIGRATE.

Co se týče knihoven, requirements_test říká:

south
coverage
nose
pylint
git+git://github.com/starenka/django-jenkins.git#egg=django_jenkins
#django_jenkins

Pokud nechceš/nepotřebuješ používat EXCLUDED_TESTS, bude lepší použít originál django_jenkins. Ten (můj) fork z GitHubu má právě tuhle fičuru backportlou z django_hudson, ale negarantuju, že to budu udržovat. Ostatní je jasny, coverage na generování coverage statistik, nose jako runner a pylint na statistiky Violations.

No a to je asi víceméně všechno. Ano, dalo se toho napsat rozhodně míň. Na druhou stranu se toho dalo napsat taky o dost víc. Doufám, že i tohle někomu aspoň trochu pomůže. Kdyby nastaly nějaký komplikace, nebojte se ozvat v komentářích.

 

 

post Zálohy na vzdálenej čípotač jednoduše (cron,rsync,bash)

July 5th, 2010

Filed under: linux — starenka @ 11:45
Tags: , , , , , ,

Nejsem moc velkej fanda zálohování, ale už se mi to párkrát vymstilo, takže jsem byl donucenej s tím něco dělat. Potřeboval jsem nějakej batch, kterej odzálohuje, co potřebuju a nebude nutit připojovat fyzicky nějaký zařízení. Logicky tedy k zálohování dat na notebooku používám druhý PC, který je dafakto jen držák na HDD s hudbou a filmama. Menší problém je ten, že to PC je vetšinu času vypnutý (prostě nesnáším, když cokoliv běží 90% naprosto zbytečne pro případ, že bych to náhodou mohl potřebovat). Jediná rozumná volba tedy byla “zbudit” PC a po odzálohování se zeptat, jestli ho chci vypnout nebo ne (Ten dotaz je asi nejmenší zlo, na který jsem přišel. Chvíli jsem koketoval s myšlenkou, zda zjišťovat, jestli je zapnutý monitor/pc bylo zapnuty s vypnutým monitorem = nekoukám se na film etc., nicméně jsem nenašel žadnou stoprocetně spolehlivou cestu, jak zjistit, proč je počítač zrovna spuštěnej).

Jak na to? Na cílový mašině:

# aptitude install ethtool

Zjistíme, jestli karta podporuje WoL (d - magic packet, p - physical activity)

# ethtool eth0 | grep Wake-on
root@bedna:/home/starenka# ethtool eth0 | grep Wake-on
 Supports Wake-on: g
 Wake-on: d

Povolíme WoL:

# ethtool -s eth0 wol g
root@bedna:/home/starenka# ethtool eth0 | grep Wake-on
 Supports Wake-on: g
 Wake-on: g

Ten flag je bohužel třeba nastavit při každým spuštění, takže:

starenka@bedna:~$ cat /etc/init.d/wol
#!/bin/bash
### BEGIN INIT INFO
# Provides: wol
# Required-Start: $syslog $networking
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: sets wol on eth0
### END INIT INFO
ethtool -s eth0 wol g
# chmod +x /etc/init.d/wol

a spustímě skript při každým runlevelu (ehm)

# update-rc.d wol defaults

zjistíme MAC cílový mašiny:

# ifconfig -a | grep eth0

Na mašině odkud zálohujeme nainstalujeme rsync a wakeonlan

# aptitude install rsync wakeonlan

backup skript upravíme dle potřeb a šoupneme do cronu

post QR kódy v Opeře

November 29th, 2009

Filed under: zeitgeist — starenka @ 20:06
Tags: , , ,

Pokuď jste lenivý přepisovat URL stránky, odkazu, výběru textu nebo URL obrázku na stránce, existuje jednoduchý řešení. Ano, samozřejmě tvůj skvělej FeurFuchs na to má jistě plugin, ale pro Operu existuje taky jednoduchý řešení. Stačí upravit menu.ini (víc o úpravách menu.ini tady) a nainstalovat balicek na generování QR (qrencode):

[Link Popup Menu]
Item, "Show QR"         = Execute program, "bash","showqr %l"

[Document Popup Menu]
Item, "Show QR"         = Execute program, "bash","showqr %u"

[Hotclick Popup Menu]
Item, "Show QR"         = Execute program, "bash","showqr '%t'"

[Image Link Popup Menu]
Item, "Show QR link"         = Copy link & Execute program, "bash","showqr %c"

[Image Popup Menu]
Item, "Show QR"         = Copy image address & Execute program, "bash","showqr %c"

a nechat posílat na jednoduchej bash skript:

#!/usr/bin/env bash

qrencode -o /tmp/qr.png "$1"
if [ -e /tmp/qr.png ]
    then kuickshow /tmp/qr.png
    rm /tmp/qr.png
else kdialog –error "Failed to generate QR"
fi
 

QR

ruldrurd
© starenka 2oo7, cute alien monster by noizcut, original theme by Laurentiu Piron - customized by starenka | proudly powered by WordPress