Linux'ta Azure Uygulaması Hizmeti'ne Python web uygulaması dağıtmak için GitHub Actions ile CI/CD kullanma

Linux üzerinde Azure Uygulaması Hizmeti'ne bir Python web uygulaması dağıtmak için GitHub Actions sürekli tümleştirme ve sürekli teslim (CI/CD) platformunu kullanın. GitHub Actions iş akışınız kodu otomatik olarak oluşturur ve depoya bir işleme olduğunda App Service'e dağıtır. GitHub Actions iş akışınıza test betikleri, güvenlik denetimleri ve çoklu dağıtımlar gibi başka otomasyonlar ekleyebilirsiniz.

Uygulama kodunuz için depo oluşturma

Kullanmak için zaten bir Python web uygulamanız varsa, bunun bir GitHub deposuna işlendiğine emin olun.

Çalışmak için bir uygulamaya ihtiyacınız varsa, konumundaki depoyu https://github.com/Microsoft/python-sample-vscode-flask-tutorialçatallayabilir ve kopyalayabilirsiniz. Kod, Visual Studio Code'daki Flask öğreticisinden alınıyor.

Dekont

Uygulamanız Django ve SQLite veritabanı kullanıyorsa bu öğreticide çalışmaz. Django uygulamanız PostgreSQL gibi ayrı bir veritabanı kullanıyorsa bu öğreticiyi kullanabilirsiniz. Django hakkında daha fazla bilgi için bu makalenin devamında Django ile ilgili dikkat edilmesi gerekenler bölümüne bakın.

Hedef Azure Uygulaması Hizmeti oluşturma

App Service örneği oluşturmanın en hızlı yolu, etkileşimli Azure Cloud Shell aracılığıyla Azure komut satırı arabirimini (CLI) kullanmaktır. Cloud Shell, Git ve Azure CLI'yi içerir. Aşağıdaki adımlarda az webapp up kullanarak hem App Service'i oluşturacak hem de uygulamanızın ilk dağıtımını yapacaksınız.

1. Adım. https://portal.azure.com adresinden Azure portalında oturum açın.

2. Adım. Portal araç çubuğunda Cloud Shell simgesini seçerek Azure CLI'yi açın.

Screenshot showing how to open Azure Cloud Shell in Azure portal.

3. Adım. Cloud Shell'de açılan listeden Bash'i seçin.

Screenshot showing an Azure Cloud Shell Bash shell in Azure portal.

4. Adım. Cloud Shell'de git clone kullanarak deponuzu kopyalayın. Örneğin, Flask örnek uygulamasını kullanıyorsanız komutu şu şekildedir:

git clone https://github.com/<github-user>/python-sample-vscode-flask-tutorial.git

github-user> değerini deponun çatalını oluşturduğunuz GitHub hesabının adıyla değiştirin<. Farklı bir uygulama deposu kullanıyorsanız, GitHub Actions'ı burada ayarlayacaksınız.

Dekont

Cloud Shell, cloud-shell-storage-your-region<> adlı kaynak grubundaki bir Azure Depolama hesabı tarafından desteklenir. Bu depolama hesabı, kopyalanan depoyu depolayan Cloud Shell'in dosya sisteminin bir görüntüsünü içerir. Bu depolama için küçük bir maliyet vardır. Bu makalenin sonunda, oluşturduğunuz diğer kaynaklarla birlikte depolama hesabını silebilirsiniz.

Bahşiş

Cloud Shell'e yapıştırmak için Ctrl+Shift+V'yi kullanın veya sağ tıklayıp bağlam menüsünden Yapıştır'ı seçin.

Adım 5. Cloud Shell'de dizini Python uygulamanızın yer aldığı depo klasörüne dönüştürerek az webapp up komutunun uygulamayı Python olarak tanımasını sağlayın. Örneğin, Flask örnek uygulaması için:

cd python-sample-vscode-flask-tutorial

6. Adım. Cloud Shell'de az webapp up komutunu kullanarak bir App Service oluşturun ve başlangıçta uygulamanızı dağıtın.

az webapp up --name <app-service-name> --runtime "PYTHON:3.9"

Azure'da benzersiz bir App Service adı belirtin. Ad 3-60 karakter uzunluğunda olmalıdır ve yalnızca harf, sayı ve kısa çizgi içerebilir. Ad bir harfle başlamalı ve bir harf veya numarayla bitmelidir.

Kullanılabilir çalışma zamanlarının listesini almak için kullanın az webapp list-runtimes . PYTHON|X.Y Python sürümü olan X.Y biçimini kullanın.

App Service'in konumunu parametresiyle --location de belirtebilirsiniz. Kullanılabilir konumların az account list-locations --output table listesini almak için komutunu kullanın.

