Cvičení – přidání více prostředí do pracovního postupu
Teď jste připraveni aktualizovat pracovní postup tak, aby se nasadil do testovacího i produkčního prostředí. V této lekci aktualizujete pracovní postup tak, aby používal označované pracovní postupy, abyste mohli opakovaně používat úlohy v různých prostředích.
Během tohoto procesu:
- Přidejte opakovaně použitelný pracovní postup pro úkol lintování.
- Přidejte opakovaně použitelný pracovní postup, který definuje úlohy potřebné k nasazení do libovolného prostředí.
- Aktualizujte pracovní postup tak, aby používal volané pracovní postupy.
- Spusťte pracovní postup a prohlédněte si výsledky.
Přidání opakovaně použitelného pracovního postupu pro úlohu lint
Úloha lint probíhá pouze jednou během spuštění pracovního postupu bez ohledu na to, do jakého počtu prostředí se pracovní postup nasadí. Takže pro lint úlohu opravdu nemusíte používat volaný pracovní postup. Pokud ale chcete hlavní definiční soubor pracovního postupu zachovat jednoduchý a snadno čitelný, rozhodnete se definovat úlohu lint v samostatném souboru pracovního postupu.
V editoru Visual Studio Code vytvořte nový soubor ve složce .github/workflows s názvem lint.yml.
Do souboru vložte následující definici pracovního postupu:
name: lint on: workflow_call: jobs: lint: name: Lint code runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Lint code run: | az bicep build --file deploy/main.bicep
Úloha lint je stejná jako úloha lint již v pracovním postupu, ale teď je v samostatném souboru pracovního postupu.
Uložte změny a zavřete soubor.
Přidání opakovaně použitelného pracovního postupu pro nasazení
Vytvořte opakovaně použitelný pracovní postup, který definuje všechny úlohy potřebné k nasazení jednotlivých prostředí. K určení nastavení, která se můžou lišit mezi prostředími, použijete vstupy a tajné kódy.
Vytvořte nový soubor ve složce .github/workflows s názvem deploy.yml.
Tento soubor představuje všechny aktivity nasazení, které se spouští pro každé z vašich prostředí.
Do souboru vložte následující název pracovního postupu, trigger, vstupy a tajné kódy:
name: deploy on: workflow_call: inputs: environmentType: required: true type: string resourceGroupName: required: true type: string secrets: AZURE_CLIENT_ID: required: true AZURE_TENANT_ID: required: true AZURE_SUBSCRIPTION_ID: required: true
Poznámka
Když začnete pracovat se souborem YAML v editoru Visual Studio Code, může se zobrazit několik červených vlnovek s informací, že došlo k problému. Důvodem je to, že přípona editoru Visual Studio Code pro soubory YAML někdy nesprávně odhadne schéma souboru.
Problémy, které rozšíření hlásí, můžete ignorovat. Nebo pokud chcete, můžete do horní části souboru přidat následující kód, který potlačí odhad přípony:
# yaml-language-server: $schema=./deploy.yml
Pod tajné kódy vložte definici ověřovací úlohy:
jobs: validate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - if: inputs.environmentType != 'Production' uses: azure/arm-deploy@v1 name: Run preflight validation with: deploymentName: ${{ github.run_number }} resourceGroupName: ${{ inputs.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=${{ inputs.environmentType }} deploymentMode: Validate - if: inputs.environmentType == 'Production' uses: azure/arm-deploy@v1 name: Run what-if with: failOnStdErr: false resourceGroupName: ${{ inputs.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=${{ inputs.environmentType }} additionalArguments: --what-if
Uvědomte si, že na úlohy je aplikována podmínka. Předběžné ověření se spouští jenom pro neprodukční prostředí. Operace "co kdyby" se spouští pouze pro produkční prostředí. V předchozím modulu studijního programu jste pro tyto operace použili samostatné úlohy, ale tady je zkombinujete, abyste zjednodušili pracovní postup.
Spropitné
Soubory YAML jsou citlivé na odsazení. Bez ohledu na to, jestli tento kód napíšete nebo vložíte, zkontrolujte správnost odsazení. Později v tomto cvičení uvidíte úplnou definici pracovního postupu YAML, abyste mohli ověřit, že se váš soubor shoduje.
Pod úlohu ověření vložte definici úlohy nasazení:
deploy: needs: validate environment: ${{ inputs.environmentType }} runs-on: ubuntu-latest outputs: appServiceAppHostName: ${{ steps.deploy.outputs.appServiceAppHostName }} steps: - uses: actions/checkout@v3 - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - uses: azure/arm-deploy@v1 id: deploy name: Deploy Bicep file with: failOnStdErr: false deploymentName: ${{ github.run_number }} resourceGroupName: ${{ inputs.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=${{ inputs.environmentType }}
Pod úlohu nasazení vložte definici úlohy smoke testu:
smoke-test: runs-on: ubuntu-latest needs: deploy steps: - uses: actions/checkout@v3 - run: | $container = New-PesterContainer ` -Path 'deploy/Website.Tests.ps1' ` -Data @{ HostName = '${{needs.deploy.outputs.appServiceAppHostName}}' } Invoke-Pester ` -Container $container ` -CI name: Run smoke tests shell: pwsh
Ověřte, že váš soubor deploy.yml teď vypadá jako v následujícím příkladu:
name: deploy on: workflow_call: inputs: environmentType: required: true type: string resourceGroupName: required: true type: string secrets: AZURE_CLIENT_ID: required: true AZURE_TENANT_ID: required: true AZURE_SUBSCRIPTION_ID: required: true jobs: validate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - if: inputs.environmentType != 'Production' uses: azure/arm-deploy@v1 name: Run preflight validation with: deploymentName: ${{ github.run_number }} resourceGroupName: ${{ inputs.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=${{ inputs.environmentType }} deploymentMode: Validate - if: inputs.environmentType == 'Production' uses: azure/arm-deploy@v1 name: Run what-if with: failOnStdErr: false resourceGroupName: ${{ inputs.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=${{ inputs.environmentType }} additionalArguments: --what-if deploy: needs: validate environment: ${{ inputs.environmentType }} runs-on: ubuntu-latest outputs: appServiceAppHostName: ${{ steps.deploy.outputs.appServiceAppHostName }} steps: - uses: actions/checkout@v3 - uses: azure/login@v1 name: Sign in to Azure with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - uses: azure/arm-deploy@v1 id: deploy name: Deploy Bicep file with: failOnStdErr: false deploymentName: ${{ github.run_number }} resourceGroupName: ${{ inputs.resourceGroupName }} template: ./deploy/main.bicep parameters: > environmentType=${{ inputs.environmentType }} smoke-test: runs-on: ubuntu-latest needs: deploy steps: - uses: actions/checkout@v3 - run: | $container = New-PesterContainer ` -Path 'deploy/Website.Tests.ps1' ` -Data @{ HostName = '${{needs.deploy.outputs.appServiceAppHostName}}' } Invoke-Pester ` -Container $container ` -CI name: Run smoke tests shell: pwsh
Uložte změny souboru.
Aktualizace definice pracovního postupu tak, aby používala šablony
Otevřete soubor workflow.yml ve složce .github/workflows.
Odstraňte obsah části
env:
, včetně dvou proměnných prostředí. Brzy je nahradíte proměnnými specifickými pro prostředí.Odeberte obsah definice úlohy
lint:
a nahraďte ho následujícím kódem, abyste použili soubor lint.yml, který jste vytvořili dříve:# Lint the Bicep file. lint: uses: ./.github/workflows/lint.yml
Odstraňte všechno v souboru pod úlohou lint, kterou jste aktualizovali.
Do dolní části souboru přidejte následující kód, který se nasadí do testovacího prostředí:
# Deploy to the test environment. deploy-test: uses: ./.github/workflows/deploy.yml needs: lint with: environmentType: Test resourceGroupName: ToyWebsiteTest secrets: AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_TEST }} AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
Pod kód, který jste právě přidali, přidejte následující kód pro nasazení do produkčního prostředí:
# Deploy to the production environment. deploy-production: uses: ./.github/workflows/deploy.yml needs: deploy-test with: environmentType: Production resourceGroupName: ToyWebsiteProduction secrets: AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_PRODUCTION }} AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
Aktualizovaný pracovní postup spustí úlohu „lint“ jednou. Poté používá workflow deploy.yml dvakrát: pro každé prostředí jednou. Díky tomu je definice pracovního postupu jasná a snadno pochopitelná. Komentáře v souboru YAML identifikují cílové prostředí jednotlivých úloh.
Ověřte, že váš soubor workflow.yml vypadá jako v následujícím příkladu:
name: deploy-toy-website-environments concurrency: toy-company on: push: branches: - main workflow_dispatch: permissions: id-token: write contents: read jobs: # Lint the Bicep file. lint: uses: ./.github/workflows/lint.yml # Deploy to the test environment. deploy-test: uses: ./.github/workflows/deploy.yml needs: lint with: environmentType: Test resourceGroupName: ToyWebsiteTest secrets: AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_TEST }} AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} # Deploy to the production environment. deploy-production: uses: ./.github/workflows/deploy.yml needs: deploy-test with: environmentType: Production resourceGroupName: ToyWebsiteProduction secrets: AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_PRODUCTION }} AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
Uložte změny.
Potvrďte a nasdílejte změny do úložiště Git spuštěním následujících příkazů v terminálu editoru Visual Studio Code:
git add . git commit -m "Add reusable workflows" git push
Vzhledem k tomu, že provádíte první odeslání do úložiště, může se zobrazit výzva k přihlášení.
Ve Windows zadejte 1 k ověření pomocí webového prohlížeče a vyberte Enter.
V systému macOS vyberte Autorizovat.
Zobrazí se okno prohlížeče. Možná se budete muset znovu přihlásit k GitHubu. Vyberte Autorizovat.
Zobrazit spuštění pracovního postupu
V prohlížeči přejděte na Akce.
První spuštění vašeho pracovního postupu s označením počáteční závazekje označeno jako neúspěšné. GitHub automaticky spustil pracovní postup při vytváření úložiště. Selhalo, protože tajné kódy nebyly v té době připravené. Toto selhání můžete ignorovat.
Vyberte pracovní postup nasadit prostředí webových stránek pro hračky.
Vyberte poslední spuštění pracovního postupu.
Všimněte si, že spuštění pracovního postupu teď zobrazuje všechny úlohy, které jste definovali v souborech YAML.
Některá upozornění jsou uvedena na panelu Poznámky. Všechna tato upozornění jsou způsobená způsobem, jakým Bicep zapisuje informační zprávy do protokolu pracovního postupu. Tato upozornění můžete ignorovat.
Počkejte, než se pracovní postup pozastaví před úlohou deploy-production / deploy. Dosažení tohoto bodu může trvat několik minut.
Schvalte nasazení do produkčního prostředí výběrem tlačítka Zkontrolovat nasazení.
Vyberte prostředí Production a pak vyberte tlačítko Schválit a nasadit.
Počkejte, až se pracovní postup dokončí. Pracovní postup se úspěšně dokončí.
Vyberte kód.
Vyberte nasazení Production.
Všimněte si, že na obrazovce nasazení se zobrazí přehled historie nasazení produkčního prostředí.
Vyberte identifikátor potvrzení.
Všimněte si, že GitHub zobrazuje seznam commitů zahrnutých v nasazení. To vám pomůže zobrazit změny ve vašem prostředí v průběhu času.
V prohlížeči přejděte na portál Azure.
Přejděte do skupiny prostředků ToyWebsiteProduction.
V seznamu prostředků otevřete aplikaci Azure App Service.
Všimněte si, že typ plánu služby App Service je S1.
Přejděte do aplikace App Service ve skupině prostředků ToyWebsiteTest.
Všimněte si, že typ plánu služby App Service je F1. Obě prostředí používají různá nastavení, jak jste definovali v souboru Bicep.