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 dowiesz się, jak pracować z warunkami w procesie pracy. Na koniec dowiesz 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 w środowisku przejściowym, lub dodaj etykietę uruchomienie środowiska, aby uruchomić przepływ pracy tworzący zasoby Microsoft Azure, które można wdrożyć. 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 chcesz uruchomić przepływ pracy tylko wtedy, gdy określony warunek jest spełniony.

Przepływy pracy usługi GitHub udostępniają warunkowe if dla tego scenariusza. Warunkowe używa wyrażenia ocenianego 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.

Zrzut ekranu przedstawiający interfejs portalu GitHub do tworzenia sekretu.

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.

zrzut ekranu witryny GitHub Marketplace przedstawiający wyniki wyszukiwania dla platformy 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-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-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 (CD) jest procesem zautomatyzowanym, już zdecydowałeś użyć infrastruktury jako kodu, aby utworzyć i zlikwidować środowiska, do których wdrażasz. 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.