Google Cloud App Engine ile CI/CD Pipeline Süreçler İnşa etmek

Yunus emre
SabancıDx
Published in
4 min readFeb 2, 2021

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.

Create your project

İş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.

--

--

Yunus emre
SabancıDx

Devops || Middleware Engineer who is into cloud and Linux fundamentals. Learning Openshift & keeping on Google Cloud Platform.