Aracılığıyla paylaş


Azure Uygulaması Hizmeti'ne python web uygulaması derlemek ve dağıtmak için Azure Pipelines'ı kullanma

Azure DevOps Services

Sürekli tümleştirme ve sürekli teslim (CI/CD) için Azure Pipelines'ı kullanarak Linux üzerinde Azure Uygulaması Hizmeti'ne bir Python web uygulaması oluşturun ve dağıtın. İşlem hattınız, depoya yönelik bir işleme olduğunda Python web uygulamanızı otomatik olarak derleyip App Service'e dağıtır.

Bu makalede şunları öğreneceksiniz:

  • Azure Uygulama Hizmeti'nde bir web uygulaması oluşturun.
  • Azure DevOps'ta proje oluşturma.
  • DevOps projenizi Azure'a bağlayın.
  • Python'a özgü bir işlem hattı oluşturun.
  • Uygulamanızı derlemek ve App Service'te web uygulamanıza dağıtmak için işlem hattını çalıştırın.

Önkoşullar

Uygulama kodunuz için depo oluşturma

GitHub hesabınıza konumundaki örnek deponun https://github.com/Microsoft/python-sample-vscode-flask-tutorial çatalını oluşturun.

Yerel ana bilgisayarınızda GitHub deponuzu kopyalayın. öğesini çatallanmış deponuzun URL'si ile değiştirerek <repository-url> aşağıdaki komutu kullanın.

git clone <repository-url>

Uygulamanızı yerel olarak test edin

Çalıştığından emin olmak için uygulamayı yerel olarak derleyin ve çalıştırın.

  1. Kopyalanan depo klasörüne geçin.

    cd python-sample-vscode-flask-tutorial
    
  2. Uygulamayı derleyin ve çalıştırın

    python -m venv .env
    source .env/bin/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export set FLASK_APP=hello_app.webapp
    python3 -m flask run
    
  3. Uygulamayı görüntülemek için bir tarayıcı penceresi açın ve adresine http://localhost:5000gidin. başlığını Visual Studio Flask Tutorialgördüğünüzden emin olun.

  4. İşiniz bittiğinde tarayıcı penceresini kapatın ve Ctrl+C ile Flask sunucusunu durdurun.

Bir Cloud Shell açma

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

  2. Portal araç çubuğunda Cloud Shell düğmesini seçerek Azure CLI'yi açın.

    Azure portalı araç çubuğundaki Azure Cloud Shell düğmesinin ekran görüntüsü.

  3. Cloud Shell, tarayıcının alt kısmında görünür. Açılan menüden Bash'i seçin.

    Azure Cloud Shell’in ekran görüntüsü.

  4. Size daha fazla çalışma alanı sağlamak için ekranı kapla düğmesini seçin.

Azure Uygulaması Hizmeti web uygulaması oluşturma

Azure portalında Cloud Shell'den Azure Uygulaması Service web uygulamanızı oluşturun.

İpucu

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

  1. Deponuzu aşağıdaki komutla kopyalayın ve yerine <repository-url> çatallanmış deponuzun URL'sini yazın.

    git clone <repository-url>
    
  2. Komutun uygulamayı Python uygulaması olarak tanıması için dizini kopyalanmış depo klasörüne az webapp up değiştirin.

    cd python-sample-vscode-flask-tutorial
    
  3. App Service'i sağlamak ve uygulamanızın ilk dağıtımını yapmak için az webapp up komutunu kullanın. değerini Azure genelinde benzersiz bir adla değiştirin <your-web-app-name> . Genellikle, gibi <your-name>-flaskpipelinesbir uygulama tanımlayıcısı ile birlikte kişisel veya şirket adı kullanırsınız. Uygulama URL'si your-appservice.azurewebsites.net> olur<.

    az webapp up --name <your-web-app-name>
    

    Komutun JSON çıkışı şunları az webapp up gösterir:

    {
      "URL": <your-web-app-url>,
      "appserviceplan": <your-app-service-plan-name>,
      "location": <your-azure-location>,
      "name": <your-web-app-name>,
      "os": "Linux",
      "resourcegroup": <your-resource-group>,
      "runtime_version": "python|3.11",
      "runtime_version_detected": "-",
      "sku": <sku>,
      "src_path": <repository-source-path>
    }
    

    URL ve runtime_version değerlerini not edin. İşlem hattı YAML dosyasında öğesini runtime_version kullanırsınız. URL, web uygulamanızın URL'sidir. Uygulamanın çalıştığını doğrulamak için bunu kullanabilirsiniz.

    Not

    az webapp up komutu şu eylemleri gerçekleştirir:

    Komut parametrelerini kullanarak varsayılan eylemi kendi değerlerinizle geçersiz kılabilirsiniz. Daha fazla bilgi için bkz . az webapp up.

  4. python-sample-vscode-flask-tutorial uygulamasında web uygulaması için belirli başlangıç komutunu içeren bir startup.txt dosyası vardır. Web uygulaması startup-file yapılandırma özelliğini olarak startup.txtayarlayın.

    1. Komut çıktısından az webapp up değeri kopyalayın resourcegroup .

    2. Kaynak grubunu ve uygulamanızın adını kullanarak aşağıdaki komutu girin.

    az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
    

    Komut tamamlandığında, web uygulamanızın tüm yapılandırma ayarlarını içeren JSON çıkışını gösterir.

  5. Çalışan uygulamayı görmek için bir tarayıcı açın ve komut çıkışında gösterilene URL az webapp up gidin. Genel bir sayfa görürseniz App Service'in başlatılması için birkaç saniye bekleyin ve sayfayı yenileyin. başlığını Visual Studio Flask Tutorialgördüğünüzden emin olun.

