Oefening: meerdere omgevingen toevoegen aan uw werkstroom
U bent nu klaar om uw werkstroom bij te werken om te implementeren in zowel uw test- als productieomgevingen. In deze eenheid werkt u uw werkstroom bij om gebruik te maken van aangeroepen werkstromen, zodat u de taken in de omgevingen kunt hergebruiken.
Tijdens het proces gaat u het volgende doen:
- Voeg een herbruikbare workflow toe voor de lint-job.
- Voeg een herbruikbare werkstroom toe waarmee de taken worden gedefinieerd die nodig zijn om te implementeren in elke omgeving.
- Werk uw werkstroom bij om de aangeroepen werkstromen te benutten.
- Voer uw werkstroom uit en bekijk de resultaten.
Een herbruikbare werkstroom toevoegen voor de linttaak
De linttaak vindt slechts eenmaal plaats tijdens de uitvoering van de workflow, ongeacht het aantal omgevingen waarin de workflow wordt ingezet. Je hoeft dus niet echt een aangeroepen workflow te gebruiken voor de linttaak. Maar om uw hoofdwerkstroomdefinitiebestand eenvoudig en gemakkelijk leesbaar te houden, besluit u om de linttaak in een afzonderlijk werkstroombestand te definiëren.
Maak in Visual Studio Code een nieuw bestand in de map .github/workflows map met de naam lint.yml.
Plak de volgende werkstroomdefinitie in het bestand:
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
De linttaak is hetzelfde als de linttaak die zich al in de werkstroom bevindt, maar nu in een afzonderlijk werkstroombestand.
Sla uw wijzigingen op en sluit het bestand.
Een herbruikbare werkstroom toevoegen voor implementatie
Maak een herbruikbare werkstroom waarmee alle taken worden gedefinieerd die nodig zijn om elk van uw omgevingen te implementeren. U gebruikt invoer en geheimen om de instellingen op te geven die mogelijk verschillen tussen omgevingen.
Maak een nieuw bestand in de map .github/workflows met de naam deploy.yml.
nl-NL:
Dit bestand vertegenwoordigt alle implementatieactiviteiten die worden uitgevoerd voor elk van uw omgevingen.
Plak de volgende werkstroomnaam, trigger, invoer en geheimen in het bestand:
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
Notitie
Wanneer u aan de slag gaat met uw YAML-bestand in Visual Studio Code, ziet u mogelijk enkele rode golvende lijnen die u vertellen dat er een probleem is. Dit komt doordat de Visual Studio Code-extensie voor YAML-bestanden soms ten onrechte het schema van het bestand raadt.
U kunt de problemen negeren die door de extensie worden gerapporteerd. Of als u dat wilt, kunt u de volgende code aan het begin van het bestand toevoegen om te voorkomen dat de extensie gissingen maakt.
# yaml-language-server: $schema=./deploy.yml
Plak onder de geheimen de definitie van de validatietaak:
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
U ziet dat een voorwaarde wordt toegepast op de taken. De preflight-validatie wordt alleen uitgevoerd voor niet-productieomgevingen. De wat-als-bewerking wordt alleen voor de productieomgeving uitgevoerd. In de vorige module in het leertraject hebt u afzonderlijke taken voor deze bewerkingen gebruikt, maar hier combineert u deze om de werkstroom te vereenvoudigen.
Tip
YAML-bestanden zijn gevoelig voor inspringing. Controleer of de inspringing juist is, ongeacht of u deze code typt of plakt. Verderop in deze oefening ziet u de volledige YAML-werkstroomdefinitie, zodat u kunt controleren of het bestand overeenkomt.
Plak onder de validatietaak de definitie van de implementatietaak:
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 }}
Plak onder de implementatietaak de definitie van de smoketesttaak.
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
Controleer of uw deploy.yml bestand er nu uitziet zoals in het volgende voorbeeld:
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
Sla de wijzigingen in het bestand op.
De werkstroomdefinitie bijwerken om de sjablonen te gebruiken
Open het bestand workflow.yml in de map .github/workflows.
Verwijder de inhoud van de sectie
env:
, inclusief de twee omgevingsvariabelen. U vervangt deze binnenkort door omgevingsspecifieke variabelen.Verwijder de inhoud van de
lint:
taakdefinitie en vervang deze door de volgende code om het lint.yml bestand te gebruiken dat u eerder hebt gemaakt:# Lint the Bicep file. lint: uses: ./.github/workflows/lint.yml
Verwijder alles in het bestand onder de linttaak die u hebt bijgewerkt.
Voeg onder aan het bestand de volgende code toe om te implementeren in de testomgeving:
# 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 }}
Voeg onder de code die u zojuist hebt toegevoegd de volgende code toe om te implementeren in de productieomgeving:
# 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 }}
De bijgewerkte werkstroom voert de linttaak eenmaal uit. Daarna gebruikt het de workflow genaamd deploy.yml twee keer: één keer per omgeving. Hierdoor blijft de werkstroomdefinitie duidelijk en gemakkelijk te begrijpen. De opmerkingen in het YAML-bestand identificeren de doelomgeving van elke taak.
Controleer of uw workflow.yml bestand eruitziet zoals in het volgende voorbeeld:
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 }}
Sla uw wijzigingen op.
Voer uw wijzigingen door en push deze naar uw Git-opslagplaats door de volgende opdrachten uit te voeren in de Visual Studio Code-terminal:
git add . git commit -m "Add reusable workflows" git push
Omdat dit de eerste keer is dat u naar de opslagplaats pusht, wordt u mogelijk gevraagd u aan te melden.
Typ in Windows 1 om te verifiëren met een webbrowser en selecteer Enter.
Selecteer in macOS Autoriseren.
Er wordt een browservenster weergegeven. Mogelijk moet u zich opnieuw aanmelden bij GitHub. Selecteer Autoriseren.
De uitvoering van de workflow weergeven
Ga in uw browser naar Acties.
De eerste uitvoering van uw werkstroom, met het label initiële commit, wordt als een mislukking weergegeven. GitHub heeft de workflow automatisch uitgevoerd toen u de repository maakte. Het is mislukt omdat de geheimen op dat moment niet gereed waren. U kunt deze fout negeren.
Selecteer de implementatie-toy-website-omgevingen werkstroom.
Kies de meest recente uitvoering van uw workflow.
U ziet dat in de werkstroom nu alle taken worden weergegeven die u hebt gedefinieerd in de YAML-bestanden.
Sommige waarschuwingen worden weergegeven in het deelvenster Aantekeningen. Al deze waarschuwingen zijn te maken met de manier waarop Bicep informatieve berichten naar het werkstroomlogboek schrijft. U kunt deze waarschuwingen negeren.
Wacht tot de werkstroom pauzeert voor de implementatie-productie/deploy taak. Het kan enkele minuten duren voordat de werkstroom dit punt bereikt.
Keur de implementatie goed in de productieomgeving door de knop Implementaties controleren te selecteren.
Selecteer de Production-omgeving en selecteer vervolgens de knop Goedkeuren en implementeren.
Wacht tot de werkstroom klaar is met uitvoeren. De werkstroom is succesvol voltooid.
Selecteer Code.
Selecteer de productie--implementatie.
U ziet in het implementatiescherm een overzicht van de implementatiegeschiedenis van de productieomgeving.
Selecteer de doorvoer-id.
Op GitHub ziet u de lijst met commits die zijn opgenomen in de implementatie. Dit helpt u om de wijzigingen in uw omgeving in de loop van de tijd te zien.
Ga in uw browser naar de Azure Portal.
Ga naar de ToyWebsiteProduction resourcegroep.
Open de Azure App Service-app in de lijst met resources.
U ziet dat het type App Service-plan is S1.
Ga naar de App Service-app in de resourcegroep ToyWebsiteTest.
Merk op dat het type App Service-plan F1is. De twee omgevingen gebruiken verschillende instellingen, zoals u hebt gedefinieerd in uw Bicep-bestand.