Merhaba , bu makalemizde önceki makalemizin devamı niteliğindedir.
Bu makalede Azure DevOps üzerinde Pipeline kullanımına değineceğiz ve basit bir örnek gerçekleştireceğiz. Azure pipeline CI/CD (Continues Integration ve Continues Deployment) süreçlerimizi oluşturmamızı sağlayan Azure DevOps öğesidir. Hem agile hem de scrum metedolojilerini destekler. Alternatifleri Jenkins, Gitlab CI, Github Actions vb. uygulamaladır.
Azure Pipeline CI/CD süreçlerini yapabilmek için agentlara ihtiyaç duyar. Jenkins'te slave, gitlab CI ' da ise runner mantığında çalışır. Bu agentlar hem microsoft tarafından sağlanabilirken istersek kendi sunucularımızda bu agentları kurabiliriz.
Azure pipeline azure araçlarına entegre olduğu için oldukça kullanışlı ve işlerimizi kolaylaştırmaktadır. Bununla birkaç dakika da uygulamalarımızı Azure üzerinde deploy edebilmemiz mümkündür. Aşağıdaki pipeline ile yapılabilecek bir örnek görebiliriz.
Bir pipeline oluşturduğumuzda , repository branch içerisinde "azure-pipelines.yml" isminde bir dosya oluşturulur ve pipeline içeriği bu dosyaya yazılır. Gitlab CI da bu mantıkla çalışmaktadır.
Azure DevOps pipeline içerisinde kullanabileceğimiz hiyerarşi aşağıdaki gibidir.
Stages > Stage > Jobs > Job > Steps
Stepslerin içerisinde de scriptler, tasklar kullanılır. Aşağıda bununla ilgili bir örneği görebiliriz.
trigger:
- main
pool:
name: Self-Hosted Agent Pool
stages:
- stage: BirinciStage
jobs:
- job: BirinciStageBirinciJob
steps:
- script: echo "BirinciStageBirinciJob Steps Script"
displayName: BirinciStageBirinciJob
- job: BirinciStageIkinciJob
steps:
- script: echo "BirinciStageIkınciJob Steps Script"
displayName: BirinciStageBirinciJob
- stage: IkinciStage
jobs:
- job: IkinciStageBirinciJob
steps:
- script: echo "IkinciStageBirinciJob Steps Script"
displayName: IkinciStageBirinciJob
- job: IkinciStageIkinciJob
steps:
- script: echo "IkinciStageIkinciJob Steps Script"
displayName: IkinciStageIkinciJob
Bu pipeline çalıştırdığımızda aşağıdaki şekilde bir sonuç alacağız.
Tabiki bu hiyerarşiyi kullanmadan da oluşturulan pipeline çalışır. Örneğin; sadece steps adımını kullanılarakta pipeline yazılabilir. Bu kullanım tamamen yapınıza göre değişkenlik göstermektedir. Büyük yapılarda hiyerarşiye uymak pipeline nin okumasını kolaylaştıracaktır.
Ya da hiyerarşiyi jobs kısmından da başlatarak yazabiliriz.
jobs:
- job: BirinciJob
steps:
- script: echo "BirincJob Steps Script"
displayName: BirincJob
- job: IkinciJob
steps:
- script: echo "IkinciJob Steps Script"
displayName: IkinciJob
Şimdi bir Dockerfile üzerinden image oluşturup bunu DockerHub'a push eden bir pipeline yazalım ve bunu Azure Web Apps üzerinde deploy eden pipeline yazacağız.
Öncelikle agent'ı kendi sunucuma kuracağım.
Bu işlemlerden önce bir personel access token oluşturalım çünkü agentı konfigure ederken isteyecektir.
Sağ üst köşede bulunan User Settings > Personel Access Token > New Token ile oluşturuyoz ve bir isim veriyoruz. Yetki olarakta Agents Pool > Read and Manage seçmemiz yeterlidir.
Vereceği tokenı bir yere not alınız.
Agent kurulumuna geçebiliriz.
Project Settings > Agent Pools > New Pool diyerek bir pool oluşturuyorum. Bu pool birden fazla agentı barındırabilir. Ayarları aşağıdaki şekilde yaptıktan sonra oluşturuyoruz.
Ardından oluşturduğumuz poola tıklayıp agent sekmesine geliyoruz ve "New Agent"'a tıklıyoruz. Burada microsoft bize agentın indirme linkini ve hangi işletim sisteminde nasıl kurulacağını açıklamış. Ben linux seçtim ve microsoftunda belirttiği aşağıdaki komutları çalıştırdım.
wget https://download.agent.dev.azure.com/agent/4.264.2/vsts-agent-linux-x64-4.264.2.tar.gz
tar xvfz vsts-agent-linux-x64-4.264.2.tar.gz
./config.sh
config.sh scriptini çalıştırdıktan sonra bizim hangi organizasyona ve oluşturduğumuz agent pool'un ismini ve bu agent için bir isim girmemiz gerekmektedir.
Server URL: https://dev.azure.com/organizasyon_ismi
Enter (Y/N) Accept the Team Explorer Everywhere license agreement now? (press enter for N) > Y
>> Connect:
Enter server URL > https://dev.azure.com/akturkbilisim
Enter authentication type (press enter for PAT) > PAT
Enter personal access token > ************************************************************************************
Connecting to server ...
>> Register Agent:
Enter agent pool (press enter for default) > MySelfHostedAgent
Enter agent name (press enter for ceph-node) > pipeline-agent
Scanning for tool capabilities.
Connecting to the server.
Successfully added the agent
Testing agent connection.
Enter work folder (press enter for _work) >
2025-11-08 18:08:18Z: Settings Saved.
Bu işlemlerden sonra AzureDevOps üzerinde "Agent Pools > Agent" sekmesinden kontrol ettiğimizde durumun offline olduğunu görebiliriz. Bunun için
./run.sh scriptini çalıştırıyoruz ama bu bize script ön planda çalışmaktadır yani terminal session kapandığında agent servisi duracaktır. İstersek bu agent servisini bir systemd servisine dönüştürebiliriz. Microsoft bunun içinde svc.sh isminde bir script oluşturmuş.
./svc.sh install, ile systemd servisi haline gelecektir ve aşağıdaki komutla servisi başlatıyoruz. Bu işlemden sonra agent online durumua gelecektir.
systemctl restart vsts.agent.akturkbilisim.MySelfHostedAgent.pipeline\x2dagent.service
Benim kodlarım Github üzerinde olduğu için Github hesabımı da entegre edeceğim. "Project Settings > Github Connection > New Connection" sekmesinden hesabımı bağlayacağım. Ben github hesabımıda "Personel Access Token" ile bağlayacağım için github üzerinde de oluşturmam ve yetkilendirmem gerekiyor. Bunu burada anlatmayacağım.
Artık pipeline yazma aşamasına gelebiliriz.
Pipeline sekmesinden New Pipeline diyerek oluşturuyoruz bize bu pipelinenin neresi ile entegre olacağını söylüyor ben Github ile ilerleyip repository'imi seçiyorum .
Ardından bize hazır olarak kullanabileceğimiz şablonlar sunuyor , ilk kez olacağı için "Stater Pipeline" seçebiliriz eğer pipeline dosyamız repositoryimizde var ise "Select an existing YAML file" seçeneğini seçebiliriz. Zaten bu templateleri daha sonradan da seçebiliriz.
trigger:
- main
pool:
name: MySelfHostedAgent
variables:
image: suleymanakturk/azurepipeline
imageTag: $(build.buildID)
jobs:
- job: BuildImage
steps:
- task: Docker@2
inputs:
command: 'build'
Dockerfile: '**/Dockerfile'
repository: $(image)
tags: |
latest
$(imageTag)
displayName: Image Build
- job: PushImage
steps:
- task: Docker@2
inputs:
containerRegistry: 'DockerHubService'
repository: $(image)
command: 'push'
tags: |
latest
$(imageTag)
dependsOn: BuildImage
displayName: Image Push Registry
- job: DeployAzureAppsServices
steps:
- task: AzureWebAppContainer@1
inputs:
azureSubscription: 'Azure subscription 1'
appName: azurePipelineWebApp
containers: $(image):latest
displayName: Deploy Web Apps
dependsOn: PushImage
Trigger: Pipeline nın ne ile tetikleneceğini belirtir. Burada main branche commit geldiğinde tetiklenecektir.
Pool: Bu pipelinenin üzerinde çalışacağı agent pooldur. Biz oluşturduğumuz poolu verdik.
Ben hem build hem de push için ayrı job oluşturdum istersek ikisini aynı job içerisinde de gerçekleştirebiliriz.
containerRegistry: Container registryi Project Settings > Service Connection > Docker Registry diyerek oluşturuyoruz ve pipeline içerisinde kullanıyoruz.
DisplayName: Pipeline adımlarının istediğimiz gibi isimlendirmemizi sağlar. Aşağıdaki gibi görünecektir.
**WebApps **kısmı için öncelikle "Webapp for Container" oluşturmamız gerekiyor. Bir kere oluşturup her pipeline de image güncellenecektir. Bu yüzden manuel oluşturacağız.
Azure GUI üzerinden "App Services" servisine tıklayıp create "Web App" dedikten sonra publish metodu container seçiyoruz ve container sekmesinden image aşağıdaki görselde göründüğü gibi yapıyoruz. Burada örnek olduğu için image public ama production da private ise size username/password soracaktır.
Burada image tag'ini latest yaptık çünkü pipeline her çalıştığında yeni imageyi latest tag'i ile etiketleyecektir.
Wepapp oluşturduğumuzda erişim sağlayabilmemiz için bir URL verecektir. Bu URL üzerinden erişim sağlayabiliriz. Bizim webapp paketimiz basic olduğu için kendimize ait domain ekleyemiyoruz. Ama daha üst paketlerde kişisel domain ve SSL sertifikamızı kullanabiliriz. Aşağıdaki gibi appname + rastgele bir değer + region şeklinde bir URL oluşmaktadır.
azurepipelinewebapp-dpe0a7vxh9f1dub6.italynorth-01.azurewebsites.net
Azure Pipeline ' nin en güzel yanlarından bir tanesi kullanmak istediğimiz ürün ile ilgili hazır şablonlar vermesi ve bizim bu alanları tamamladıktan sonra pipeline içerisine kendisinin eklemesidir.
Örneğin; Bir uygulamayı kubernetes üzerine deploy etmek istediğimizde önceden hazırlanmış "Deploy to Kubernetes" templateyi kullanarak ve gerekli alanları doldurup Add dedikten sonra pipeline içerisine eklenecektir.
Bir sonraki makalede görüşmek üzere...












Top comments (0)