Azure DevOps projesi oluşturma

Yeni bir Azure DevOps projesi oluşturun.

  1. Tarayıcıda dev.azure.com gidin ve oturum açın.
  2. Kuruluşunuzu seçin.
  3. Kuruluştaki ilk projeyi oluşturuyorsanız Yeni proje'yi veya Proje oluştur'u seçerek yeni bir proje oluşturun.
  4. Bir Proje adı girin.
  5. Projenizin Görünürlüğünü seçin.
  6. Oluştur'u belirleyin.
  1. Tarayıcıda Azure DevOps Sunucunuza gidin.
  2. Koleksiyonunuzu seçin.
  3. Koleksiyonda ilk projeyi oluşturuyorsanız Yeni proje'yi veya Proje oluştur'u seçerek yeni bir proje oluşturun.
  4. Bir Proje adı girin.
  5. Projenizin Görünürlüğünü seçin.
  6. Oluştur'u belirleyin.

Hizmet sorumlusu oluşturma

Hizmet sorumlusu; uygulamaların, barındırılan hizmetlerin ve otomatik araçların Azure kaynaklarına erişmesi amacıyla oluşturulan kimliktir. Bu erişim, hizmet sorumlusuna atanan rollerle sınırlıdır ve hangi kaynaklara ve hangi düzeyde erişilebileceğini denetlemenizi sağlar.

Hizmet sorumlusu oluşturmak için cloud shell'e (bash) gidin ve aşağıdaki komutu çalıştırın. değerini hizmet sorumlunuzun adıyla, <your-subscription-id> abonelik kimliğinizle ve <your-resource-group> web uygulamasının kaynak grubuyla değiştirin<service-principal-name>.

az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>

komutu aşağıdaki örneğe benzer bir JSON nesnesi döndürür:

{
  "clientId": "<client GUID>",
  "clientSecret": "<string-value>",
  "subscriptionId": "<subscription GUID>",
  "tenantId": "<tenant GUID>",
  ...
}

, , clientSecretsubscriptionIdve tenantId değerlerini not clientIdedin. Sonraki bölümde hizmet bağlantısı oluşturmak için bu değerlere ihtiyacınız vardır.

Hizmet bağlantısı oluşturma

Hizmet bağlantısı, Azure Pipelines'tan dış ve uzak hizmetlere kimliği doğrulanmış erişim sağlamak için bir bağlantı oluşturmanıza olanak tanır. Azure Uygulaması Hizmeti web uygulamanıza dağıtmak için web uygulamasını içeren kaynak grubuna bir hizmet bağlantısı oluşturun.

  1. Proje sayfasında Proje ayarları'nı seçin.

    Proje panosundaki proje ayarları düğmesinin ekran görüntüsü.

  2. Menünün İşlem Hatları bölümünde Hizmet bağlantıları'nı seçin.

  3. Hizmet bağlantısı oluştur’u seçin.

  4. Azure Resource Manager'ı ve ardından İleri'yi seçin.

    Azure Resource Manager hizmet bağlantısı seçiminin ekran görüntüsü.

  5. Kimlik doğrulama yönteminizi seçin ve İleri'yi seçin.

  6. Yeni Azure hizmeti bağlantısı iletişim kutusunda, seçili kimlik doğrulama yöntemine özgü bilgileri girin. Kimlik doğrulama yöntemleri hakkında daha fazla bilgi için bkz . Azure Resource Manager hizmet bağlantısını kullanarak Azure'a bağlanma.

    Örneğin, İş Yükü Kimliği federasyonu (otomatik) veya Hizmet sorumlusu (otomatik) kimlik doğrulama yöntemi kullanıyorsanız, gerekli bilgileri girin.

    Yeni hizmet bağlantısı iletişim kutusunun ekran görüntüsü.

    Alan Açıklama
    Kapsam düzeyi Abonelik seçin.
    Abonelik Azure aboneliğinizin adı.
    Kaynak grubu Web uygulamanızı içeren kaynak grubunun adı.
    Hizmet bağlantısı adı Bağlantı için açıklayıcı bir ad.
    Tüm işlem hatlarına erişim izinleri verme Tüm işlem hatlarına erişim vermek için bu seçeneği belirleyin.
  7. Kaydet'i seçin.

