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 úlohu lint.
- 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 úlohu lint nemusíte ve skutečnosti 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.
Ve složce .github/workflows vytvořte nový soubor 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
Všimněte si, že se na úlohy použije podmínka. Předběžné ověření se spouští jenom pro neprodukční prostředí. Operace citlivostní operace 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.
Tip
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 testovací úlohy orientačního 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.
Odeberte obsah oddílu
env:
, včetně dvou proměnných prostředí. Brzy je nahradíte proměnnými specifickými pro prostředí.Odeberte obsah
lint:
definice úlohy a nahraďte ho následujícím kódem, aby se použil 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. Potom používá deploy.yml volaný pracovní postup dvakrát: jednou pro každé prostředí. 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 provedené 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 se do úložiště nasdílíte poprvé, může se zobrazit výzva k přihlášení.
Ve Windows zadejte 1 pro 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.
Zobrazení spuštění pracovního postupu
V prohlížeči přejděte na Akce.
První spuštění pracovního postupu s popiskem Počáteční potvrzení se zobrazí jako selhá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 nasazení-toy-website-environment.
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.
Výběrem tlačítka Zkontrolovat nasazení schvalte nasazení do produkčního prostředí.
Vyberte produkční prostředí 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 produkční nasazení.
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 potvrzení 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 web Azure Portal.
Přejděte do skupiny prostředků ToyWebsiteProduction .
V seznamu prostředků otevřete aplikaci Aplikace Azure 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.