Bu yazımızda basit bir java web projesi geliştirerek uygulamamızın kullanıcılar ile buluşmasını otomatize edeceğiz.
Uygulamamızı geliştirirken Java Server Faces çatısını kullanacağız.
Uygulamamızın kodlarını Git yardımıyla Github üzerinde bulunacak.
Proje temel iskeletini ve bağımlılıklarını yönetmek için Apache Maven ,
projemizi derleyebilmek, varsa yazdığımız testleri koşturmak ve hatta varsa bize hatalarmızı bildirmesi için continuous integration araçlarından Travis-CI kullacağız.
Uygulamamızı canlı olarak bir sunucuda koştuğunu görmek için Jetty nin bir pluginini kullanarak platform as a service(PaaS) ürünlerinden Heroku kullanacağız.
Terminalimizi açıyoruz.
Çalışma alanımıza giderek uygulamamızı bilgisayarımıza indirelim.
/home/user/workarea
Projemizin temel iskeletini maven aracı ile daha önceden oluşturup Github üzerinden yayınladım.
mvn archetype:generate -DgroupId=com.keramiozsoy.baseapp -DartifactId=baseapp -Dversion=0.0.1-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
Github üzerinde projemizi çekelim.
git clone https://github.com/keramiozsoy/jsf-travis-ci-heroku.git
Jsf projesi olması için yapılan değişiklikleri görmek için terminal üzerinden komutu çalıştırabilirsiniz.
git checkout tags/v0.0.1
Projemizin maven üzerinde çoklu modül olarak davranabilmesini sağlayan değişiklikleri görmek için terminal üzerinden komutu çalıştırabilirsiniz.
git checkout tags/v0.0.2
Travis-CI ile projemizi ilişkilendirmek için bazı eklemeler yapmalıyız. Aşağıdaki linklere göz atabilirsiniz.
https://travis-ci.org (ücretsiz)(açık depo)
https://travis-ci.com (ücretli)(kişiye özel depo)
Travis-CI a üye olup github hesabımızla ilişki kuruyoruz.
Travis bize .travis.yml isimli bir dosyayı projemize eklediğimizde yardımcı oluyor. Bu dosya içerisine şu değerleri yazabiliyoruz.
- Projem hangi dil ile yazılmıştır ?
- Projem hangi java jdk versiyonu ile derleme yapılsın ?
- Projem çalıştırılmadan önce bir sisteme hangi dosyalar yüklenmesi gereklidir ?
- Projemdeki hangi testler çalıştırılsın ?
- Projem Travis-CI ile derlendikten sonra hangi sunucuya deploy yapılsın ?
Yukarıdaki soruları arttırmak tabi ki mümkün. Projemize ekleyeceğimiz dosya şu şekildedir.
.travis.yml
language: java
jdk:
- oraclejdk8
- openjdk8
cache:
directories:
- '$HOME/.m2/repository'
before_script:
- echo $HOME
- echo $JAVA_OPTS
- echo $MAVEN_OPTS
script: pwd && ls -al && mvn clean package
Yaptığımız değişiklikleri github adresimize gönderdiğimizde otomatik olarak uygulamamız değişiklikleri algılayarak çalışmaya başlayacak.
Fakat .travis.yml dosyasının gönderildiği adımdan sonra yapılan adımlarda bu işlem başlayacaktır.
Resimdeki adımlar görüldükten sonra Travis-CI sunucuda çalıştırılabilecek hazır bir war dosyamız oluştu.
Uygulamamızı yayınlamak için Heroku ya üye olmalıyız.
https://www.heroku.com
Heroku üzerinde bir proje oluşturalım.
Uygulamamızı oluşturduktan sonra
- Deployment Method bölümünden Github seçip ilişkilendirmek istediğimiz uygulamayı seçiyoruz.
- Automatic deploys bölümünden Wait for CI to pass before deploy alanını Travis-CI üzerinden işlemleri yönetmek istediğimizden işaretliyoruz. Enable Automatic Deploys bölümüne tıklıyoruz.
- Projemizin Settings / Buildpacks bölümünden Add Buildpack ile Java seçip kaydediyoruz.
- Son olarak Account Settings bölümündeki Api Key bölümündeki şifreyi daha sonra kullacağız.
Heroku tarafındaki ayarlarımız yaptık.
Travis-CI daki projemizin more options/settings altında Environment Variables bölümünde bir değişken oluşturalım. Şifre kısmına ise Heroku üzerindeki Api Key değerini ekleyelim.
Benim oluşturduğum değişken şu isimdedir.
HEROKU_AUTH_TOKEN
Geliştirdiğmiz projemizin Heroku ya, Travis-CI tarafından tetiklenmesi için projemize gereken eklemeleri yapalım.
.travis.yml
deploy:
provider: heroku
api_key:
secure: $HEROKU_AUTH_TOKEN
skip_cleanup: true
app: jsf-travis-ci-heroku ##heroku üzerindeki proje adı
on:
branch: master
Jetty isimli web-sunucusunun jetty-runner isimli plugini ile jar uzantılı dosyalarımızı ekstra kurulum yapmadan ayağa kaldırabiliyoruz. Hemen gerekli eklemeleri projemizde yapalım.
pom.xml
Build etiketlerinin içine eklemelerimizi yapıyoruz.
<build>
<finalName>baseappparent</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>copy</goal></goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-runner</artifactId>
<version>9.4.9.v20180320</version>
<destFileName>jetty-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Heroku ‘da uygulamayı çalıştırmak için komut ile tetiklemeliyiz. .travis.yml de komutları çalıştırıyor fakat biz bu dosya çalıştıktan sonra komut vermek isityoruz. Heroku tarafından sağlanan bu dosya Procfile olarak adlandırılıyor.
travis.yml ile aynı dizinde şu isim ile bir dosya eklenmelidir.
Procfile
web: java $JAVA_OPTS -jar baseapp/target/dependency/jetty-runner.jar --port $PORT baseapp/target/*.war
Projemizde eklediğimiz her dosya, yazdığımız her kod Travis-CI tarafından izlendiğinden otomatik olarak yeni eklediğimiz dosyayı çalıştırdıktan sonra uygulamamız çalışıyor. Hemen kontrol edelim.
Heroku üzerindeki projemizin settings bölümünden bu linke ulaşabilirsiniz.
https://jsf-travis-ci-heroku.herokuapp.com
Heroku ile projeyi yayınlamak için, Heroku projenin ana klasörünün altında pom.xml var mı diye kontrol ediyor. Bu durumda şöyle bir hata alabilirsiniz.
App not compatible , Could not find pom.xml
Bu durumda yukarıda anlattığım git checkout tags/v0.0.2 bölümü bu problemi ortadan kaldırmış oluyor
Projemizi yayınladık. Biraz projemize renk katalım.
Projemizde geliştirmek istediğimiz yeni özellikleri bir iş akışı oluşturarak continous delivery yapmaya çalışacağız. 🙂
Aslında projemizdeki geliştirmeleri belirli kurallar yardımıyla canlı ortamda kullanıcılar ile buluşturacağız.
Heroku üzerindeki projemizden Deploy bölümünden Choose a pipeline/Create new pipeline butonu yardımı ile akışımıza başlayalım.
Pipeline içeriğine biraz göz atalım.
Burada 3 ana bölüm var.
Review Apps bölümü
Github üzerinden her pull request yapıldığında,geliştirmeyi yapan kişiye
gönderdiği kod ile birlikte uygulamanın son durumunun ne olacağını göstermek için
bir link verilmesine yardımcı olur.
Staging bölümü
Her an canlıya çıkılabilecek durumda olan kodumuzun son halidir. Buradan bir buton yardımı ile canlı ortama kodumuzu taşıyabiliyoruz. Continuous delivery olayının yapıldığını vurgulayan kısımdır. Tabii ki bu çok küçük bir kısımdır.
Production bölümü
Projemizin canlı ortamdaki halidir.
Development bölümü
Isteğe bağlı olarak açılabiliyor. Bu bölüm için gitflow workflow ile projemizi geliştirirken işimize yarıyor. Biz bu projede kullanmayacağız.
Hemen ayarlarımızı yapmaya başlayalım.
Enable Review Apps >> Create an app.json >> Sayfanın en altından Commit to Repo >> Create new review apps for new pull requests automatically >> Enable seçiyoruz.
Artık uygulamamız github üzerinden pull-request gönderilmeye hazır.
Örneklemeye başlayalım.
Projemiz açıldığında başlık kısmı kırmızı yazılması istenilen bir geliştirme yapılmak isteniyor hemen geliştirmemizi yapıp gönderelim.
Github üzerinden patch-1 isimli bir branch oluşturup pull request gönderiyoruz.
https://github.com/keramiozsoy/jsf-travis-ci-heroku/tree/patch-1
https://github.com/keramiozsoy/jsf-travis-ci-heroku/pull/1
Pull request gönderildiği için Travis-CI hemen .travis.yml dosyasındaki komutları çalıştırmaya başladı.
Heroku da Review Apps bölümünde yapılan değişiklikler sayesinde bize gönderilen geliştirmenin nasıl olduğuna bakabileceğimiz bir ortam, sunucu ayağa kaldırdı.
Gönderilen geliştirmeye Open app in browser linki üzerinden ulaşabiliriz.Biz proje yayınlayan olarak Heroku üzerinde buradan görebilirken , Github üzerinde gönderilen geliştirmenin yanında View Deployment butonu ile geliştiren kişi de görebiliyor.
https://jsf-travis-ci-heroku-pr-1.herokuapp.com/
Heroku üzerindeki Staging bölümünde hiç bir değişiklik olmadığını görebilirsiniz.
https://jsf-travis-ci-heroku.herokuapp.com/
Yapılan geliştirmeyi Staging bölümünde görmek istersek github üzerinden pull request
https://github.com/keramiozsoy/jsf-travis-ci-heroku/pull/1
merge yapılmalıdır.
Staging bölümünden uygulamamızda değişikliği görebiliyoruz.
Buraya kadar geliştirmelerimizi yaptık . Bir çok kişinin projemize katkı yaptığı zaman yeni geliştirmeleri görebilmemizi sağlayan ortamı hazırladık ve hatta bunu uygulamamıza dahil ettik ve gördük.
Peki geliştirmeleri uygulamamıza dahil etmek istiyoruz fakat halihazırda uygulamamızı kullananlar mevcut. Her yeni geliştirmeyi belirli periyotlar ile canlı ortama kullanıcılarımıza sunmak istiyoruz. Hatta birden fazla canlı ortamda aynı uygulamayı koşturan sunucumuz mevcut.
Nasıl yapalım ? Ne edelim ?
Production bölümünden yeni bir uygulama oluşturuyoruz
Staging bölümündeki Promote to Production/Promote butonu yardımıyla canlı ortama tüm geliştirmeleri alıyoruz.
Canlı ortamdaki değişiklikleri şuradan görebiliriz.
https://jsf-travis-ci-heroku-prod.herokuapp.com/
Burası aslında tamamen ayrı bir uygulama fakat aynı pipeline içerisinde olduğundan iletişim kurulabiliyor ve uygulamamızı sağlıklı şekilde paylaşabiliyoruz.
Github Link :
https://github.com/keramiozsoy/jsf-travis-ci-heroku
Teşekkürler, İyi Çalışmalar 🙂