Yeni bağlantı Hizmet bağlantıları listesinde görünür ve Azure İşlem Hattınızda kullanıma hazırdır.

  1. Proje sayfasında Proje ayarları'nı seçin.

    Proje panosundaki proje ayarları düğmesinin ekran görüntüsü.

  2. Menünün İşlem Hatları bölümünde Hizmet bağlantıları'nı seçin.

  3. Hizmet bağlantısı oluştur’u seçin.

  4. Azure Resource Manager'ı ve ardından İleri'yi seçin.

    Azure Resource Manager hizmet bağlantısı seçiminin ekran görüntüsü.

  5. Yeni Azure hizmet bağlantısı'nda Hizmet sorumlusu (el ile) seçeneğini belirleyin ve İleri'yi seçin

  6. Sonraki iletişim kutusunda gerekli bilgileri doldurun.

    Yeni hizmet bağlantısı iletişim kutusunun ekran görüntüsü.

    Alan Açıklama
    Ortam Azure Cloud öğesini seçin.
    Kapsam düzeyi Abonelik seçin.
    Abonelik Kimliği Abonelik kimliğiniz.
    Abonelik Adı Azure aboneliğinizin adı.
    Hizmet Sorumlusu Kimliği appId Komutu tarafından döndürülen JSON nesnesinden gelen az ad sp create-for-rbac değer.
    Hizmet Sorumlusu Anahtarı password Komutu tarafından döndürülen JSON nesnesinden gelen az ad sp create-for-rbac değer.
    Kiracı Kimliği tenant Komutu tarafından döndürülen JSON nesnesinden gelen az ad sp create-for-rbac değer.
  7. Bağlantıyı doğrulamak için Doğrula'yı seçin.

  8. Bir Hizmet bağlantı adı girin.

  9. Tüm işlem hatlarına erişim izinleri ver seçeneğinin belirlendiğinden emin olun.

  10. Doğrula ve kaydet'i seçin.

Yeni bağlantı Hizmet bağlantıları listesinde görünür ve Azure Pipelines'ın projeden kullanımına hazırdır.

Şirket içinde barındırılan aracı yapılandırma

Kendi şirket içinde barındırılan aracınızı kullanıyorsanız, aracıyı Python'ı çalıştıracak şekilde yapılandırmanız gerekir. Şirket içinde barındırılan aracılarda Python sürümlerinin indirilmesi desteklenmez. Python sürümünü önceden yüklemeniz gerekir. Python'ın pip uyumlu bir sürümünü almak için tam yükleyiciyi kullanın.

Uyumsuz sorunları önlemek için Python sürümünü Azure Uygulaması Services web uygulamanızdaki çalışma zamanı sürümüyle eşleştirmeniz gerekir. Çalışma zamanı sürümü, komutun JSON çıkışında az webapp up gösterilir.

Görevin kullanabilmesi için istenen Python sürümünün şirket içinde barındırılan aracıdaki araç önbelleğine eklenmesi gerekir. Normalde araç önbelleği aracının _work/_tool dizini altında bulunur; alternatif olarak, yol ortam değişkeni AGENT_TOOLSDIRECTORY geçersiz kılınabilir. Araçlar dizininin altında Python sürümünüzü temel alan aşağıdaki dizin yapısını oluşturun:

$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete

Sürüm numarası 1.2.3 biçiminde olmalıdır. Platform x86 veya x64 olmalıdır. Araç dosyaları sıkıştırması açılmış Python sürüm dosyaları olmalıdır. veya {platform}.complete gibi x86.complete x64.complete görünen ve aracın önbelleğe düzgün şekilde yüklendiğini gösteren 0 baytlık bir dosya olmalıdır.

Örneğin, 64 bit Windows makinesinde Python 3.11 kullanıyorsanız dizin yapısı şöyle görünür:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete

Aracınızı barındıran makinede kullanmak istediğiniz Python sürümüne zaten sahipseniz, dosyaları araç önbelleğine kopyalayabilirsiniz. Python sürümünüz yoksa Python web sitesinden indirebilirsiniz.

İşlem hattı oluşturma

