Jak przeprowadzać wdrożenia na platformie Azure za pomocą funkcji GitHub Actions?

Ukończone

W tej lekcji omówiono sposób wdrażania aplikacji internetowej opartej na kontenerze w usłudze Microsoft Azure Web Apps za pomocą funkcji GitHub Actions. Obejmuje ona niektóre opcje wyzwalania przepływu pracy. Następnie dowiedz się, jak pracować z warunkowymi w przepływie pracy. Na koniec dowiedz się, jak tworzyć i usuwać zasoby platformy Azure przy użyciu funkcji GitHub Actions.

Opcje wyzwalania przepływu pracy ciągłego dostarczania

Istnieje kilka opcji uruchamiania przepływu pracy ciągłego dostarczania. W poprzednim module dotyczącym ciągłej integracji za pomocą funkcji GitHub Actions pokazano, jak wyzwalać przepływ pracy z operacji wypychania do repozytorium GitHub. Jednak w przypadku ciągłego wdrażania możesz chcieć wyzwolić przepływ pracy wdrażania w innym zdarzeniu.

Jedną z opcji jest wyzwalanie przepływu pracy przy użyciu metodologii ChatOps. ChatOps używa klientów czatu, czatbotów i narzędzi komunikacyjnych w czasie rzeczywistym do uruchamiania zadań. Na przykład można pozostawić określony komentarz w żądaniu ściągnięcia, który może uruchamiać bota. Taki bot może dodawać komentarze zwrotne z danymi statystycznymi lub uruchamiać przepływ pracy.

Kolejną opcją (stosowaną w naszym przykładzie) jest użycie etykiet w żądaniu ściągnięcia. Różne etykiety mogą uruchamiać różne przepływy pracy. Na przykład dodaj etykietę etapu, aby rozpocząć przepływ pracy wdrażania do środowiska przejściowego. Możesz też dodać etykietę uruchamiania środowiska , aby uruchomić przepływ pracy, w którym zostaną utworzone zasoby platformy Microsoft Azure do wdrożenia. Aby użyć etykiet, przepływ pracy wygląda następująco:

on:
  pull_request:
    types: [labeled]

Sterowanie wykonywaniem za pomocą warunku zadania

Często należy uruchamiać przepływ pracy tylko po spełnieniu pewnego warunku.

Przepływy pracy usługi GitHub udostępniają warunkowe if dla tego scenariusza. Warunkowe używa wyrażenia , które jest oceniane w czasie wykonywania. Na przykład chcesz uruchomić ten przepływ pracy, jeśli do żądania ściągnięcia zostanie dodana etykieta etapu .

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

Przechowywanie poświadczeń za pomocą wpisów tajnych usługi GitHub

Nigdy nie chcesz ujawniać poufnych informacji w pliku przepływu pracy. Wpisy tajne usługi GitHub to bezpieczne miejsce do przechowywania poufnych informacji potrzebnych w przepływie pracy. Oto przykład.

Aby przeprowadzić wdrożenie w zasobie platformy Azure, akcja usługi GitHub musi mieć uprawnienia dostępu do tego zasobu. Nie należy przechowywać poświadczeń platformy Azure w postaci zwykłego tekstu w pliku przepływu pracy. Zamiast tego możesz przechowywać poświadczenia w wpisach tajnych usługi GitHub.

Aby przechowywać informacje w wpisach tajnych usługi GitHub, utwórz wpis tajny w portalu.

Azure portal interface for creating a secret.

Następnie użyj nazwy wpisu tajnego utworzonego w przepływie pracy wszędzie tam, gdzie są potrzebne te informacje. Na przykład użyj poświadczeń platformy Azure przechowywanych w wpisach tajnych usługi GitHub w atrybucie creds: akcji platformy Azure login .

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

Wdrażanie na platformie Microsoft Azure za pomocą funkcji GitHub Actions

Witryna GitHub Marketplace oferuje kilka akcji ułatwiających automatyzację zadań związanych z platformą Azure.

The GitHub Marketplace showing search results for Azure.

Możesz również wyszukiwać i przeglądać funkcje GitHub Actions bezpośrednio w edytorze przepływu pracy repozytorium. Na pasku bocznym można wyszukiwać określone funkcje Actions, wyświetlać polecane funkcje Actions i przeglądać polecane kategorie.

Aby znaleźć funkcję Actions:

  1. W repozytorium przejdź do pliku przepływu pracy, który chcesz edytować.
  2. Wybierz ikonę Edytuj w prawym górnym rogu widoku pliku.
  3. Aby przeglądać funkcje Actions, użyj paska bocznego witryny GitHub Marketplace z prawej strony edytora.

Załóżmy, że chcesz wdrożyć aplikację internetową opartą na kontenerach w usłudze Azure Web Apps. Jeśli przeszukasz witrynę GitHub Marketplace, znajdziesz następujące akcje:

Po dodaniu tych akcji do zadania Deploy-to-Azure przepływ pracy będzie wyglądać następująco:

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

Zwróć uwagę, że to zadanie jest zależne od poprzedniego zadania (Build-Docker-Image). Poprzednie zadanie tworzy artefakt, który jest wdrażany.

Akcja azure/login@v1 wymaga poświadczeń, aby zalogować się do konta platformy Azure, aby uzyskać dostęp do zasobów platformy Azure, do których chcesz wdrożyć. W tym miejscu użyj poświadczeń przechowywanych w wpisach tajnych usługi GitHub.

To samo dotyczy akcji azure/docker-login@v1 . Ponieważ wdrażasz obraz kontenera, musisz zalogować się do prywatnego rejestru kontenerów.

Akcja azure/webapps-container-deploy@v1 wykonuje wdrożenie. Zależy to od dwóch poprzednich akcji.

Tworzenie i usuwanie zasobów platformy Azure za pomocą funkcji GitHub Actions

Ponieważ ciągłe wdrażanie jest procesem zautomatyzowanym, podjęto już decyzję o użyciu infrastruktury jako kodu w celu utworzenia i zdjąć wdrożone środowiska. Funkcja GitHub Actions może zautomatyzować te zadania na platformie Azure i uwzględnić te akcje w przepływie pracy.

Uwaga

Pamiętaj, że ważne jest, aby usunąć zasoby, których nie używasz już tak szybko, jak to możliwe, aby uniknąć niepotrzebnych opłat.

Jedną z opcji jest utworzenie nowego przepływu pracy z dwoma zadaniami (zadanie uruchamiające zasoby i zadanie usuwające je). Następnie użyj warunku, aby uruchamiać tylko odpowiednie zadanie. W tym przykładzie warunek wyszukuje etykietę w żądaniu ściągnięcia i uruchamia zadanie set-up-azure-resources w przypadku etykiety spin up environment (uruchomienie środowiska) lub zadanie destroy-azure-resources w przypadku etykiety destroy environment (zniszczenie środowiska).

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

    ...

Te zadania używają interfejsu wiersza polecenia platformy Azure do tworzenia i niszczenia zasobów platformy Azure. Aby uzyskać więcej informacji na temat interfejsu wiersza polecenia platformy Azure, zobacz Omówienie interfejsu wiersza polecenia platformy Azure.

Oto przykładowe kroki w zadaniu set-up-azure-resources:

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

Zwróć uwagę, że funkcja GitHub Actions jest używana w celu wyewidencjonowania repozytorium i zalogowania się do platformy Azure. Następnie są tworzone potrzebne zasoby i jest wdrażany kontener przy użyciu interfejsu wiersza polecenia platformy Azure.