AzureDevOps

Azure DevOps – CI/CD Build Deploy Docker Image

Merhaba

Bu makalede Azure DevOps üzerinde CI-CD pipeline ile custom Docker image oluşturmayı ve bu image Azure Container Registry üzerine push etmeyi ele alacağız.

Flow
-Microsoft hosted linux agent üzerinde custom Docker image build.
-Oluşturulan image Azure Container Registry üzerine push edeceğiz.
-Azure DevOps CD ile oluşturduğumuz image Azure App Service üzerinde ki containera deploy edeceğiz.

Gereksinimler
-Azure DevOps üzerinde bir organization oluşturulması.
-Azure subscription var olanı kullanabilirsiniz veya yeni oluşturabilirsiniz.
-Projenin github linki https://github.com/MicrosoftLearning/eShopOnWeb

1-Create Project on Azure DevOps

2-Import eShopOnWeb Git Repository
https://github.com/MicrosoftLearning/eShopOnWeb

3-Set Default Branch

4-Manage Service Connection

-Azure pipeline ile azure portal üzerinde ki external servislere connectionlar oluşturmak mümkün. Bu sayede docker image’larını azure üzerine push edeceğiz.

-Bunu yapabilmek için Service Principal’a ihtiyacımız var bu genelde azure subscription  connect olduğumuzda proje ayarları sayfasından otomatik olarak oluşturulmakta. Veya kendiniz manuel olarak ta oluşturabilirsiniz.

Azure Portal’a giriş yapıyorum ve Cloud Shell üzerinden az önce bahsettiğim Service Principal oluşturacağım.

-Subscription bilgilerimizi almak için CLI ekranında aşağıdaki bash komutlarını çalıştırıyoruz

subscriptionName=$(az account show --query name --output tsv)
subscriptionId=$(az account show --query id --output tsv)
echo $subscriptionName
echo $subscriptionId

Subscription Name ve ID bilgilerini değişkenlere aldık. Şimdi aşağıdaki komut ile Service Principal oluşturuyoruz. Ve export edilen bilgileri kaydedelim.

az ad sp create-for-rbac --name sp-az400-azdo --role contributor --scopes /subscriptions/$subscriptionId

-Azure DevOps da projemizde aşağıdaki path’e gelip Service Connection > Azure Resource Manager seçiyoruz.

-Bir sonraki ekranda connection için istenen bilgilerin girişini yapıyoruz.
*Subscription ID
*Subscription Name
*Service Principal ID
*Service Principal Key
*Tenant ID
*Service Connection Name (azure-connection)

5-Import and run the CI pipeline

-Bu aşamada projenin git reposunda bulunan docker CI yaml dosyasını Azure Devops’da bulunan Pipelines import edeceğiz.

Pipelines > New Pipeline > Azure Repos Git > eShopOnWeb > Existing Azure Pipelines YAML file > /.ado/eshoponweb-ci-docker.yml > Continue -Continue dedikten sonra aşağıdaki alanda pipeline içerisinde bulunan Subscription ID ve Resource Group alanlarını aşağıdaki gibi  güncelliyoruz. Ve Save and Run tıklıyoruz.

-Pipeline başarılı bir şekilde çalıştı.

-Bu CI pipeline (eshoponweb-ci-docker.yml)  temel olarak aşağıdaki görevleri yerine getirmekte.
1-Azure Portalda Resource Group oluşturuldu.

2-Bicep template ile Azure Container Registry deploy edildi.
Biceps Loc: eShopOnWeb/.azure/bicep/acr.bicep

3-Azure Container Registry login bilgilerini bir sonraki aşamada kullanmak için powershell ile acrLoginServer isimli bir parameter oluşturuyoruz. Daha sonra bu parametreyi Build ve Push tasklarında ACR’a otomatik olarak bağlanabilmek için kullanacağız.

Örnek:

4Docker BuildDockerfile > Docker Image oluşturuyoruz. Ve 2 tag ekliyoruz. (Latest ve Current BuildID)

5-Docker Push – Oluşturulan Image Azure Container Registry’e push ediyoruz.

Azure Portal’de  ACR kontrol ettiğimde başarılı bir şekilde push edilmiş görünüyor.


6-Import and run the CD pipeline

6.1 – New role assigned
Bu adımda azure portal üzerinden CD pipeline’nın içerisine ekleyeceğimiz yeni bir service connection oluşturacağız.
az ad sp list komutuyla azure active directory üzerinde sp-az400 isimli service principal id alıyoruz.

spId=$(az ad sp list --display-name sp-az400-azdo --query "[].id" --output tsv)
 echo $spId
 roleName=$(az role definition list --name "User Access Administrator" --query [0].name --output tsv)
 echo $roleName

-Aşağıdaki komut ile mevcut resource group name üzerinde bir role ataması yapıyoruz.

az role assignment create --assignee $spId --role $roleName --resource-group "rg-az400-container-NAME"

-Azure Portal üzerinden teyit amaçlı ilgili resource group üzerine gelerek kontrol edebilirsiniz.

6.2 – Import and run the CD pipeline

Azure DevOps > Pipelines>New Pipeline>Azure Repos Git > eShopOnWeb Repo>Existing Azure Pipelines YAML File> select /.ado/eshoponweb-cd-webapp-docker.yml > Continue

-Continue dedikten sonra aşağıdaki alanda pipeline içerisinde bulunan Subscription ID ve Resource Group alanlarını aşağıdaki gibi  güncelliyoruz. Ve Save and Run tıklıyoruz. Ve succesfull.

-Bu CD pipeline’da 2 adet steps altında -task mevcut.

1.Task IaaC mantığı kullanılarak Bicep dilinde oluşturulan bir template üzerinden Azure portal’de pipeline içerisinde belirttiğimiz rg-az400-container isimli resource group içerisine containerların çalışması için bir Azure App Service deploy ediyor.

-Azure Portal’de kontrol ediyoruz.

2.Task-Yine bicep template kullanılarak role ataması gerçekleştiriliyor.

6.3-Test
Azure portal üzerinde oluşturduğumuz App Service geliyoruz ve Browse tıklıyoruz.

-Ve websitem başarılı bir şekilde yanıt veriyor.

Custom Dockerfile üzerinden build ettiğimiz Docker Image başarılı bir şekilde Azure Container Registry push edip ordan da Azure App Service deploy ettik.

Note-1: /.azure/bicep/webapp-docker.bicep template’i bir App Service Plan oluşturur. Bu plan içerisinde de bir Web App(Linux) çalışır.

Template içerisinde yer alan ${acr.properties.loginServer}/eshoponweb/web:latest. Parameter ile her zaman bir önceki docker image referans alır.