Python web uygulamanızı derlemek ve Azure Uygulaması Service'e dağıtmak için bir işlem hattı oluşturun. İşlem hattı kavramlarını anlamak için aşağıdakileri izleyin:

  1. Sol gezinti menüsünde İşlem hatları'nı seçin.

    Proje panosundaki İşlem hatları seçiminin ekran görüntüsü.

  2. İşlem Hattı Oluştur'u seçin.

    İşlem hatları listesindeki yeni işlem hattı düğmesinin ekran görüntüsü.

  3. Kodunuz nerede iletişim kutusunda GitHub'ı seçin. GitHub'da oturum açmanız istenebilir.

    Kodunuzun konumu olarak GitHub'ı seçme işleminin ekran görüntüsü.

  4. Depo seçin ekranında, çatallanmış örnek depoyu seçin.

    Depo seçiminin ekran görüntüsü.

  5. Onay olarak GitHub parolanızı yeniden girmeniz istenebilir.

  6. Azure Pipelines uzantısı GitHub'da yüklü değilse GitHub, Azure Pipelines uzantısını yüklemenizi ister.

    GitHub'a Azure Pipelines uzantısını yükleyin.

    Bu sayfada, aşağı kaydırarak Depo erişimi bölümüne gidin, uzantının tüm depolara mı yoksa yalnızca seçili depolara mı yükleneceğini seçin ve ardından Onayla ve yükle'yi seçin.

    GitHub'da Azure Pipelines uzantısını onayla ve yükle uzantısının ekran görüntüsü.

  7. İşlem hattınızı yapılandırın iletişim kutusunda Azure'da Python'ı Linux Web App'e seçin.

  8. Azure aboneliğinizi seçin ve Devam'ı seçin.

  9. Kimlik doğrulaması için kullanıcı adınızı ve parolanızı kullanıyorsanız Microsoft hesabınızda oturum açmanız için bir tarayıcı açılır.

  10. Açılan listeden web uygulamanızın adını seçin ve Doğrula ve yapılandır'ı seçin.

Azure Pipelines bir azure-pipelines.yml dosyası oluşturur ve dosyayı YAML işlem hatları düzenleyicisinde görüntüler. İşlem hattı dosyası CI/CD işlem hattınızı, her adımın farklı görevler ve betikler için ayrıntıları içerdiği aşamalar, İşler ve adımlar dizisi olarak tanımlar. İşlem hattına göz atarak ne yaptığını görün. Tüm varsayılan girişlerin kodunuz için uygun olduğundan emin olun.

  1. Gezinti menüsünde İşlem hatları'nı seçin.

    Proje panosundaki İşlem hatları seçiminin ekran görüntüsü.

  2. İşlem Hattı Oluştur'u seçin.

    Yeni işlem hattı düğmesinin ekran görüntüsü.

  3. Kodunuz nerede iletişim kutusunda GitHub Enterprise Server'ı seçin. GitHub'da oturum açmanız istenebilir.

    Kodunuzun konumu olarak GitHub'ı seçme işleminin ekran görüntüsü.

  4. Depo seçin sekmesinde, çatallanmış örnek depoyu seçin.

    Depo seçiminin ekran görüntüsü.

  5. Onay olarak GitHub parolanızı yeniden girmeniz istenebilir.

  6. Azure Pipelines uzantısı GitHub'da yüklü değilse GitHub, Azure Pipelines uzantısını yüklemenizi ister.

    GitHub'da Azure Pipelines uzantısının ekran görüntüsü.

    Bu sayfada, aşağı kaydırarak Depo erişimi bölümüne gidin, uzantının tüm depolara mı yoksa yalnızca seçili depolara mı yükleneceğini seçin ve ardından Onayla ve yükle'yi seçin.

    GitHub'da Azure Pipelines uzantısını onayla ve yükle uzantısının ekran görüntüsü.

  7. İşlem hattınızı yapılandırın iletişim kutusunda Başlangıç işlem hattı'nı seçin.

  8. azure-pipelines.yml dosyasının içeriğini aşağıdaki kodla değiştirin.

    trigger:
    - main
    
    variables:
      # Azure Resource Manager connection created during pipeline creation
      azureServiceConnectionId: '<your-service-connection-name>'
    
      # Web app name
      webAppName: '<your-web-app-name>'
    
      # Environment name
      environmentName: '<your-web-app-name>'
    
      # Project root folder. 
      projectRoot: $(System.DefaultWorkingDirectory)
    
      # Python version: 
      pythonVersion: '<your-python-version>'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:
      - job: BuildJob
        pool:
          name: '<your-pool-name>'
          demands: python
        steps:
        - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
          displayName: 'Use Python $(pythonVersion)'
    
        - script: |
            python -m venv antenv
            source antenv/bin/activate
            python -m pip install --upgrade pip
            pip install -r requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(projectRoot)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
    
        - task: PublishBuildArtifacts@1
          inputs:
            PathtoPublish: '$(Build.ArtifactStagingDirectory)'
            ArtifactName: 'drop'
            publishLocation: 'Container'
    
    - stage: Deploy
      displayName: 'Deploy Web App'
      dependsOn: Build
      condition: succeeded()
      jobs:
      - deployment: DeploymentJob
        pool:
          name: '<your-pool-name'
        environment: $(environmentName)
        strategy:
          runOnce:
            deploy:
              steps:
    
              - task: UsePythonVersion@0
                inputs:
                  versionSpec: '$(pythonVersion)'
                displayName: 'Use Python version'
    
              - task: AzureWebApp@1
                displayName: 'Deploy Azure Web App : <your-web-app-name>'
                inputs:
                  azureSubscription: $(azureServiceConnectionId)
                  appName: $(webAppName)
                  package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
                  startUpCommand: 'startup.txt'
    
    
  9. Aşağıdaki yer tutucuları kendi değerlerinizle değiştirin:

    Yer tutucu Açıklama
    <your-service-connection-name> Oluşturduğunuz hizmet bağlantısının adı.
    <your-web-app-name> Azure Uygulaması Service web uygulamanızın adı.
    <your-pool-name> Kullanmak istediğiniz aracı havuzunun adı.
    <your-python-version> Aracınızda çalışan Python sürümü. Bu sürümü web uygulamanızda çalışan Python sürümüyle eşleştirmek iyi bir fikirdir. Web uygulaması sürümü, komutun JSON çıkışında az webapp up gösterilir.

