Oefening: een webtoepassing implementeren
Bij uw speelgoedbedrijf heeft uw team voor websiteontwikkeling de nieuwste versie van de website doorgevoerd in uw Git-opslagplaats. U bent nu klaar om uw werkstroom bij te werken om de website te bouwen en deze te implementeren in Azure-app Service.
In het proces gaat u het volgende doen:
- Voeg een nieuwe werkstroom toe voor de buildtaak.
- Werk de werkstroom bij om de buildtaak op te nemen.
- Voeg een nieuwe betrouwbaarheidstest toe.
- Werk de implementatietaak bij om de toepassing te implementeren.
- De werkstroom uitvoeren.
Een herbruikbare werkstroom toevoegen voor de buildtaak
Hier voegt u een nieuwe taakdefinitie toe die de stappen bevat die nodig zijn om de websitetoepassing te bouwen.
Open Visual Studio Code.
Maak in de map .github/workflows een nieuw bestand met de naam build.yml.
Voeg de volgende inhoud toe aan het werkstroombestand build.yml :
name: build-website on: workflow_call: jobs: build-application: name: Build application runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install .NET Core uses: actions/setup-dotnet@v3 with: dotnet-version: 3.1 - name: Build publishable website run: | dotnet publish --configuration Release working-directory: ./src/ToyCompany/ToyCompany.Website - name: Zip publishable website run: | zip -r publish.zip . working-directory: ./src/ToyCompany/ToyCompany.Website/bin/Release/netcoreapp3.1/publish - name: Upload website as workflow artifact uses: actions/upload-artifact@v3 with: name: website path: ./src/ToyCompany/ToyCompany.Website/bin/Release/netcoreapp3.1/publish/publish.zip
Met de taak wordt de .NET SDK geïnstalleerd om de oplossing te bouwen. Vervolgens wordt een buildstap uitgevoerd om de broncode van de websitetoepassing om te zetten in een gecompileerd bestand dat klaar is om te worden uitgevoerd in Azure. De taak comprimeert vervolgens het gecompileerde artefact en uploadt het als een werkstroomartefact.
Sla de wijzigingen in het bestand op.
De buildtaak toevoegen aan de werkstroom
Open het bestand workflow.yml .
Onder de taken: regel, vóór de linttaak, voegt u een nieuwe taak met de naam build toe die gebruikmaakt van de herbruikbare werkstroom die u zojuist hebt gedefinieerd:
name: deploy-toy-website-end-to-end concurrency: toy-company on: push: branches: - main workflow_dispatch: permissions: id-token: write contents: read jobs: # Build the application and database. build: uses: ./.github/workflows/build.yml # Lint the Bicep file. lint: uses: ./.github/workflows/lint.yml
Werk de taak deploy-test bij zodat deze afhankelijk is van de nieuwe build-taak :
# Deploy to the test environment. deploy-test: uses: ./.github/workflows/deploy.yml needs: [build, lint] with: environmentType: Test resourceGroupName: ToyWebsiteTest reviewApiUrl: https://sandbox.contoso.com/reviews secrets: AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_TEST }} AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} reviewApiKey: ${{ secrets.REVIEW_API_KEY_TEST }}
Werk de implementatie-productietaak bij zodat deze ook afhankelijk is van de build - en linttaken .
# Deploy to the production environment. deploy-production: uses: ./.github/workflows/deploy.yml needs: - lint - build - deploy-test with: environmentType: Production resourceGroupName: ToyWebsiteProduction reviewApiUrl: https://api.contoso.com/reviews secrets: AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_PRODUCTION }} AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} reviewApiKey: ${{ secrets.REVIEW_API_KEY_PRODUCTION }}
Omdat de productie-implementatie afhankelijk is van de testimplementatie, hoeft u niet strikt de afhankelijkheden op te geven. Het is echter een goede gewoonte om expliciet te zijn, om te voorkomen dat uw werkstroom onjuist wordt uitgevoerd als u uw taken of omgevingen opnieuw rangschikt of verwijdert.
U ziet dat u de
needs
lijst op twee verschillende manieren opgeeft: de afhankelijkheden van uw testomgevingsimplementatie worden op één regel weergegeven en de productieomgeving wordt gebruikt met behulp van een lijst met meerdere regels. De twee benaderingen zijn gelijkwaardig.Sla de wijzigingen in het bestand op.
Het betrouwbaarheidstestbestand bijwerken
De websiteontwikkelaars hebben een statuseindpunt toegevoegd aan de website. Dit eindpunt controleert of de website online is en of deze de database kan bereiken. Hier voegt u een nieuwe betrouwbaarheidstest toe om de statuscontrole aan te roepen vanuit uw implementatiewerkstroom.
Open het bestand Website.Tests.ps1 in de map Deploy .
Voeg een nieuwe testcase toe waarmee de statuscontrole wordt aangeroepen. De testcase mislukt als de antwoordcode niet 200 is, wat aangeeft dat de test is geslaagd:
param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string] $HostName ) Describe 'Toy Website' { It 'Serves pages over HTTPS' { $request = [System.Net.WebRequest]::Create("https://$HostName/") $request.AllowAutoRedirect = $false $request.GetResponse().StatusCode | Should -Be 200 -Because "the website requires HTTPS" } It 'Does not serves pages over HTTP' { $request = [System.Net.WebRequest]::Create("http://$HostName/") $request.AllowAutoRedirect = $false $request.GetResponse().StatusCode | Should -BeGreaterOrEqual 300 -Because "HTTP is not secure" } It 'Returns a success code from the health check endpoint' { $response = Invoke-WebRequest -Uri "https://$HostName/health" -SkipHttpErrorCheck Write-Host $response.Content $response.StatusCode | Should -Be 200 -Because "the website and configuration should be healthy" } }
Sla de wijzigingen in het bestand op.
Uitvoer toevoegen aan Bicep-bestand
Binnenkort voegt u een implementatiestap toe waarmee uw website naar Azure-app Service wordt gepubliceerd. Voor de publicatiestap is de naam van de App Service-app vereist. Hier maakt u de naam van de app beschikbaar als uitvoer van uw Bicep-bestand.
Open het bestand main.bicep in de implementatiemap .
Voeg aan het einde van de bestandsinhoud de naam van de App Service-app toe als uitvoer:
output appServiceAppName string = appServiceApp.name output appServiceAppHostName string = appServiceApp.properties.defaultHostName
Sla de wijzigingen in het bestand op.
De implementatietaak bijwerken om de uitvoer door te geven
Nu moet u uw implementatietaak bijwerken om de waarde van de uitvoer van de Bicep-implementatie te nemen en deze beschikbaar te maken voor de rest van de werkstroom.
Open het bestand deploy.yml in de map .github/workflows .
Voeg in de definitie van de implementatietaak een nieuwe uitvoer toe voor het
appServiceAppName
volgende:deploy: needs: validate environment: ${{ inputs.environmentType }} runs-on: ubuntu-latest outputs: appServiceAppName: ${{ steps.deploy.outputs.appServiceAppName }} appServiceAppHostName: ${{ steps.deploy.outputs.appServiceAppHostName }} steps:
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 wilt, kunt u de volgende code boven aan het bestand toevoegen om de schatting van de extensie te onderdrukken:
# yaml-language-server: $schema=./deploy.yml
Een taak toevoegen om de website te implementeren
Definieer onder de definitie van de implementatietaak en boven de definitie van de betrouwbaarheidstesttaak een nieuwe taak voor het implementeren van de website in App Service:
deploy-website: needs: deploy environment: ${{ inputs.environmentType }} runs-on: ubuntu-latest steps: - uses: actions/download-artifact@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/webapps-deploy@v2 name: Deploy website with: app-name: ${{ needs.deploy.outputs.appServiceAppName }} package: website/publish.zip
Notitie
Wees voorzichtig met de inspringing van het YAML-bestand, zodat de nieuwe taak op hetzelfde niveau wordt ingesprongen als de
deploy
taak. Als u het niet zeker weet, kopieert u de hele deploy.yml bestandsinhoud uit het voorbeeld in de volgende stap.U ziet dat de taak afhankelijk is van de implementatietaak met behulp van het
needs
trefwoord. Deze afhankelijkheid zorgt ervoor dat de website pas wordt geïmplementeerd als de infrastructuur gereed is. Hiermee kan de taak ook toegang krijgen tot deappServiceAppName
uitvoer van de implementatietaak .U ziet ook dat deze taak stappen bevat voor het downloaden van de werkstroomartefacten en om u aan te melden bij Azure. Elke taak wordt uitgevoerd op een eigen runner, dus moet deze zelfstandig zijn.
Sla de wijzigingen in het bestand op.
Controleer de inhoud van het deploy.yml bestand en voer uw wijzigingen door
Controleer of uw deploy.yml bestand eruitziet als in het volgende voorbeeld:
name: deploy on: workflow_call: inputs: environmentType: required: true type: string resourceGroupName: required: true type: string reviewApiUrl: required: true type: string secrets: AZURE_CLIENT_ID: required: true AZURE_TENANT_ID: required: true AZURE_SUBSCRIPTION_ID: required: true reviewApiKey: 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 }} reviewApiUrl=${{ inputs.reviewApiUrl }} reviewApiKey=${{ secrets.reviewApiKey }} 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 }} reviewApiUrl=${{ inputs.reviewApiUrl }} reviewApiKey=${{ secrets.reviewApiKey }} additionalArguments: --what-if deploy: needs: validate environment: ${{ inputs.environmentType }} runs-on: ubuntu-latest outputs: appServiceAppName: ${{ steps.deploy.outputs.appServiceAppName }} 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 }} reviewApiUrl=${{ inputs.reviewApiUrl }} reviewApiKey=${{ secrets.reviewApiKey }} deploy-website: needs: deploy environment: ${{ inputs.environmentType }} runs-on: ubuntu-latest steps: - uses: actions/download-artifact@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/webapps-deploy@v2 name: Deploy website with: app-name: ${{ needs.deploy.outputs.appServiceAppName }} package: website/publish.zip 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.
Voer in de Visual Studio Code-terminal uw wijzigingen door en push deze naar uw Git-opslagplaats door de volgende opdrachten uit te voeren:
git add . git commit -m "Build and deploy website application" git push
Dit is de eerste keer dat u naar deze opslagplaats hebt gepusht, dus u wordt mogelijk gevraagd u aan te melden.
Typ in Windows 1 om te verifiëren met behulp van een webbrowser en selecteer Enter.
Selecteer Autoriseren in macOS.
Er wordt een browservenster geopend. Mogelijk moet u zich opnieuw aanmelden bij GitHub. Selecteer Autoriseren.
De werkstroom uitvoeren
Ga in uw browser naar Acties.
De eerste uitvoering van uw werkstroom, met het label Eerste doorvoer, wordt weergegeven als een fout. GitHub heeft de werkstroom automatisch uitgevoerd toen u de opslagplaats maakte. Het is mislukt omdat de geheimen op dat moment niet gereed waren. U kunt deze fout negeren.
Selecteer de end-to-end-end-end-werkstroom voor het implementeren van speelgoed.
Selecteer de meest recente uitvoering van uw werkstroom.
Wacht totdat de buildtaak is voltooid.
Wacht totdat de implementatietest/implementatietaak is voltooid.
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.
De werkstroom voert vervolgens de taak deploy-test/betrouwbaarheidstest uit, maar de betrouwbaarheidstest mislukt:
Selecteer de taak deploy-test/smoke-test om het werkstroomlogboek te openen.
Selecteer de stap Betrouwbaarheidstests uitvoeren om de bijbehorende sectie van het werkstroomlogboek weer te geven:
U ziet dat het werkstroomlogboek aangeeft dat de website en configuratie niet in orde zijn. Er is een probleem met de communicatie van de toepassing met Azure SQL Database. U hebt nog geen database geïmplementeerd of geconfigureerd. Daarom heeft de website er geen toegang toe. U lost dit probleem binnenkort op.