7. Adım. Uygulamanız özel bir başlangıç komutu kullanıyorsa az webapp config komutunu kullanın. Uygulamanızın özel başlangıç komutu yoksa bu adımı atlayın.

Örneğin, python-sample-vscode-flask-tutorial uygulaması, aşağıdaki gibi kullanabileceğiniz bir başlangıç komutu içeren startup.txt adlı bir dosya içerir:

az webapp config set \
  --resource-group <resource-group-name> \
  --name <app-service-name> \
  --startup-file startup.txt

Kaynak grubu adını önceki az webapp up komutun çıktısından bulabilirsiniz. Kaynak grubu adı azure-account-name>_rg_ ile <başlar.

8. Adım: Çalışan uygulamayı görmek için bir tarayıcı açın ve http://< app-service-name.azurewebsites.net> adresine gidin.

Genel bir sayfa görürseniz App Service'in başlatılması için birkaç saniye bekleyin ve sayfayı yenileyin. Genel sayfayı görmeye devam ederseniz, doğru klasörden dağıtılıp dağıtılmadığını denetleyin. Örneğin, Flask örnek uygulamasını kullanıyorsanız, bu klasör python-sample-vscode-flask-tutorial klasörüdür. Ayrıca Flask örnek uygulaması için başlangıç komutunu doğru ayarladığınızdan da denetleyin.

App Service'te sürekli dağıtımı ayarlama

Aşağıdaki adımlarda sürekli dağıtım (CD) ayarlayacaksınız. Bu, bir iş akışı tetiklendiğinde yeni bir kod dağıtımının gerçekleştiği anlamına gelir. Bu öğreticideki tetikleyici, çekme isteği (PR) gibi deponuzun ana dalında yapılan herhangi bir değişikliktir.

1. Adım. az webapp deployment github-actions add komutuyla GitHub Action ekleyin .

az webapp deployment github-actions add \
  --repo "<github-user>/<github-repo>" \
  --resource-group <resource-group-name> \
  --branch <branch-name> \
  --name <app-service-name> \
  --login-with-github

parametresi, --login-with-github kişisel erişim belirteci almak için etkileşimli bir yöntem kullanır. Kimlik doğrulamasını tamamlamak için istemleri izleyin.

App Service'in kullandığı adla çakıştıran mevcut bir iş akışı dosyası varsa üzerine yazılıp yazılmayacağını seçmeniz istenir. --force Sormadan üzerine yazmak için parametresini kullanın.

Add komutu ne yapar:

  • Deponuzda yeni iş akışı dosyası oluşturur: .github/workflows/<workflow-name.yml>; dosyanın adı App Service'inizin adını içerir.
  • App Service'iniz için gizli diziler içeren bir yayımlama profili getirir ve bunu GitHub eylem gizli dizisi olarak ekler. Gizli dizinin adı AZUREAPPSERVICE_PUBLISHPROFILE_ ile başlar. Bu gizli diziye iş akışı dosyasında başvurulur.

2. Adım. az webapp deployment source show komutuyla kaynak denetimi dağıtım yapılandırmasının ayrıntılarını alın.

az webapp deployment source show \
  --name <app-service-name> \
  --resource-group <resource-group-name>

Komutun çıkışında ve branch özellikleri için repoUrl değerleri onaylayın. Bu değerler önceki adımda belirttiğiniz değerlerle eşleşmelidir.

GitHub iş akışı ve eylemleri açıklandı

İş akışı, deponuzdaki /.github/workflows/ yolundaki bir YAML (.yml) dosyası tarafından tanımlanır. Bu YAML dosyası, GitHub deposuyla ilişkili otomatik bir işlem olan iş akışını oluşturan çeşitli adımları ve parametreleri içerir. GitHub'da iş akışıyla herhangi bir proje oluşturabilir, test edebilir, paketleyebilir, yayımlayabilir ve dağıtabilirsiniz.

Her iş akışı bir veya daha fazla işten oluşur. Sırayla her iş bir adım kümesidir. Son olarak, her adım bir kabuk betiği veya bir eylemdir.

App Service'e dağıtım için Python kodunuzla ayarlanan iş akışı açısından iş akışı aşağıdaki eylemlere sahiptir:

Eylem Açıklama
Ödeme GitHub Actions aracısı olan bir çalıştırıcıdaki depoya göz atın.
setup-python Çalıştırıcıya Python yükleyin.
appservice-build Web uygulamasını oluşturun.
webapps-deploy Azure'da kimlik doğrulaması yapmak için yayımlama profili kimlik bilgilerini kullanarak web uygulamasını dağıtın. Kimlik bilgisi bir GitHub gizli dizisinde depolanır.