YAML işlem hattı dosyası

Aşağıdaki açıklama YAML işlem hattı dosyasını açıklar. İşlem hattı YAML dosya şeması hakkında bilgi edinmek için bkz . YAML şema başvurusu.

Örnek işlem hattı YAML dosyasının tamamı aşağıda gösterilmiştir:

trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '<GUID>'

  # Web app name
  webAppName: '<your-webapp-name>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Environment name
  environmentName: '<your-webapp-name>'

  # Project root folder. Point to the folder containing manage.py file.
  projectRoot: $(System.DefaultWorkingDirectory)

  pythonVersion: '3.11'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: UsePythonVersion@0
      inputs:
        versionSpec: '$(pythonVersion)'
      displayName: 'Use Python $(pythonVersion)'

    - script: |
        python -m venv antenv
        source antenv/bin/activate
        python -m pip install --upgrade pip
        pip install setup
        pip install -r requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      displayName: 'Upload package'
      artifact: drop

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: UsePythonVersion@0
            inputs:
              versionSpec: '$(pythonVersion)'
            displayName: 'Use Python version'

          - task: AzureWebApp@1
            displayName: 'Deploy Azure Web App : $(webAppName)'
            inputs:
              azureSubscription: $(azureServiceConnectionId)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip

Değişkenler

variables bölümü aşağıdaki değişkenleri içerir:

variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<GUID>'

# Web app name
webAppName: '<your-webapp-name>'

# Agent VM image name
vmImageName: 'ubuntu-latest'

# Environment name
environmentName: '<your-webapp-name>'

# Project root folder.
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to match the Python runtime version running on your web app.
pythonVersion: '3.11'

Değişken Açıklama
azureServiceConnectionId Azure Resource Manager hizmet bağlantısının kimliği veya adı.
webAppName Azure Uygulaması Hizmeti web uygulamasının adı.
vmImageName Derleme aracısı için kullanılacak işletim sisteminin adı.
environmentName Dağıtım aşamasında kullanılan ortamın adı. Aşama işi çalıştırıldığında ortam otomatik olarak oluşturulur.
projectRoot Uygulama kodunu içeren kök klasör.
pythonVersion Derleme ve dağıtım aracılarında kullanılacak Python sürümü.

variables bölümü aşağıdaki değişkenleri içerir:

variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<your-service-connection-name>'

# Web app name
webAppName: '<your-webapp-name>'

# Environment name
environmentName: '<your-webapp-name>'

# Project root folder. 
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to the version that is running on your agent and web app.
pythonVersion: '3.11'
Değişken Açıklama
azureServiceConnectionId Azure Resource Manager hizmet bağlantısının adı.
webAppName Web uygulamasının adı.
environmentName Dağıtım aşamasında kullanılan ortamın adı.
projectRoot Uygulama kodunu içeren klasör. Değer, otomatik bir sistem değişkenidir.
pythonVersion Derleme ve dağıtım aracılarında kullanılacak Python sürümü.

Derleme aşaması

