Google Cloud App Engine ile CI/CD Pipeline Süreçler İnşa etmek
App Engine, web uygulamalarınızın auto-deploy buildlerini gerçekleştirmenize yarayan Google tarafından sunulan bir geliştirme platformudur.
DevOps alanında çalışanlar olarak projelerimizde ve müşterilerimizin taleplerine daha hızlı cevap verebilmek adına çeşitli teknolojiler, bunların yan ürünleri ve bu araçları daha kolay ve güvenilir hatta ekonomik kullanmamızı sağlayan Bulut Teknolojilerine yöneliyoruz. Sürekli Entegrasyon ve Sürekli Dağıtma (CI/CD) terimlerine yakından bakabilmek, ekibimize yeni katılan arkadaşlarımızın bu kültüre daha kolay aşina olmasını sağlayabilmek adına bizler de internal eğitimlerle bildiklerimizi paylaşarak pekiştirmekteyiz. Bu çalışmamızda GCP (Google Cloud Platform)’nin bize sağladığı kolaylıklarla uçtan uca CI/CD pipeline’mızı gelin birlikte kuralım.
Sıfırdan başladığımızı düşünecek olursak işe Projenizi seçmek&yaratmakla başlayabilirsiniz.
İşlemlerinize Cloudshell’de, Konsol editöründe veya lokalinizdeki editörde devam edebilirsiniz. Bu özgürlüğe sahip olmak için yapmanız gereken tek şey Cloud SDK’yı indirmek ve Google Cloud için ‘Authorize’ etmek olacaktır. Ayrıca VSCode içerisindeki Cloud extensionları sayesinde biçimlendirmelerinizi daha kolay yapıp daha kolay kod review, bugfix ve paket import edebileceksiniz.
Install SDK link: https://cloud.google.com/sdk/docs/install
İkinci adım cloud repository’nizi oluşturmak olacaktır, bundan önce Cloud Source Repositories API’yi etkinleştirmeniz gerektiğini unutmayın.
https://console.cloud.google.com/flows/enableapi
#gcloud init
hello-world adında bir repo oluşturun:
# gcloud source repos create hello-world
Yarattığınız repoyu lokal gitinize klonlayın:
#gcloud source repos clone hello-world
Bu adımdan sonra reponuzu editörünüzde görebiliyor olmanız gerekiyor.
Sırasıyla main.py (Source kodunuzun olduğu uygulamanızın neyi çalıştırdığı base kod)
#!/usr/bin/env python
import webapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Open your ingress to everyone')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
app.yaml dosyalarını oluşturun: (Uygulamanızı dağıtmanızı sağlayacak olan konfigürasyon bilgilerini içeren dosya)
script: main.app
libraries:
- name: webapp2
version: "2.5.2"
ve daha sonrasında CI/CD Pipeline'da otomasyonu sağlayacak olan Cloudbuild.yaml dosyamızı oluşturmalıyız.
steps:
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy"]
timeout: "1600s"
Dizinimize gidip bütün dosyalarımız cloud repomuzdaki master branch'imize push edelim.
#cd hello-world
# git add . // bu dizindeki hepsini kapsa
#git commit -m "commit message" //yaptığımız değişiklikleri onaylıyoruz gibi düşünebilirsiniz.
#git push origin master
Reponuzu Cloud'da görüntülemek için
https://source.cloud.google.com/repos
Bizdeki görüntü;
Sıra geldi uygulamamızı App Engine’e dağıtmaya diğer tabirle biz kodumuzu (source repomuzu) içine atacağız gerisini o halledecek :)
Örnek uygulamamızı deploy edelim:
#gcloud app deploy app.yaml
VSCode Authorize ettiyseniz birazdan yazacağınız komut otomatik olarak default tarayıcınızda uygulamanızın ön yüzünü getirir; konsol arayüzünde ise web görünümüne tıklayıp veya CLI’da verdiği linkten ulaşabilirsiniz.
#gcloud app browse
alacağınız url formatı genellikle https://$PROJECT_ID.location.r.appspot.com olacaktır.
https://deployment-emre1.ue.r.appspot.com // Daha sonra bunun ingress ile nasıl external kullanıcılara da açılacağını&kapanacağına göz atacağız.
CI/CD entegrasyonumuza geçmeden kod değişikliği ve manual deployment gerçekleştirelim.
Editörünüzde main.py dosyanızda bir değişiklik yapın ardından yeniden lokal git’e ekleyip commit ve push’layın ve
#!/usr/bin/env python
import webapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('First change inside big code')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
#gcloud app deploy
Tek komut koşmak küçük bir projede ilk bakışta bize zor gelmeyebilir fakat çoklu organizasyonlarda, geniş süreçlerde ve karmaşık takımların ve departmanların ortak noktada birleştiğini düşündüğünüzde özellikle operasyon ekiplerine ekstra mesai demektir, bunun yanında yapılacak hataları ve örnek uygulamamızda master branch üzerinde çalıştığımızı hesaba katmıyoruz bile.
Şimdi otomatik buildimizi oluşturalım, ilk adım olarak https://console.cloud.google.com/cloud-build/settings/service-account. linkinden servis hesabı izinlerinizin etkin olduğunu (değilse etkinleştirin) emin olun.
https://console.cloud.google.com/cloud-build/triggers linkine gidip yeni bir trigger oluşturalım.
Cloudbuild dosyamızı da tam burada ‘Build Configuration’ altında kullanıyoruz.
https://console.cloud.google.com/cloud-build/triggers
Tekrar main.py aracılığıyla kodumuzda ufak bir format değişikliği yapalım.
#!/usr/bin/env python
import webapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Deployed automatically!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
#git add .
#git commit -m “Update auto”
#git push origin master
değişikliklerimizin işe yaradığını endpointte ve Build history loglarından takip edelim.
#gcloud app browse veya sayfanızı yenileyin
Son olarak uygulamanızın erişimini dışarıya açtığınızdan emin olmak için GKE (Google Kubernetes Engine) altında cluster ayarlarınızda ingress konfigürasyonunuza HTTP Enabled izni vermeniz gerekmektedir.
Clusterınıza VSCode ile bağlanmak, Dockerize ettiğimiz (“Go”) uygulamamız için create edeceğimiz deployment ve servis yaml’larınızı yönetebileceğiniz CLI’ı lokalinize bağlamak için;
#gcloud cloud-shell ssh — authorize-session
Project_ID’nizi öğrenmek için;
#gcloud config get-value project
#gcloud config set project PROJECT_ID
https://console.cloud.google.com/kubernetes/list linkinden clusterlarınızı listeyin ve ingresinizi deploy ettiğiniz clusterı seçip edit mode’a gelin.
Add-ons altında HTTP Load balancing -> Enabled
Bizim endpointimizi ziyaret etmek isterseniz :)
https://deployment-emre1.ue.r.appspot.com
veya hazırdaki repoyu klonlamak için
#gcloud source repos clone hello-world — project=deployment-emre1
Bir sonraki yazımızda görüşmek üzere sağlıkla, hoşça kalın.