İş akışını oluşturmak için kullanılan iş akışı şablonu Azure/actions-workflow-samples şeklindedir.

İş akışı, belirtilen dala gönderme olaylarında tetikleniyor. Olay ve dal iş akışı dosyasının başında tanımlanır. Örneğin, aşağıdaki kod parçacığı, iş akışının ana dala gönderme olaylarında tetiklenmiş olduğunu gösterir:

on:
  push:
    branches:
    - main

OAuth yetkili uygulamaları

Sürekli dağıtımı ayarladığınızda, GitHub hesabınız için yetkili bir OAuth Uygulaması olarak Azure Uygulaması Hizmetini yetkilendirmiş olursunuz. App Service, .github/workflows</workflow-name.yml> içinde bir GitHub eylem YML dosyası oluşturmak için yetkili erişimi kullanır. Tümleştirmeler/Uygulamalar bölümünde, GitHub hesaplarınız Ayarlar yetkili uygulamalarınızı görebilir ve izinleri iptal edebilirsiniz.

Screenshot showing how to view authorized OAuth Apps for a GitHub account.

İş akışı yayımlama profili gizli dizisi

Depoya eklenen .github/workflows/<workflow-name.yml> iş akışı dosyasında, iş akışının dağıtım işi için gereken yayımlama profili kimlik bilgileri için bir yer tutucu görürsünüz. Yayımlama profili bilgileri, Güvenlik/Eylemler altındaki depo Ayarlar şifrelenmiş olarak depolanır.

Screenshot showing how to view action secrets in GitHub.

Bu makalede GitHub eylemi, yayımlama profili kimlik bilgileriyle kimlik doğrulaması yapar. Hizmet sorumlusu veya OpenID Bağlan gibi kimlik doğrulaması yapmanın başka yolları da vardır. Daha fazla bilgi için bkz . GitHub Actions kullanarak App Service'e dağıtma.

İş akışını çalıştırma

Şimdi depoda bir değişiklik yaparak iş akışını test edersiniz.

1. Adım. Örnek depo çatalınıza (veya kullandığınız depoya) gidin ve tetikleyicinin parçası olarak ayarladığınız dalı seçin.

Screenshot showing how to go to the repo and branch where the GitHub Actions workflow is defined.

2. Adım. Küçük bir değişiklik yapın.

Örneğin, VS Code Flask öğreticisini kullandıysanız,

  • Tetikleyici dalının /hello-app/templates/home.html dosyasına gidin.
  • Düzenle'yi seçin ve "Yeniden Dağıtıldı!" metnini ekleyin.

3. Adım. Değişikliği doğrudan çalıştığınız dala işleyin.

  • Düzenlemekte olduğunuz sayfanın sağ üst kısmında Değişiklikleri işle ... düğmesini seçin. Değişiklikleri işle penceresi açılır. Değişiklikleri işle penceresinde, isterseniz işleme iletisini değiştirin ve değişiklikleri işle düğmesini seçin.
  • İşleme, GitHub Actions iş akışını başlatıyor.

ayrıca iş akışını el ile başlatabilirsiniz.

1. Adım. Sürekli dağıtım için ayarlanan deponun Eylemler sekmesine gidin.

2. Adım. İş akışları listesinden iş akışını seçin ve ardından İş akışını çalıştır'ı seçin.

Başarısız iş akışı sorunlarını giderme

bir iş akışının durumunu denetlemek için deponun Eylemler sekmesine gidin. Bu öğreticide oluşturulan iş akışı dosyasında detaya gittiğinizde iki iş "derleme" ve "dağıtma" görürsünüz. Başarısız bir iş için, hatanın göstergesi için iş görevlerinin çıktısını inceleyin. Yaygın sorunlardan bazıları:

  • Uygulama eksik bağımlılık nedeniyle başarısız olursa requirements.txt dosyanız dağıtım sırasında işlenmez. Bu davranış, web uygulamasını bu makalede gösterildiği gibi komutunu kullanmak az webapp up yerine doğrudan portalda oluşturduysanız oluşur.

  • Uygulama hizmetini portal aracılığıyla sağladıysanız derleme eylemi SCM_DO_BUILD_DURING_DEPLOYMENT ayarı ayarlanmamış olabilir. Bu ayar olarak trueayarlanmalıdır. Komut, az webapp up derleme eylemini otomatik olarak ayarlar.

  • "TLS el sıkışması zaman aşımı" hata iletisi görürseniz, zaman aşımının geçici bir sorun olup olmadığını görmek için deponun Eylemler sekmesinde Otomatik dağıtımı tetikle'yi seçerek iş akışını el ile çalıştırın.

  • Bu öğreticide gösterildiği gibi kapsayıcı uygulaması için sürekli dağıtım ayarlarsanız, iş akışı dosyası (.github/workflows/<workflow-name.yml>) başlangıçta sizin için otomatik olarak oluşturulur. Bunu değiştirdiyseniz, hataya neden olup olmadığını görmek için değişiklikleri kaldırın.