Derleme aşaması, vmImageName değişkeninde tanımlanan işletim sisteminde çalışan tek bir iş içerir.

  - job: BuildJob
    pool:
      vmImage: $(vmImageName)

Derleme aşaması, ad parametresi tarafından tanımlanan havuzdaki bir aracıda çalışan tek bir iş içerir. Aracı özelliklerini anahtar sözcüğüyle demands belirtebilirsiniz. Örneğin, demands: python aracıda Python'ın yüklü olması gerektiğini belirtir. Şirket içinde barındırılan aracıyı ada göre belirtmek için anahtar sözcüğünü demands: Agent.Name -equals <agent-name> kullanabilirsiniz.

  - job: BuildJob
    pool:
      name: <your-pool-name>
      demands: python

İş birden çok adım içerir:

  1. UsePythonVersion görevi kullanılacak Python sürümünü seçer. Sürüm, değişkeninde pythonVersion tanımlanır.

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. Bu adım, sanal bir Python ortamı oluşturmak ve uygulama bağımlılıklarını requirements.txt yüklemek için bir betik kullanır. Parametre workingDirectory , uygulama kodunun konumunu belirtir.

      - script: |
           python -m venv antenv
           source antenv/bin/activate
           python -m pip install --upgrade pip
           pip install setup
           pip install  -r ./requirements.txt
         workingDirectory: $(projectRoot)
         displayName: "Install requirements"
    
  3. ArchiveFiles görevi, web uygulamasını içeren .zip arşivini oluşturur. Dosya .zip , adlı dropyapıt olarak işlem hattına yüklenir. Dosya .zip , uygulamayı web uygulamasına dağıtmak için dağıtım aşamasında kullanılır.

       - task: ArchiveFiles@2
         displayName: 'Archive files'
         inputs:
           rootFolderOrFile: '$(projectRoot)'
           includeRootFolder: false
           archiveType: zip
           archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
           replaceExistingArchive: true
    
       - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
         displayName: 'Upload package'
         artifact: drop
    
    Parametre Açıklama
    rootFolderOrFile Uygulama kodunun konumu.
    includeRootFolder Kök klasörün .zip dosyasına eklenip eklenmeyeceğini gösterir. Bu parametreyi false aksi şekilde ayarlayın, .zip dosyasının içeriği s adlı bir klasöre yerleştirilir ve Linux üzerinde App Service kapsayıcısı uygulama kodunu bulamaz.
    archiveType Oluşturulacak arşiv türü. zip olarak ayarlayın.
    archiveFile Oluşturulacak .zip dosyasının konumu.
    replaceExistingArchive Dosya zaten varsa var olan bir arşivin değiştirilip değiştirilmeyeceğini gösterir. true olarak ayarlayın.
    upload Karşıya yüklenecek .zip dosyasının konumu.
    artifact Oluşturulacak yapıtın adı.

Dağıtım aşaması

Derleme aşaması başarıyla tamamlanırsa dağıtım aşaması çalıştırılır. Aşağıdaki anahtar sözcükler bu davranışı tanımlar:

  dependsOn: Build
  condition: succeeded()

Dağıtım aşaması, aşağıdaki anahtar sözcüklerle yapılandırılmış tek bir dağıtım işi içerir:

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
Anahtar sözcük Açıklama
deployment İşin bir ortamı hedefleyen bir dağıtım işi olduğunu gösterir.
pool Dağıtım aracısı havuzunu belirtir. Ad belirtilmemişse varsayılan aracı havuzu. anahtar sözcüğü, vmImage aracının sanal makine görüntüsü için işletim sistemini tanımlar
environment Dağıtılacak ortamı belirtir. İş çalıştırıldığında projenizde ortam otomatik olarak oluşturulur.
  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
Anahtar sözcük Açıklama
deployment İşin bir ortamı hedefleyen bir dağıtım işi olduğunu gösterir.
pool Dağıtım için kullanılacak aracı havuzunu belirtir. Bu havuz, işlem hattında belirtilen Python sürümünü çalıştırma özelliğine sahip bir aracı içermelidir.
environment Dağıtılacak ortamı belirtir. İş çalıştırıldığında projenizde ortam otomatik olarak oluşturulur.

strategy anahtar sözcüğü, dağıtım stratejisini tanımlamak için kullanılır. runOnce anahtar sözcüğü, dağıtım işinin bir kez çalıştırıldığını belirtir. deploy anahtar sözcüğü, dağıtım işinde çalıştırılacak adımları belirtir.

  strategy:
    runOnce:
      deploy:
        steps:

