AzureDevOps

Azure DevOps CI/CD(Triggers) Automation Deploy to Azure Cloud

Merhaba bu yazımızda azure devops ile continuous integration ve continuous deployment süreçlerini otomatik hale getireceğiz.
Kaynak kodunda herhangi bir değişiklik olduğunda build ve release pipeline süreçlerimiz otomatik olarak çalışacak.

Prerequisites
-Azure DevOps account (free)
-Azure Cloud Portal (free for appservice)
-Docker hub account
-GitHub Account

1-Azure DevOps üzerinden projemizi oluşturalım.

2-Proje ile oluşan Repo’yu bilgisayarımıza clone yapıyoruz.

Kaynak kodlarımı ve Dockerfile dosyamı klasöre kopyalıyorum

git status ile ilgili klasörü kontrol ettiğimizde henüz dosyaların senkronize olmadığını görüyoruz ve git add . ile kodlarımızı senkronluyoruz.

Tekrar git status ile kontrol ettiğimizde hepsi tracked durumda olduğunu görüyoruz artık azure devops’da bulunan repoya commit ve push edebiliriz.
$ git commit -m "My first commit-Omer"

$ git push

-Tüm kaynak kodlarımız azure devops repo’ya gelmiş durumda.

Not: Gitbash ile azure devops arasında güvenli iletişim kurmak için kendi bilgisayarınızdan bir ssh key üretip bunu azure devops üzerine kaydetmeniz gerekmektedir. Aksi halde repo’ya push ederken permission denied hatası alabilirsiniz.
Nasıl yapıldığına dair link ekliyorum: https://learn.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=azure-devops

3-Create Service Connections

-Projeye başlamadan önce azure devops ile docker hub ve azure portal arasındaki service connectionları kuruyoruz.

1-Azure DevOps Portal > tweetapp project > Project Settings > Service Connections > Azure Resource Manager > Service Principal automatic
Aşağıdaki gibi dolduruyoruz.

2-Azure DevOps Portal > tweetapp project > Project Settings > Service Connections > Docker registry
Docker hub’a göndereceğimiz imajlar için bir service connection oluşturduk.

3-Dockerhub üzerinde bir repository oluşturuyoruz.

4-Azure Portal üzerinde aşağıdaki ayarlarda bir app service oluşturuyoruz. Daha sonra uygulamamızı buraya deploy edeceğiz.


4-Create Build Pipeline

-Pipelines > Create Pipeline > Use classic editor > select a source (azure repos) > select a template (empty job)

-Agent job 1 + işaretine tıklayarak buildAndPush isimli bir docker taski ekleyip içini az önce oluşturduğumuz bilgilerle dolduruyoruz.

Triggers > Kodda değişiklik olduğunda otomatik olarak yeni image oluşturulması ve repository’e push edilebilmesi için Enable continuous integration seçiyoruz.

4-Create Release Pipeline

-Pipeline > Releases > New Pipeline > Artifacts > Add an Artifact

-Bu kısımda artifact aslında docker image diyebiliriz. Continuous deployment trigger enabled duruma getiriyoruz. Yani bu dockerhub reposuna yeni bir image build edilip pushlandığında bu release pipeline otomatik olarak çalışacaktır. Daha sonra Add a Stage tıklıyoruz

Empty Job seçiyoruz

-Aşağıdaki alanları kendi ortamımıza göre giriyoruz.

-Release pipeline hazır durumda. Yeni bir image repoya geldiğinde bunu otomatik olarak azure portal’de ki web app service deploy edecek.

5-Create First Deployment

-Herşey hazır olduğuna göre artık test için local git repomda index.html sayfasında küçük bir değişiklik yapıp bunu azure repoya pushlayacağım.
Şurada ufak bir değişiklik yapıp kaydettim ve git status ile kontrol ettiğimde bu değişiklik gözüküyor git add . ile commite hazır hale getiriyorum.

-Commit > Push diyorum ve azure repo’da değişikliği kontrol ediyorum.

-Kodda yaptığım değişiklik sonrası build pipeline otomatik olarak trigger olmuş.

-Log detaylarında da görüldüğü gibi dockerhub’da bulunan repoya buildtag ile push edilmiş durumda.

-Image reposuna yeni bir image push edildiğinden dolayı release pipeline otomatik olarak çalışmış.

-Logları kontrol ediyoruz. Dockerhub üzerinden image, build-id ile alınmış.

-Azure portal üzerinde ki app service aynı repo bilgisini çekmiş. Uygulamayı ilgili url’den kontrol ediyoruz. Sonuç başarılı ve uygulamamız ayakta.

-Firs yazarken hata yapmışız 🙂 CI-CD ile hızlıca düzeltelim.
Commit > Push diyorum.

-Build pipeline çalıştı.

-Image dockerhub repoya 109 tag ile gönderildi.

-Release pipeline otomatik olarak 109 tag ile ilgili artifacti azure app servis üzerine deploy etti.

-Sitemiz güncellenmiş durumda.