Bu makalede ASP.NET Core uygulamasını Jenkins kullanarak IIS’de yayınlama konusuna değineceğim. Bu makalenin konusu pipeline hazırlamak olduğu için Jenkins kurulumu ile ilgili aşağıdaki sayfadan yardım alabilirsiniz.
Senaryomuzda deployment yapacağımız hedef makine ve Jenkins kurulu olan makine farklı olacaktır ki Jenkins için dedike bir sunucu ayarlamanız gerekmektedir. Zira job’lar çalışırken kaynaklarınızı fazlasıyla tüketebilir :)
Pipeline aşağıdaki 4 adımdan oluşacak.
Checkout : Github’dan kaynak kod çekilecek.
Build : Kaynak kod derlenecek.
Deploy : Hedef makineye deployment yapılacak.
Pipeline’ı hazırlamadan önce aşağıdaki gereksinimleri sağlamanız gerekmektedir.
1. Git’in Kurulması
Checkout yapılabilmesi için Jenkins makinesinde Git’in kurulu olması gerekmektedir. Aşağıdaki adresten Git’i kurabilirsiniz.
2. NET Core SDK’nın Kurulması
Build yapılabilmesi için Jenkins makinesinde .NET Core SDK’nın kurulu olması gerekmektedir. Aşağıdaki adresten uygulamanızdaki versiyona göre ilgili SDK’yı kurabilirsiniz.
3. Jenkins Makinesine MsDeploy’un Kurulması
Deploy yapılabilmesi için Jenkins makinesinde msdeploy’un kurulu olması gerekmektedir. Bunun için aşağıdaki adresten ilgili kurulumu indirip yükleyebilirsiniz.
4. Güvenli Makine Tanımının Yapılması
Jenkins makinesi ve hedef makine aynı domain’de değilse Jenkins makinesinden hedef makineye deployment yapılamayacaktır. Aşağıdaki gibi bir hata verecektir.
Bu hatanın çözümü için Jenkins makinesine hedef makinenin güvenli olduğunu belirtmeniz gerekmektedir. Bunun için Powershell’de aşağıdaki komut satırını çalıştırabilirsiniz.
winrm set winrm/config/client '@{TrustedHosts="0.0.0.0"}'
5. Web Management Service’in Kurulması
Hedef makinesine uzaktan deployment yapılabilmesi için hedef makinesindeki IIS’de Web Management Service’in kurulu ve çalışır olması gerekmektedir. Servisin kurulu olup olmadığını kontrol etmek için IIS’i açın. Sol taraftaki “Connections” penceresinden sunucunuzu seçin. Sağ bölümde “Management” sekmesinin altında “Management Service” modülünü kontrol edin.
Bu modül gözükmüyor ise Windows özelliklerinden Management Tools’u kurabilirsiniz.
6. Web Management Service’in Aktif Edilmesi
Modülün çalışır vaziyette olması gerekmektedir. Modülün üstüne çift tıklayarak “Enable Remote Connections” seçeneğini aktip edip “start” yapabilirsiniz.
7. Hedef Makineye MsDeploy’un Kurulması
Hedef makinesinde MsDeploy’un kurulu olması gerekmektedir. Bunun için aşağıdaki adresten ilgili kurulumu indirip yükleyebilirsiniz.
Kurulumu yaparken “Custom” seçeneğini seçerek "IIS Deployment Handler" özelliklerini aktif etmelisiniz.
Servisin başarılı şekilde kurulduğu kontrol etmek için IIS’i açın. Sol taraftaki “Connections” penceresinden sunucunuzu seçin. Sağ bölümde “Management” sekmesinin altında “Management Service Delegation” modülünü kontrol edin.
Her şey hazır :) Artık Jenkins’de pipeline’nı hazırlayabiliriz.
Jenkins’i açıp “New Item > Pipeline” yolunu izleyerek “job” oluşturun.
Pipeline bölümüne aşağıdaki script’i yapıştırın.
İşte bu kadar. Artık Build Now yapabilirsiniz. Kolay gelsin.
Yorumlar
.NET 5 (Core) için bu süreci çalıştırmak istiyorum. Aşağıdaki gibi son adıma kadar geldim fakat son adımda IIS üzerine deploy işlemini gerçekleştiremiyorum. Sizin örneğinize denk geldim. Son adımdaki işlemi uygulamak istedim fakat bahsettiğiniz iicredential ekleme seçeneğinin detayını anlamış değilim. Tür seçenekleri içerisinde IIS ile ilgili bir seçenek gelmiyor. Diğer seçeneklerden birini seçsek bile bilgilere neyi gireceğiz. IIS sunucusunun administrator bilgilerine mi ihtiyaç duyuyoruz bu aşamada?
Geldiğim son aşama eksik hali.
pipeline {
agent any
environment {
dotnet = 'C:\\Program Files\\dotnet\\dotnet.exe'
}
stages {
stage('Checkout') {
steps {
git credentialsId: 'CLIENT_ID', url: 'GIT_PROJECT_URL', branch: 'master'
}
}
stage('Clean') {
steps {
bat 'dotnet clean'
}
}
stage('Build') {
steps {
bat 'dotnet build --configuration Release'
}
}
}
}
Deployment, Jenkins makinesinden IIS makinesine msdeploy aracılığıyla yapılıyor. Doğal olarak IIS makinesine deployment yapacak bir kullanıcı bilgisine ihtiyaç duyuluyor. Yani IIS makinesine erişebilen bir kullanıcı bilgisi. Bu kullanıcı bilgilerini Jenkins'e credential olarak tanımlayıp, pipeline'da id'sini belirtmek gerekli.
Jenkins’de sol menüden Credentials sayfasına erişip “xxx” adında bir credentials eklemeniz gerekli. Jenkins sayfanızın sonuna aşağıdaki path’i ekleyerek ilgili sayfaya ulaşabilirsiniz.
/credentials/store/system/domain/_/newCredentials
aşağıdaki gibi hata aldım. yardımcı olabilir misiniz ?
Could not find credentials entry with ID 'iis-credential'
Jenkins'de sol menüden Credentials sayfasına erişip "iis-credential" adında bir credentials eklemeniz gerekli. Jenkins sayfanızın sonuna aşağıdaki path'i ekleyerek ilgili sayfaya ulaşabilirsiniz.
/credentials/store/system/domain/_/newCredentials
IIS server kullanıcı adı ve şifreyi nereye giriyoruz
Çok güzel ve yararlı bir makale olmuş, çok teşekkürler. Kafama takılan bir konu var. Her deployda hedef makinede silinebilecek fakat silinmesini istemediğimiz pdf, excel, resim dosyaları gibi dosya ve klasörler var. Bunları nasıl muhafaza edebiliriz. Her deploy edildiğinde bunların silinmesinden edişe ediyorum.
Anladığım kadarıyla uygulama dizinine dosya upload ediyorsunuz. Deployment yapılan konumda uygulama dosyaları dışında dosya bulunmamalı. Her deployment ile uygulama konumu temizlenmeli. Ama bu şekilde devam edecekseniz de iki tane daha stage eklenebilir. Deployment öncesinde dosyalar farklı bir konuma kopyalanır. Deployment sonrası dosyalar tekrar uygulama konumuna kopyalanabilir.
Jenkins'in kurulu olduğu windows kullanıcısı ile dotnet sdk'nın kurulu olduğu windows kullanıcısı farklı olabilir mi? Örneğin Jenkins administrator kullanıcısında kurulu olup dotnet sdk Ahmet kullanıcısında kurulu olabilir. Böyle bir durumda pipeline build yaptığınızda dotnet komutu bulunamaz.