Docker’ın Test (CI) için Bitbucket Pipelines İle Kullanımı

Merhaba arkadaşlar, Mobilhanem üzerinden yayınladığımız Docker derslerine devam ediyoruz. Bundan önceki derslerimizde Docker’In izolasyonu nasıl sağladığından ve nasıl kullanıldığından bahsetmiştik. Docker’ın sağladığı bu izolasyon özelliği sayesinde, her test için temiz bir container açarak testlerin ortamdaki değişikliklerden etkilenmesi sağlanabilir. Docker’ın en yaygın kullanım alanlarından biri de Continuous Integration (CI) alanıdır. Git gibi kod repolarına bir güncelleme gelip master ile birleştirilmeden önce tüm testler çalıştırılır, ve eğer bu testler geçiyorsa yeni kodların master’a gelmesine izin verilir. Bu sayede programların çalışmasını bozacak kodların master’a gelmesi engellenir. Geliştirici sayısı arttıkça temiz bir test ortamı sağlamak zor olduğu için, çoğu yerde alt yapısı Docker olan sistemler kullanılır. Jenkins bir örnek olabileceği gibi, SaaS (Software as a Service) olan Bitbucket Pipelines, CircleCI gibi sağlayıcılar da Docker kullanarak hem maliyetleri düşür hem de testlerin izole çalışmasını sağlar.

Bu yazımızda, Go ile yazılmış bir kütüphaneyi Bitbucket Pipelines’da Docker kullanarak nasıl test edeceğimizi göstereceğiz. Diğer hazır yazılımlar da benzer şekillerde çalıştığından, içlerinde en kolayı olması sebebi ile Bitbucket Pipelines’ı seçtik. https://bitbucket.org/mustafaakin/pipelines-ornek/ adresine hayali bir matematik kütüpahnesi yaptık ve test olarak da 3 ile 5’in toplamını doğru yapıyor mu diye test yazdık. Tabi ki gerçek dünyada çok daha karışık testleriniz kodlarınızın beklendiği gibi çalıştığını test etmeli. Yazılım testi nedir, nasıl yazılmalıdır detaylı öğrenmek istiyorsanız Yazılım Test Süreçleri Eğitimimize göz atmanızı öneririm.

Bitbucket Pipelines çalışmak için kodun ana dizininde bitbucket-pipelines.yml adlı bir dosya beklemektedir. Bu dosyada kod master’a geldiğinde, yeni bir Pull Request açıldığında, ya da herhangi bir commit’te neler yapılacağı yazılır. Pipelines’ın tam özelliklerine buradan ulaşabilirsiniz. Bizim örneğimizde bu hayali Go kütüphanesini Go’nun 3 farklı versiyonu ile test edilmesini sağlayacağız. bitbucket-pipelines.yml dosyamızın içeriği ise şöyle:

pipelines:
  default:
    - step:
        image: golang:1.14.0
        script:
          - go test -v
    - step:
        image: golang:1.14.1
        script:
          - go test -v
    - step:
        image: golang:1.14.2
        script:
          - go test -v

Test pipeline’ımız 3 aşamadan oluşuyor. Her versiyon için sırayla, farklı taglerdeki go imajları ile go test -v komutu çalışıyor. Bu komut, Go dilinde bir klasördeki testlerin çalışmasını sağlıyor. Bu dosyayı commitleyip Bitbucket arayüzünden de Pipelines’ı aktifleştirince, bundan sonraki her güncellemede testler çalışıyor. Aşağıda bir örneğini görebilirsiniz:

Peki arka planda ne oldu? Bitbucket bu YAML dosyasını anlayıp, onları seri Docker komutlarına çeviriyor. Bizim verdiğimiz step lerden önce ise arka planda git clone işlemi gerçekleştirip yolladığımız değişikliği bir klasöre açıyor. Her step ise ayrı bir container’da çalıştığı için ise bu kodlar ise volume ler aracılığı ile birbiri ile paylaşılıyor.  Bu stepler başarılı olursa çıkış kodları 0 oluyor ve Pipelines arayüzünde yeşil olarak gözüküyor. Herşey bittikten sonra ise container’larımız ve geçici volume silinerek tüm izlerden kurtuluyor. Bitbucket ayarlarında eğer testler başarısız olursa master’a o kodun gelmesini engelleyebilirsiniz.

Test (CI) alt yapısında Docker kullanan çoğu sistem benzer şekilde çalışıyor. Burada yapılanları eğer bir servis sağlayıcı kullanmak istemiyorsanız, Jenkins kurup Docker eklentisini aktifleştirip de istediğiniz kişiselleştirmeleri yapabilirsiniz. Ayrıca Pipelines genel bir kavram olup, bunu test dışında Continuous Delivery (CD), yani programınızın paketlenip bir yerlere yollanması amacı ile de kullanabilirsiniz.

Tüm Docker ve Kubernetes Eğitimi için tıklayınız!

1

Mustafa Akın

SRE Architect @Atlassian Opsgenie
PhD Öğrencisi @Bilkent Üniversitesi

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?