Hvordan bruker jeg GitHub-handlinger til å distribuere til Azure?

Fullført

Denne enheten beskriver hvordan du bruker GitHub-handlinger til å distribuere en beholderbasert nettapp til Microsoft Azure Web Apps. Den dekker noen alternativer for å utløse en arbeidsflyt. Deretter lærer du hvordan du arbeider med betingede faktorer i arbeidsflyten. Til slutt lærer du hvordan du oppretter og sletter Azure-ressurser ved hjelp av GitHub-handlinger.

Alternativer for å utløse en CD-arbeidsflyt

Det finnes flere alternativer for å starte en CD-arbeidsflyt. I den forrige modulen på CI med GitHub Actions lærte du hvordan du utløser en arbeidsflyt fra et trykk til GitHub-repositoriet. For CD vil du imidlertid kanskje utløse en distribusjonsarbeidsflyt på en annen hendelse.

Ett alternativ er å utløse arbeidsflyten med ChatOps-. ChatOps bruker chatklienter, chatboter og kommunikasjonsverktøy i sanntid til å kjøre oppgaver. Du kan for eksempel legge igjen en bestemt kommentar i en pull-forespørsel som kan starte en robot. Denne roboten kan kommentere med noen statistikker eller kjøre en arbeidsflyt.

Et annet alternativ, og det vi bruker i vårt eksempel, er å bruke etiketter i pull-forespørselen. Ulike etiketter kan starte forskjellige arbeidsflyter. Legg for eksempel til en fase etikett for å starte en distribusjonsarbeidsflyt i oppsamlingsmiljøet, eller legg til en oppringingsmiljø etikett for å kjøre arbeidsflyten som oppretter Microsoft Azure-ressursene som du kan distribuere til. Hvis du vil bruke etiketter, ser arbeidsflyten slik ut:

on:
  pull_request:
    types: [labeled]

Kontrollere kjøring med en betinget jobb

Ofte vil du bare kjøre en arbeidsflyt hvis en bestemt betingelse er sann.

GitHub-arbeidsflyter gir if betinget for dette scenarioet. Det betingede bruker et uttrykk som evalueres ved kjøring. Du vil for eksempel kjøre denne arbeidsflyten hvis en fase etikett legges til pull-forespørselen.

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

Lagre legitimasjon med GitHub Secrets

Du vil aldri vise sensitiv informasjon i arbeidsflytfilen. GitHub Secrets er et sikkert sted å lagre sensitiv informasjon som arbeidsflyten trenger. Her er et eksempel:

Hvis du vil distribuere til en Azure-ressurs, må GitHub-handlingen ha tillatelse til å få tilgang til ressursen. Du vil ikke lagre Azure-legitimasjonen i vanlig syn i arbeidsflytfilen. I stedet kan du lagre legitimasjonen din i GitHub Secrets.

Hvis du vil lagre informasjon i GitHub Secrets, oppretter du en hemmelighet i portalen.

Skjermbilde av GitHub-portalgrensesnittet for å opprette en hemmelighet.

Bruk deretter navnet på hemmeligheten du opprettet i arbeidsflyten, uansett hvor du trenger denne informasjonen. Bruk for eksempel Azure-legitimasjonen som ble lagret i GitHub Secrets i creds: attributtet til en Azure login-handling.

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

Distribuer til Microsoft Azure ved hjelp av GitHub-handlinger

GitHub Marketplace- har flere handlinger som hjelper deg med å automatisere Azure-relaterte oppgaver.

Skjermbilde av GitHub Marketplace som viser søkeresultater for Azure.

Du kan også søke og bla gjennom GitHub-handlinger direkte i et repositoriums redigeringsprogram for arbeidsflyt. Fra sidepanelet kan du søke etter en bestemt handling, vise utvalgte handlinger og bla gjennom utvalgte kategorier.

Slik finner du en handling:

  1. Bla til arbeidsflytfilen du vil redigere, i repositoriet.
  2. Velg ikonet Rediger øverst til høyre i filvisningen.
  3. Bruk GitHub Marketplace-sidepanelet til høyre for redigeringsprogrammet for å bla gjennom handlinger.

La oss si at du vil distribuere en beholderbasert nettapp til Azure Web Apps. Hvis du søker i GitHub Marketplace, finner du disse handlingene:

Hvis du legger til disse handlingene i Deploy-to-Azure jobb, ser arbeidsflyten slik ut:

  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

Legg merke til at denne jobben avhenger av en tidligere jobb, Build-Docker-Image. Den forrige jobben oppretter artefakten som distribueres.

Handlingen azure/login@v1 trenger legitimasjon for å logge på Azure-kontoen, slik at den får tilgang til Azure-ressursene du vil distribuere til. Her kan du bruke legitimasjonen vi lagret i GitHub Secrets.

Det samme gjelder for handlingen azure/docker-login@v1. Siden du distribuerer et beholderbilde, må du logge på det private beholderregisteret.

Handlingen azure/webapps-deploy@v1 utfører distribusjonen. Det avhenger av de to foregående handlingene.

Opprette og slette Azure-ressurser ved hjelp av GitHub-handlinger

Siden CD er en automatisert prosess, har du allerede bestemt deg for å bruke infrastruktur som kode for å opprette og ta ned miljøene du distribuerer til. GitHub-handlinger kan automatisere disse oppgavene på Azure, og du kan inkludere disse handlingene i arbeidsflyten.

Notat

Husk at det er viktig å rive ned ressurser som du ikke lenger bruker så snart som mulig for å unngå unødvendige kostnader.

Ett alternativ er å opprette en ny arbeidsflyt med to jobber, en som spinner opp ressurser og ett som sletter dem. Bruk deretter en betinget for å kjøre bare jobben du vil bruke. I dette eksemplet ser det betingede ut etter en etikett i pull-forespørselen og kjører set-up-azure-resources jobb hvis etiketten sette opp miljøet og destroy-azure-resources jobben hvis etiketten ødelegge miljøet.

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')

    ...

Jobbene bruker Azure CLI til å opprette og ødelegge Azure-ressursene. Hvis du vil ha mer informasjon om Azure CLI, kan du se Oversikt over Azure CLI.

Her er et eksempel på trinnene i set-up-azure-resources jobb:

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}}

Legg merke til at du bruker GitHub-handlinger til å sjekke ut repositoriet og logge på Azure. Deretter oppretter du ressursene du trenger, og distribuerer beholderen ved hjelp av Azure CLI.