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.
Tworzenie usług Docker
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 Docker
Konfiguracja zmiennych środowiskowych i sekretów
Pobierz nazwę domeny i hasło do certyfikatów
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.
-
W panelu Stackhero wybierz swoją usługę Docker "production" i kliknij przycisk "Configure".
Pobierz ustawienia usługi -
Skopiuj zarówno "Domain name", jak i "Docker certificates password" – będą potrzebne w kolejnych krokach.
Pobierz ustawienia usługi
Ustaw nazwę domeny i hasło do certyfikatów w GitHub
-
W GitHub otwórz swój projekt.
-
Przejdź do Settings > Environments, a następnie kliknij New environment.
Konfiguracja środowisk GitHub -
W polu Name wpisz "production" i zatwierdź.
Ustawianie środowiska -
Kliknij przycisk No restriction i wybierz Selected branches and tags.
Ustawianie ograniczeń środowiska -
Kliknij Add deployment branch or tag rule, wpisz "production" w polu Name pattern i kliknij Add rule.
Ustawianie gałęzi środowiska
Ustawianie gałęzi środowiska -
W sekcji Environment secrets kliknij Add secret.
Dodawanie sekretu -
Jako nazwę sekretu użyj
STACKHERO_CERTIFICATES_PASSWORDi wklej swoje hasło do certyfikatów w pole Value.
Ustawianie sekretu z hasłem do certyfikatów -
W sekcji Environment variables kliknij Add variable.
Ustawianie zmiennych -
Jako nazwę użyj
STACKHERO_ENDPOINTi wklej endpoint swojej usługi Docker w pole Value. Endpoint znajdziesz w panelu Stackhero.
Ustawianie zmiennej endpoint
Jeśli spersonalizowałeś nazwę domeny swojej usługi, pamiętaj, aby użyć własnej domeny zamiast <XXXXXX>.stackhero-network.com.
Dostosowanie pliku konfiguracyjnego Docker Compose
Jeśli plik
docker-compose.ymlznajduje 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
Konfiguracja workflow GitHub Actions
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ę
To wszystko. Twoja konfiguracja jest gotowa do automatycznego wdrażania kodu na produkcję za pomocą GitHub Actions.
Tworzenie środowiska staging
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.
Używanie zmiennych środowiskowych w docker-compose.yml
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).
- W GitHub przejdź do Settings > Environments i utwórz zmienną środowiskową o nazwie
WEBSITE_DOMAIN. - Dla środowiska staging ustaw
WEBSITE_DOMAINna "staging.my-company.com". - Dla środowiska produkcyjnego ustaw
WEBSITE_DOMAINna "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"
Dalsze kroki
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ę).