steps İşlem hattındakiler şunlardır:

  1. Aracıda kullanılacak Python sürümünü belirtmek için UsePythonVersion görevini kullanın. Sürüm, değişkeninde pythonVersion tanımlanır.

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. AzureWebApp@1 kullanarak web uygulamasını dağıtın. Bu görev, işlem hattı yapıtını drop web uygulamanıza dağıtır.

    - task: AzureWebApp@1
       displayName: 'Deploy Azure Web App : <your-web-app-name>'
       inputs:
          azureSubscription: $(azureServiceConnectionId)
          appName: $(webAppName)
          package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
    
    Parametre Açıklama
    azureSubscription Kullanılacak Azure Resource Manager hizmet bağlantı kimliği veya adı.
    appName Web uygulamasının adı.
    package Dağıtılacak .zip dosyasının konumu.

    Ayrıca, python-vscode-flask-tutorial deposu startup.txt adlı bir dosyada aynı başlangıç komutunu içerdiğinden, parametresini ekleyerek bu dosyayı belirtebilirsiniz: startUpCommand: 'startup.txt'.

steps İşlem hattındakiler şunlardır:

  1. Aracıda kullanılacak Python sürümünü belirtmek için UsePythonVersion görevini kullanın. Sürüm, değişkeninde pythonVersion tanımlanır.

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. AzureWebApp@1 kullanarak web uygulamasını dağıtın. Bu görev, işlem hattı yapıtını drop web uygulamanıza dağıtır.

    - task: AzureWebApp@1
       displayName: 'Deploy Azure Web App : <your-web-app-name>'
       inputs:
          azureSubscription: $(azureServiceConnectionId)
          appName: $(webAppName)
          package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
    
    Parametre Açıklama
    azureSubscription Kullanılacak Azure Resource Manager hizmet bağlantı kimliği veya adı.
    appName Web uygulamasının adı.
    package Dağıtılacak .zip dosyasının konumu.

    Ayrıca, python-vscode-flask-tutorial deposu startup.txt adlı bir dosyada aynı başlangıç komutunu içerdiğinden, parametresini ekleyerek bu dosyayı belirtebilirsiniz: startUpCommand: 'startup.txt'.

      - task: AzureWebApp@1
         displayName: 'Deploy Azure Web App : $(webAppName)'
         inputs:
           azureSubscription: $(azureServiceConnectionId)
           appName: $(webAppName)
           package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
           startUpCommand: 'startup.txt'
    
    Parametre Açıklama
    azureSubscription Kullanılacak Azure Resource Manager hizmet bağlantı kimliği veya adı.
    appName Web uygulamasının adı.
    package Dağıtılacak .zip dosyasının konumu.
    startUpCommand Uygulama dağıtıldıktan sonra çalıştırılacak komut. Örnek uygulama kullanır startup.txt.

İşlem hattını çalıştırma

Artık denemeye hazırsınız!

  1. Düzenleyicide Kaydet ve çalıştır'ı seçin.

  2. Kaydet ve çalıştır iletişim kutusunda bir işleme iletisi ekleyin, ardından Kaydet ve çalıştır'ı seçin.

    İşlem hattı çalıştırma özetinde Aşamalar veya İşler'i seçerek işlem hattını çalışırken izleyebilirsiniz.

    İşlem hattı çalıştırma özet aşamaları bölümünün ekran görüntüsü.

    Her aşamanın ve işin yanında başarıyla tamamlandığında yeşil onay işaretleri vardır. Hatalar oluşursa, bunlar özette veya iş adımlarında görüntülenir.

    İşlem hattı aşaması adımlarının ekran görüntüsü.

    Özet sayfasının sağ üst kısmındaki dikey noktaları seçip İşlem hattını düzenle'yi seçerek YAML düzenleyicisine hızla dönebilirsiniz:

    Derleme raporundan işlem hattı açıklamasını düzenleme ekran görüntüsü.

  3. Dağıtım işinden Azure Web App'i Dağıt görevini seçerek çıktısını görüntüleyin. Dağıtılan siteyi ziyaret etmek için Ctrl tuşunu basılı tutarak url'yi seçinApp Service Application URL.

    Örnek uygulamayı kullanıyorsanız, uygulama aşağıdaki gibi görünmelidir:

    App Service'te çalışan örnek uygulamanın görünümünün ekran görüntüsü.

Önemli

Uygulamanız 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.

komutu özellikle az webapp up derleme eylemini SCM_DO_BUILD_DURING_DEPLOYMENT olarak trueayarlar. Uygulama hizmetini portal aracılığıyla sağladıysanız, bu eylem otomatik olarak ayarlanmaz.

