PHP Projelerinde Jenkins Kullanımı

Eğer projelerinizde unit test yazıyorsanız ve özellikle projede birden fazla developer çalışıyorsa Jenkins gibi bir continuous integration (CI) aracı kullanmanız tavsiye ediliyor. Martin Fowler’in CI tanımı şu şekilde (çeviri Özcan Acar):

Sürekli Entegrasyon, programcı ekibi tarafından yapılan değişikliklerin sık aralıklarla sisteme entegre edilmesi için kullanılan yazılım geliştirme yöntemidir. Her programcı günde en az bir kere yaptığı değişiklikleri entegre eder. Bu sayede gün boyunca birden fazla entegrasyon gerçekleşir. Otomatik sürüm oluşturulması ve mevcut testler yardımı ile entegrasyon kontrol edilir. Birçok ekip tarafından sürekli entegrasyon metodu ile entegrasyon sorunlarının azaldığı tespit edilmiştir. Sürekli entegrasyon ile bir ekip hızlı bir şekilde kendi içinde bütün ve çalışır programlar yazabilmektedirler.

PHPUnit‘in geliştiricisi Sebastian Bergmann abimiz PHP projelerinde kullanmak üzere şahane bir Jenkins template’i hazırlamış (Template for Jenkins Jobs for PHP Projects). Bu template ve extension’lar sayesinde PHP projeleri için; syntax hatalarının tespiti, uygulama içinde kod tekrarı yapılıp yapılmadığı, unit-test sonucu code coverage durumu gibi bir çok kontrol ve rapor paketi sunuyor.

(Kuruluma başlamadan önce Apache Ant’ın ve Jenkins’in kurulu ve çalışıyor olduğundan emin olun)

Öncelikle PHP araçlarını kuralım:

sudo pear upgrade PEAR
sudo pear config-set auto_discover 1
sudo pear install pear.phpqatools.org/phpqatools pear.netpirates.net/phpDox
sudo pear install channel://pear.netpirates.net/phpDox-0.4.0

Ardından gerekli Jenkins plugin’lerini kuralım:

wget http://localhost:8080/jnlpJars/jenkins-cli.jar

java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin \
checkstyle cloverphp dry htmlpublisher jdepend plot pmd violations xunit git greenballs github

java -jar jenkins-cli.jar -s http://localhost:8080 safe-restart

Not: Eğer “No update center data is retrieved yet from..” içeren bir hata alırsanız aşağıdaki komutlar ile update center’ı güncellemelisiniz (kaynak):

wget -O default.js http://updates.jenkins-ci.org/update-center.json
sed '1d;$d' default.js > default.json
curl -X POST -H "Accept: application/json" -d @default.json http://localhost:8080/updateCenter/byId/default/postBack --verbose

Sıra geldi Jenkins’de template’i oluşturmaya:

curl https://raw.github.com/sebastianbergmann/php-jenkins-template/master/config.xml | \
java -jar jenkins-cli.jar -s http://localhost:8080 create-job php-template

java -jar jenkins-cli.jar -s http://localhost:8080 reload-configuration

Tamamdır, artık Jenkins PHP projeleri için kullanıma hazır. ‘New job’ sayfasına girip bir isim verdikten sonra ‘Copy existing job’ kısmına ‘php-template’ yazıp devam ediyoruz.

new-job

‘Disable Build’ seçeneğini kapatıp, ‘Source Code Management’ sekmesi altında proje kaynağını belirtiyoruz.

scm

‘Build Trigger’ altında, ne zaman çalışacağını belirtiyoruz. ‘Poll SCM’ seçeneğini seçip, kaynak kodunu her 5 dakikada bir kontrol edecek şekilde ayarlayalım.

poll-scm

‘Save’ diyerek işlemi tamamlıyoruz.

Github ile Build Tetikleme

Yazının bundan sonrası version kontrolü için Git kullanan ve Github’da barındıranlar için. Build işlemini Github’da yapılacak bir güncelleme ile tetikleyebilirsiniz. Bunun için ‘Build Triggers’ altından ‘Build when a change is pushed to GitHub‘ seçeneğini seçiyoruz (Jenkins Github plugin’inin kurulu olması lazım).

build-change-github

Private repo’larınızın Jenkins’i tetiklemesi için bir kaç yol var. Jenkins Dashboard’undan ‘Manage Jenkins’ altında ‘Configure System’ sayfasında ‘GitHub Web Hook‘ sekmesi altından ‘Let Jenkins auto-manage hook URLs‘ diyip Github kullanıcı ve şifresinizi girebilir ya da ‘Manually manage hook URLs‘ seçeneğini seçip Github üzerinden ‘Service Hooks’ sayfasındaki ‘Post-Receive URLs’ sekmesine:

http://KULLANICIADI:[email protected]/github-webhook/

şeklinde Apache Basic Authentication ile koruduğunuz Jenkins için trigger adresi tanımlayabilirsiniz.

web-hook

Bir başka yol ise Github OAuth pluginini kullanarak Github üzerinden açacağınız uygulama ile Jenkins’e yetki verebilirsiniz.