Docker: Wdrażanie za pomocą GitHub Actions

Dowiedz się, jak wdrażać kontenery Docker przy użyciu GitHub Actions

👋 Witamy w dokumentacji Stackhero!

Stackhero oferuje gotowe do użycia rozwiązanie Docker cloud CaaS (Containers as a Service), które zapewnia wiele korzyści, w tym:

  • Łatwe wdrażanie kontenerów do produkcji za pomocą prostego docker-compose up.
  • Dostosowywana nazwa domeny zabezpieczona HTTPS (na przykład, https://api.twoja-firma.com, https://www.twoja-firma.com, https://backoffice.twoja-firma.com).
  • Optymalna wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.
  • Bezproblemowe aktualizacje za pomocą jednego kliknięcia.

Oszczędzaj czas i upraszczaj swoje życie: wystarczy 5 minut, aby wypróbować rozwiązanie Docker CaaS cloud hosting Stackhero i wdrożyć swoje kontenery do produkcji!

GitHub Actions umożliwia łatwą automatyzację zadań, takich jak wdrażanie kontenerów Docker na serwerach produkcyjnych. W tym przewodniku dowiesz się, jak bezpiecznie i niezawodnie skonfigurować GitHub Actions do wdrażania kontenerów Docker zarówno na środowiskach staging, jak i produkcyjnych.

W tej konfiguracji będziesz utrzymywać dwie gałęzie: staging oraz production. Za każdym razem, gdy wypchniesz kod do jednej z tych gałęzi, zostanie on automatycznie wdrożony na odpowiedniej instancji Stackhero.

Posiadanie instancji staging nie jest obowiązkowe. Możesz postępować zgodnie z tym przewodnikiem, korzystając wyłącznie z instancji produkcyjnej. Jednak aby zminimalizować ryzyko i mieć pewność podczas wdrażania na produkcję, zdecydowanie zaleca się posiadanie zarówno instancji staging, jak i produkcyjnej. Jest to standard branżowy i dobra praktyka, która pozwala uniknąć wielu potencjalnych problemów.

Przed rozpoczęciem upewnij się, że masz konto GitHub oraz repozytorium z Twoim kodem.

Zaloguj się do swojego panelu Stackhero i utwórz dwie usługi Stackhero: jedną dla staging, drugą dla produkcji. Aby zachować porządek i zminimalizować ryzyko pomyłek, możesz zmienić nazwy tych usług na "Staging" i "Production".

Nie masz jeszcze konta Stackhero? Możesz założyć je za darmo w ciągu dwóch minut, a następnie skonfigurować swoje usługi Docker w chmurze za pomocą kilku kliknięć.

Przykład usług DockerPrzykład usług Docker

Aby GitHub Actions mogło połączyć się z Twoją usługą Docker na Stackhero, będziesz potrzebować dwóch informacji: nazwy domeny Twojej usługi oraz hasła do certyfikatów.

  1. W panelu Stackhero wybierz swoją usługę Docker "production" i kliknij przycisk "Configure".

    Pobierz ustawienia usługiPobierz ustawienia usługi

  2. Skopiuj zarówno "Domain name", jak i "Docker certificates password" – będą potrzebne w kolejnych krokach.

    Pobierz ustawienia usługiPobierz ustawienia usługi

  1. W GitHub otwórz swój projekt.

  2. Przejdź do Settings > Environments, a następnie kliknij New environment.

    Konfiguracja środowisk GitHubKonfiguracja środowisk GitHub

  3. W polu Name wpisz "production" i zatwierdź.

    Ustawianie środowiskaUstawianie środowiska

  4. Kliknij przycisk No restriction i wybierz Selected branches and tags.

    Ustawianie ograniczeń środowiskaUstawianie ograniczeń środowiska

  5. Kliknij Add deployment branch or tag rule, wpisz "production" w polu Name pattern i kliknij Add rule.

    Ustawianie gałęzi środowiskaUstawianie gałęzi środowiska Ustawianie gałęzi środowiskaUstawianie gałęzi środowiska

  6. W sekcji Environment secrets kliknij Add secret.

    Dodawanie sekretuDodawanie sekretu

  7. Jako nazwę sekretu użyj STACKHERO_CERTIFICATES_PASSWORD i wklej swoje hasło do certyfikatów w pole Value.

    Ustawianie sekretu z hasłem do certyfikatówUstawianie sekretu z hasłem do certyfikatów

  8. W sekcji Environment variables kliknij Add variable.

    Ustawianie zmiennychUstawianie zmiennych

  9. Jako nazwę użyj STACKHERO_ENDPOINT i wklej endpoint swojej usługi Docker w pole Value. Endpoint znajdziesz w panelu Stackhero.

    Ustawianie zmiennej endpointUstawianie zmiennej endpoint

Jeśli spersonalizowałeś nazwę domeny swojej usługi, pamiętaj, aby użyć własnej domeny zamiast <XXXXXX>.stackhero-network.com.

Jeśli plik docker-compose.yml znajduje się już w katalogu głównym projektu i nie wymaga modyfikacji, możesz pominąć tę sekcję.

Domyślnie GitHub Actions szuka pliku docker-compose.yml w katalogu głównym projektu. Jeśli chcesz użyć innego pliku lub konfiguracji, możesz dostosować polecenie wdrożenia. Na przykład, jeśli korzystasz z naszego boilerplate Node.js i Docker na start, możesz utworzyć nową zmienną środowiskową o nazwie STACKHERO_DEPLOY_COMMAND i ustawić ją na:

docker compose --env-file env.list --file docker/docker-compose.yml --file docker/docker-compose.production.yml up --build --remove-orphans -d

Na swoim komputerze przejdź do katalogu repozytorium Git i utwórz katalog .github/workflows. W tym katalogu utwórz plik o nazwie deploy-to-stackhero.yml z następującą zawartością:

# File: .github/workflows/deploy-to-stackhero.yml

name: Deploy to Stackhero
description: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    # These branches trigger the deploy action on push.
    # Be sure to create an environment matching the branch name in GitHub (under Settings > Environments).
    # Then add the secret STACKHERO_CERTIFICATES_PASSWORD and variable STACKHERO_ENDPOINT in that environment.
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
      with:
        # The secret STACKHERO_CERTIFICATES_PASSWORD and the variable STACKHERO_ENDPOINT should be defined in the corresponding branch environment on GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command is optional. You can use it if you need to customize the Docker Compose command.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Zatwierdź zmiany poleceniem:

git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"

Aby utworzyć gałąź produkcyjną, wykonaj:

git checkout -b production

Następnie wypchnij gałąź produkcyjną do GitHub:

git push --set-upstream origin production

Po wypchnięciu kodu GitHub Actions automatycznie wdroży go na Twojej instancji Stackhero dla produkcji. Postęp wdrożenia możesz śledzić w zakładce Actions w swoim projekcie GitHub.

GitHub Actions, które wdrożyły na produkcjęGitHub Actions, które wdrożyły na produkcję

To wszystko. Twoja konfiguracja jest gotowa do automatycznego wdrażania kodu na produkcję za pomocą GitHub Actions.

Konfiguracja środowiska staging przebiega analogicznie jak dla produkcji. Wystarczy powtórzyć proces, używając staging zamiast production.

Następnie utwórz gałąź staging poleceniem:

git checkout -b staging

I wypchnij gałąź staging do GitHub:

git push --set-upstream origin staging

Po tym GitHub Actions automatycznie wdroży Twoją gałąź staging na wyznaczonej instancji Docker dla staging.

Możesz zdefiniować zmienne środowiskowe w swoim projekcie GitHub, które będą dostępne w pliku docker-compose.yml. Jest to bardzo przydatne, jeśli chcesz wdrażać na różnych domenach (np. staging.my-company.com dla staging i my-company.com dla produkcji).

  1. W GitHub przejdź do Settings > Environments i utwórz zmienną środowiskową o nazwie WEBSITE_DOMAIN.
  2. Dla środowiska staging ustaw WEBSITE_DOMAIN na "staging.my-company.com".
  3. Dla środowiska produkcyjnego ustaw WEBSITE_DOMAIN na "my-company.com".

Następnie zaktualizuj plik .github/workflows/deploy-to-stackhero.yml, aby przekazać zmienną WEBSITE_DOMAIN do akcji Stackhero GitHub Action:

name: Deploy to Stackhero
description: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
      with:
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}
      env:
        WEBSITE_DOMAIN: ${{ vars.WEBSITE_DOMAIN }}

Teraz zaktualizuj plik docker-compose.yml, aby używał zmiennej WEBSITE_DOMAIN zamiast wpisanej na stałe nazwy domeny:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Używa zmiennej środowiskowej WEBSITE_DOMAIN jako nazwy domeny.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Warto zabezpieczyć gałęzie production i staging, aby uniemożliwić bezpośrednie wypchnięcia. Po włączeniu ochrony gałęzi zmiany są wprowadzane poprzez pull requesty, które muszą zostać zrecenzowane i scalone przez osobę z odpowiednimi uprawnieniami. Oznacza to, że nowe funkcje są najpierw weryfikowane na platformie staging, a następnie promowane na produkcję dopiero po zatwierdzeniu.

Stosując taki workflow, zapewniasz zarówno bezpieczeństwo (tylko upoważnieni członkowie zespołu mogą wdrażać na staging i produkcję), jak i niezawodność (testowanie nowych funkcji na platformie staging przed wdrożeniem na produkcję).