Dağıtım sonrası betiği çalıştırma

Dağıtım sonrası betik, örneğin uygulama kodu tarafından beklenen ortam değişkenlerini tanımlayabilir. Betiği uygulama kodunun bir parçası olarak ekleyin ve başlangıç komutunu kullanarak yürütebilirsiniz.

İş akışı YML dosyanızda değişken değerlerini sabit kodlamaktan kaçınmak için, bunları GitHub web arabiriminde kullanabilir ve ardından betikteki değişken adına başvurabilirsiniz. Bir depo veya ortam (hesap deposu) için şifrelenmiş gizli diziler oluşturabilirsiniz. Daha fazla bilgi için bkz . GitHub Docs'ta şifrelenmiş gizli diziler.

Django için dikkat edilmesi gerekenler

Bu makalede daha önce belirtildiği gibi, ayrı bir veritabanı kullanıyorsanız Django uygulamalarını Linux üzerinde Azure Uygulaması Service'e dağıtmak için GitHub Actions'ı kullanabilirsiniz. App Service db.sqlite3 dosyasını kilitleyerek hem okumaları hem de yazmaları engellediği için SQLite veritabanı kullanamazsınız. Bu davranış dış veritabanını etkilemez.

App Service'te Python uygulamasını yapılandırma - Kapsayıcı başlatma işlemi makalesinde açıklandığı gibi, App Service uygulama kodunuz içinde genellikle uygulama nesnesini içeren bir wsgi.py dosyasını otomatik olarak arar. başlatma komutunu ayarlamak için komutunu kullandığınızda webapp config set , uygulama nesnesini içeren dosyayı belirtmek için parametresini kullandınız --startup-file . Komut webapp config set webapps-deploy eyleminde kullanılamaz. Bunun yerine, başlangıç komutunu belirtmek için parametresini kullanabilirsiniz startup-command . Örneğin, aşağıdaki kod parçacığı iş akışı dosyasında başlangıç komutunun nasıl belirtileceğini gösterir:

startup-command: startup.txt

Django kullanırken genellikle uygulama kodunu dağıttığınızda komutunu kullanarak python manage.py migrate veri modellerini geçirmek istersiniz. Geçiş komutunu dağıtım sonrası betiğinde çalıştırabilirsiniz.

GitHub Actions bağlantısını kesme

GitHub Actions'ın App Service'inizle bağlantısını kesmek, uygulama dağıtımını yeniden yapılandırmanıza olanak tanır. Bağlantıyı kestikten sonra iş akışı dosyanıza ne olacağını, dosyanın kaydedilip silinmeyeceğini seçebilirsiniz.

Azure CLI az webapp deployment github-actions remove komutuyla GitHub Actions bağlantısını kesin .

az webapp deployment github-actions remove \
  --repo "<github-user>/<github-repo>" \
  --resource-group <resource-group-name> \
  --branch <branch-name> \
  --name <app-service-name> \
  --login-with-github

Kaynakları temizleme

Bu öğreticide oluşturulan Azure kaynaklarında ücret yansıtılmasını önlemek için App Service'i ve App Service Planını içeren kaynak grubunu silin.

Azure Cloud Shell dahil olmak üzere Azure CLI'nın yüklendiği her yerde az group delete komutunu kullanarak kaynak grubunu silebilirsiniz.

az group delete --name <resource-group-name>

Cloud Shell için küçük bir aylık ücret gerektiren dosya sistemini koruyan depolama hesabını silmek için cloud-shell-storage- ile başlayan kaynak grubunu silin. Grubun tek kullanıcısı sizseniz kaynak grubunu silmek güvenlidir. Başka kullanıcılar varsa, kaynak grubundaki bir depolama hesabını silebilirsiniz.

Azure kaynak grubunu sildiyseniz, sürekli dağıtım için bağlı olan GitHub hesabında ve deposunda aşağıdaki değişiklikleri de yapmayı göz önünde bulundurun:

  • Depoda .github/workflows/<workflow-name.yml> dosyasını kaldırın.
  • Depo ayarlarında, iş akışı için oluşturulan AZUREAPPSERVICE_PUBLISHPROFILE_ gizli dizi anahtarını kaldırın.
  • GitHub hesabı ayarlarında, GitHub hesabınız için yetkili bir Oauth Uygulaması olarak Azure Uygulaması Hizmeti'ni kaldırın.