Hoe gebruik ik GitHub Actions om te implementeren naar Azure?

Voltooid

In deze les wordt beschreven hoe u GitHub-acties gebruikt om een web-app op basis van containers te implementeren in Microsoft Azure Web Apps. Hierin worden enkele opties besproken voor het activeren van een werkstroom. Vervolgens leert u hoe u met voorwaarden in de werkstroom kunt werken. Ten slotte leert u hoe u Azure-resources maakt en verwijdert met behulp van GitHub Actions.

Opties voor het activeren van een CD-werkstroom

Er zijn diverse opties voor het starten van een CD-werkstroom. In de vorige module over CI met GitHub Actions hebt u geleerd hoe u een werkstroom kunt activeren via een push naar de GitHub-opslagplaats. Voor CD wilt u echter mogelijk een implementatiewerkstroom activeren voor een andere gebeurtenis.

U kunt de werkstroom onder andere activeren met ChatOps. ChatOps maakt gebruik van chatclients, chatbots en realtime communicatiehulpprogramma's om taken uit te voeren. U wilt bijvoorbeeld een specifieke opmerking plaatsen in een pull-aanvraag waardoor een bot kan worden geactiveerd. Die bot kan reageren door u statistieken te geven of door een werkstroom uit te voeren.

Een andere optie is het gebruik van labels in uw pull-aanvraag. Dit is de optie die wij in ons voorbeeld zullen gebruiken. Verschillende labels kunnen verschillende werkstromen starten. Voeg bijvoorbeeld een faselabel toe om een implementatiewerkstroom te starten in uw faseringsomgeving. U kunt ook een omgevingslabel toevoegen om de werkstroom uit te voeren waarmee de Microsoft Azure-resources worden gemaakt waarnaar u kunt implementeren. Als u labels wilt gebruiken, ziet uw werkstroom er als volgt uit:

on:
  pull_request:
    types: [labeled]

Uitvoeringen beheren met een taakvoorwaarde

Vaak wilt u alleen een werkstroom uitvoeren als er aan een bepaalde voorwaarde wordt voldaan.

GitHub-werkstromen bieden de if voorwaarde voor dit scenario. De voorwaarde maakt gebruik van een expressie die tijdens runtime wordt geëvalueerd. U wilt deze werkstroom bijvoorbeeld uitvoeren als er een faselabel wordt toegevoegd aan de pull-aanvraag.

if: contains(github.event.pull_request.labels.*.name, 'stage')

Referenties opslaan met GitHub Secrets

U wilt nooit gevoelige informatie beschikbaar maken in het werkstroombestand. GitHub Secrets is een veilige plek om gevoelige informatie op te slaan die uw werkstroom nodig heeft. Dit is een voorbeeld.

Als u wilt implementeren naar een Azure-resource, moet de GitHub Action toestemming hebben voor toegang tot de resource. U wilt natuurlijk niet dat uw Azure-referenties voor het oog van iedereen in het werkstroombestand worden opgeslagen. In plaats daarvan kunt u uw referenties opslaan in GitHub Secrets.

Als u informatie wilt opslaan in GitHub Secrets, maakt u een geheim in de portal.

Azure Portal interface voor het maken van een geheim.

Gebruik vervolgens de naam van het geheim dat u in uw werkstroom hebt gemaakt, waar u die informatie ook nodig hebt. Gebruik bijvoorbeeld de Azure-referentie die is opgeslagen in GitHub Secrets in het creds: kenmerk van een Azure-actie login .

steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

Implementeren naar Microsoft Azure met GitHub Actions

In de GitHub Marketplace staan diverse acties waarmee u Azure-taken kunt automatiseren.

De GitHub Marketplace met zoekresultaten voor Azure.

U kunt ook rechtstreeks in de werkstroomeditor van een opslagplaats in GitHub Actions zoeken of bladeren. In de zijbalk kunt u zoeken naar een specifieke actie, aanbevolen acties weergeven en door de weergegeven categorieën bladeren.