Aşağıdaki adımlar eylemi ayarlar:

  1. Azure portalını açın, App Service'inizi ve ardından Yapılandırma'yı seçin.
  2. Uygulama Ayarları sekmesinin altında Yeni Uygulama Ayarı'nı seçin.
  3. Açılan pencerede, Ad SCM_DO_BUILD_DURING_DEPLOYMENT olarak ayarlayın, Değer trueolarak ayarlayın ve Tamam'ı seçin.
  4. Yapılandırma sayfasının üst kısmındaki Kaydet'i seçin.
  5. İşlem hattını yeniden çalıştırın. Bağımlılıklarınız dağıtım sırasında yüklenmelidir.

İşlem hattı çalıştırmasını tetikleme

İşlem hattı çalıştırmasını tetikleme için depoda bir değişiklik gerçekleştirin. Örneğin, uygulamaya yeni bir özellik ekleyebilir veya uygulamanın bağımlılıklarını güncelleştirebilirsiniz.

  1. GitHub deponuza gidin.
  2. Kodda, örneğin uygulamanın başlığını değiştirme gibi bir değişiklik yapın.
  3. Değişikliği deponuza işleyin.
  4. İşlem hattınıza gidin ve yeni bir çalıştırma oluşturulduğunu doğrulayın.
  5. Çalıştırma tamamlandığında yeni derlemenin web uygulamanıza dağıtıldığından emin olun.
    1. Azure portalında web uygulamanıza gidin.
    2. Dağıtım Merkezi'ni seçin ve Günlükler sekmesini seçin.
    3. Yeni dağıtımın listelendiğini doğrulayın.

Django için dikkat edilmesi gerekenler

Ayrı bir veritabanı kullanıyorsanız Django uygulamalarını Linux'ta Azure Uygulaması Hizmeti'ne dağıtmak için Azure Pipelines'ı 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 bölümünde açıklandığı gibi App Service, uygulama kodunuz içinde genellikle uygulama nesnesini içeren bir wsgi.py dosyasını otomatik olarak arar. Başlangıç komutunu herhangi bir şekilde özelleştirmek istiyorsanız, önceki bölümde açıklandığı gibi YAML işlem hattı dosyanızın adımındaki parametresini AzureWebApp@1 kullanınstartUpCommand.

Django kullanırken genellikle uygulama kodunu dağıtdıktan sonra kullanarak manage.py migrate veri modellerini geçirmek istersiniz. Bu amaçla dağıtım sonrası betiğiyle ekleyebilirsiniz startUpCommand . Örneğin, AzureWebApp@1 görevindeki özelliği aşağıda startUpCommand verilmiştir.

  - task: AzureWebApp@1
      displayName: 'Deploy Azure Web App : $(webAppName)'
      inputs:
        azureSubscription: $(azureServiceConnectionId)
        appName: $(webAppName)
        package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
        startUpCommand: 'python manage.py migrate'

Derleme aracısı üzerinde test çalıştırma

Derleme işleminizin bir parçası olarak, uygulama kodunuz üzerinde testler çalıştırmak isteyebilirsiniz. Testler derleme aracısı üzerinde çalıştırıldığından, bağımlılıklarınızı derleme aracısının sanal ortamına yüklemeniz gerekir. Testler çalıştırıldıktan sonra, dağıtım için .zip dosyasını oluşturmadan önce sanal ortamı silin. Aşağıdaki betik öğeleri bu işlemi gösterir. Bunları azure-pipelines.yml dosyasında görevin önüne ArchiveFiles@2 yerleştirin. Daha fazla bilgi için bkz . Platformlar arası betikleri çalıştırma.

# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
    python -m venv .env
    source .env/bin/activate
    pip install setuptools
    pip install -r requirements.txt

  # The displayName shows in the pipeline UI when a build runs
  displayName: 'Install dependencies on build agent'

- script: |
    # Put commands to run tests here
    displayName: 'Run tests'

- script: |
    echo Deleting .env
    deactivate
    rm -rf .env
  displayName: 'Remove .env before zip'

Test sonuçlarını işlem hattınızda yayımlamak için PublishTestResults@2 gibi bir görev de kullanabilirsiniz. Daha fazla bilgi için bkz . Python uygulamaları oluşturma - Testleri çalıştırma.

Kaynakları temizleme

Bu öğreticide oluşturulan Azure kaynaklarında ücret yansıtılmasını önlemek için:

  • Oluşturduğunuz projeyi silin. Proje silindiğinde işlem hattı ve hizmet bağlantısı silinir.

  • App Service'i ve App Service Planını içeren Azure kaynak grubunu silin. Azure portalında kaynak grubuna gidin, Kaynak grubunu sil'i seçin ve istemleri izleyin.

  • Cloud Shell için dosya sistemini koruyan depolama hesabını silin. Cloud Shell'i kapatın ve cloud-shell-storage- ile başlayan kaynak grubuna gidin, Kaynak grubunu sil'i seçin ve istemleri izleyin.

Sonraki adımlar