TeamCity CI-CD
Spring Boot & Docker Hub Uygulama Örneği
Merhabalar,
Bu yazımda TeamCity ne olduğu, kurulumu, spring boot ile yazdığımız uygulamayı teamcity ile ci cd pipeline yazıp teamcity in docker agent kurarak docker hub private repository göndermeyi inceliycez.
TeamCity: Java tabanlı bir Build Yönetimi, Continuous Integration ve Continuous Deployment sunucusudur. TeamCity’i hem Windows hem de Linux dağıtımları üzerinde kullanabilirsiniz. Biz linux üzerinde devam edeceğiz.
Özellikleri
- Github, Gitlab, Bitbucket, TFS, SVN gibi bir çok VCS ile direkt entegrasyon özelliğine sahipdir.
- Kod kalitesi, test araçları, build araçları, paket yöneticileri, upload yöntemleri, shell komutlarının yönetimi gibi işleri yürüten onlarca plugin kullanıma hazır.
- Herhangi bir teknoloji bağımlılığı yok. Dolayısıyla Linux sistemlerinize paket çıkan agent’larınız ile Windows sunucularınıza transfer yapan agent’larınız kardeşçe yaşayabiliyorlar.
- Tarihsel olarak geçmiş paketlerinizi tutabilir, versiyonlamalarınızı dilediğimiz şekilde yönetebilirsiniz. Böylece “bir önceki pakete sağlıklı bir şekilde dönme” fobisi tarihe karışıyor.
- Bir çok CD aracıyla da uyumlu çalışabilen TeamCity, burada hazırlanan paketleri kolaylıkla entegre paketlere yollayabilir.
Kendi deneyimlediğim kadarıyla TeamCity tamamem kullanıcı dostu ve kendi içindeki pluginler sayesinde hızlı ve basit şekilde ci-cd pipeline oluşturmamıza imkan sağlıyor. Yönlendirdiği direktifler doğrultusunda doğru bir şekilde ci-cd pipeline test edebiliyorsunuz.
ilk olarak Teamcity ile ci ve cd pipeline oluşturcağımız projemisin Controller bakalım. Basit bir string döndüren spring boot projesidir. Aşağıdaki linkten proje bakabilirsiniz.
Projenin Dockerfile göz atacak olursak,
Şimdi de docker ile TeamCity kurulumunu yapalım. TeamCity windows, linux ve docker ile kurulum yapabilirsiniz. Aşağıdaki linkten işletim sisteminize göre kurulum dosyalarına erişebilirsiniz.
Docker ile teamcity kurulumu başlayalım. Bunun için,
docker run --name teamcity-server-instance \-v team_city_data:/data/teamcity_server/datadir \-v team_city_logs:/opt/teamcity/logs \-dp 8111:8111 \jetbrains/teamcity-server
ya da
Burada bilmemiz gerekenler,
- Data klasörü içerisinde proje ayarları ve build sonuçları gösterdiğimiz volume belirtmemiz gerekir, çünkü container ayağa kalktığında ilk bu path kontrol etmesi belirtecektir. Eğer bu klasör ile container’daki ilgili klasörü map etmezsek, container bir sonraki açılışında tüm ayarlar sıfırlanmış olarak karşımıza çıkacak ki bu hiç talep etmediğimiz bir durum.
- Logs klasörü ile de süreçlerin loglarını tutacağız. Bu ayar yapılmayabilir ancak hataları loglardan izlemekte her zaman yaralıdır.
TeamCity logu bakarak ilgili kurulum ne aşamada olduğu bakabiliriz. Bunun için,
docker logs -f container_id ya da container_name
TeamCity isterseniz,
local bilgisayarın ip_adresi : container_port_numarasıdocker container aldığı ip_adresi : container_port_numarasılocalhost : container_port_numarası
birisi ile TeamCity UI bağlanabilirsiniz.
“Location of the Data Directory: /data/teamcity_server/datadir” ilgili dataya volume mount edip proje ayarların klasörde olduğunu doğrulamak için path gösteriyor. Proceed tıklayıp diğer aşamaya geçiyoruz.
Şimdi de database ayarlarını yapacaz. İsterseniz internal seçip kendisinin oluşturduğu connection kullanabilirsiniz ya da mysql, postgresql, oracle veya Ms Sql Server bağlantısını yapabilirsiniz. Biz internal devam edecez.
Kurulumun bitmesini bekliyoruz.
Lisans kabul edip devam ediyoruz.
Bir tane admin user oluşturuyoruz. Eğer admin user oluşturmak istemiyorsanız super user için,
docker logs -f container_name
Burada yazan token ile giriş yapabilirsiniz. Biz yeni bir user oluşturup devam ediyoruz.
Kurulum başarılı ile gerçekleşti.
Şimdi de gitlab repository projemiz ile bağlantı kuralım. Bunun için,
Create Project
Projenin bulunduğu gitlab reposunu url kısmına ,username gitlab kullanıcı adınız ve password girdikten sonra proceed ile devam ediyoruz.
branch belirleyip proceed ile devam ediyoruz.
Şimdi de “configure build step manually” ile kendi steplerimiz belirliyoruz. İlk olarak maven ile projeyi build edelim.
ikinci step olarak Dockerfile dan bir image oluşturma yapalım. Bunun için add build step,
Son step olarak da docker hub push etme yapalım,
Steplerin son güncel haline bakacak olursak,
Şimdi de Docker Hub image göndermek için ayarlarını yapalım. Bunun için,
ilk olarak docker hub bir tane teamcity adında repository oluşturuyoruz.
daha sonra,
Connections -> Add Connection ve type olarak Docker Registry seçiyoruz ve Docker hub username ve password girdikten sonra test connection diyoruz.
ve connection başarılı şekilde eklenmiştir.
Build Features -> Add Build Feaures -> Docker Support -> Add Registry Connection -> Docker Registry şeçiyoruz.
ve başarılı şekilde connection sağlamış olduk.
Şimdi de agent kurulumu yapalım. Daha öncesinde Teamcity aldığı portu güvenlik duvarından izin veriyoruz yoksa agent çalışmaz. Bunun için,
sudo ufw allow 8111/tcpsudo ufw status
Agent -> Docker image Agent ile ilgili linke gidiyoruz.
docker run \-e SERVER_URL="http://192.168.1.28:8111" \-v teamcit_agent:/data/teamcity_agent/conf \-d jetbrains/teamcity-agent
Yetkilendirmeyi yapıyoruz,
Proje ismi -> Build -> Compataible agents
Şimdide agent larımıza bakalım.
Şimdi de compataible agent oluşturalım. Bunun için,
docker run -it -e SERVER_URL="http://192.168.1.28:8111" \
-u 0 \
-v teamcity_agent_config_docker:/data/teamcity_agent/conf \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/buildagent/work:/opt/buildagent/work \
-v /opt/buildagent/temp:/opt/buildagent/temp \
-v /opt/buildagent/tools:/opt/buildagent/tools \
-v /opt/buildagent/plugins:/opt/buildagent/plugins \
-v /opt/buildagent/system:/opt/buildagent/system \
jetbrains/teamcity-agent
Agents -> Unauthorized -> authorize ile yetkilendiriyoruz. Agent tekrar baktığımızda eklendiği görebiliriz.
Project -> Build -> Compataible agents gittiğmizde,
Son olarak da ci pipeline çalıştıralım. Bunun için,
ve
Pipeline build step loglarına bakmak için test passed tıklayalım.
Son olarak da docker hub dan ilgili repository baktığımızda,
image ilgili repository başarılı şekilde gerçekleşmiştir.
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler.
Referanslar;