Naar een actie zoeken:

  1. Blader in uw opslagplaats naar het werkstroombestand dat u wilt bewerken.
  2. Selecteer het pictogram Bewerken in de rechterbovenhoek van de bestandsweergave.
  3. Gebruik de zijbalk van de GitHub Marketplace rechts van de editor om door acties te bladeren.

Stel dat u een op een containers gebaseerde web-app naar Azure Web Apps wilt implementeren. Als u in GitHub Marketplace zoekt, vindt u deze acties:

Als u deze acties aan de Deploy-to-Azure-taak toevoegt, ziet uw werkstroom er als volgt uit:

  Deploy-to-Azure:
    runs-on: ubuntu-latest
    needs: Build-Docker-Image
    name: Deploy app container to Azure
    steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - uses: azure/docker-login@v1
        with:
          login-server: ${{env.IMAGE_REGISTRY_URL}}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Deploy web app container
        uses: azure/webapps-deploy@v1
        with:
          app-name: ${{env.AZURE_WEBAPP_NAME}}
          images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}

      - name: Azure logout
        run: |
          az logout

U ziet dat deze taak afhankelijk is van een vorige taak, Build-Docker-Image. Bij de vorige taak werd het te implementeren artefact gemaakt.

De actie azure/login@v1 heeft referenties nodig om u aan te melden bij uw Azure-account, zodat deze toegang heeft tot de Azure-resources waarnaar u wilt implementeren. Gebruik hier de referenties die we hebben opgeslagen in GitHub Secrets.

Hetzelfde geldt voor de actie azure/docker-login@v1 . Omdat u een containerinstallatiekopieën implementeert, moet u zich aanmelden bij uw privécontainerregister.

De actie azure/webapps-deploy@v1 voert de implementatie uit. Dit hangt af van de twee voorgaande acties.

Azure-resources maken en verwijderen met behulp van GitHub Actions

Omdat CD een geautomatiseerd proces is, hebt u al besloten om infrastructuur als code te gebruiken om de omgevingen te maken en uit te schakelen waarnaar u implementeert. GitHub Actions kan deze taken in Azure automatiseren en u kunt deze acties opnemen in uw werkstroom.

Notitie

Houd er rekening mee dat het belangrijk is om resources te verwijderen die u niet meer zo snel mogelijk gebruikt om onnodige kosten te voorkomen.

Een van de opties is om een nieuwe werkstroom met twee taken te maken: met de ene taak worden resources gemaakt en met de andere taak worden deze verwijderd. Gebruik vervolgens een voorwaarde om alleen de gewenste taak uit te voeren. In dit voorbeeld zoekt de voorwaarde naar een label in de pull-aanvraag en wordt de set-up-azure-resources-taak uitgevoerd als het label omgeving maken is, en wordt de destroy-azure-resources-taak uitgevoerd als het label omgeving vernietigen is.

jobs:
  set-up-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'spin up environment')

    ...

  destroy-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'destroy environment')

    ...

Voor de taken wordt de Azure CLI gebruikt om de Azure-resources te maken en te vernietigen. Zie Overzicht van Azure CLI voor meer informatie over Azure CLI.

Hier ziet u een voorbeeld van de stappen in de set-up-azure-resources-taak:

steps:
  - name: Checkout repository
    uses: actions/checkout@v2

  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Create Azure resource group
    if: success()
    run: |
      az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create Azure app service plan
    if: success()
    run: |
      az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create webapp resource
    if: success()
    run: |
      az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }}  --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Configure webapp to use GitHub Packages
    if: success()
    run: |
      az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}

U ziet dat u GitHub Actions gebruikt om de opslagplaats te controleren en u bij Azure aan te melden. Daarna maakt u de resources die u nodig hebt en implementeert u de container met behulp van de Azure CLI.