Docker: Implementeren met GitHub Actions

Leer hoe u uw Docker-containers implementeert met behulp van GitHub Actions

👋 Welkom bij de documentatie van Stackhero!

Stackhero biedt een kant-en-klare Docker cloud CaaS (Containers as a Service) oplossing die tal van voordelen biedt, waaronder:

  • Zet eenvoudig uw containers in productie met slechts een docker-compose up.
  • Aanpasbare domeinnaam beveiligd met HTTPS (bijvoorbeeld, https://api.uw-bedrijf.com, https://www.uw-bedrijf.com, https://backoffice.uw-bedrijf.com).
  • Optimale prestaties en robuuste beveiliging aangedreven door een privé en toegewijde VM.
  • Moeiteloze updates met slechts één klik.

Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Docker CaaS cloud hosting oplossing van Stackhero te proberen en uw containers in productie te zetten!

GitHub Actions stelt u in staat om taken te automatiseren, zoals het implementeren van uw Docker-containers naar productie-servers. In deze gids leert u hoe u GitHub Actions veilig en betrouwbaar kunt instellen om uw Docker-containers naar zowel staging- als productieomgevingen te implementeren.

Voor deze configuratie onderhoudt u twee branches: staging en production. Code die naar elke branch wordt gepusht, wordt automatisch geïmplementeerd naar de overeenkomstige Stackhero-instantie.

Het hebben van een staging-instantie is niet verplicht. U kunt deze gids volgen met alleen een productie-instantie. Het wordt echter sterk aanbevolen om zowel een staging- als productie-instantie te hebben om risico's te verminderen en vertrouwen op te bouwen bij het implementeren naar productie. Dit is een industriestandaard en best practice die u kan helpen veel potentiële problemen te vermijden.

Voordat u begint, zorg ervoor dat u een GitHub-account heeft met een repository die uw code host.

Begin met inloggen op uw Stackhero-dashboard en maak twee Stackhero-services aan: één voor staging en één voor productie. Om fouten te minimaliseren, kunt u deze services hernoemen naar "Staging" en "Production".

Heeft u nog geen Stackhero-account? U kunt er gratis een aanmaken in slechts twee minuten en vervolgens uw Docker-cloudservices met slechts een paar klikken maken.

Voorbeeld van Docker-servicesVoorbeeld van Docker-services

Om GitHub Actions verbinding te laten maken met uw Stackhero Docker-service, heeft u twee stukken informatie nodig: de domeinnaam van uw service en het certificaatwachtwoord.

  1. Selecteer in het Stackhero-dashboard uw "production" Docker-service en klik op de knop "Configure".

    Service-instellingen ophalenService-instellingen ophalen

  2. Kopieer de "Domeinnaam" en het "Docker-certificaatwachtwoord" voor gebruik in de volgende stappen.

    Service-instellingen ophalenService-instellingen ophalen

  1. Ga naar GitHub en selecteer uw project.

  2. Klik op Settings > Environments en vervolgens op New environment.

    GitHub-omgevingen configurerenGitHub-omgevingen configureren

  3. Voer in het veld Name "production" in en bevestig.

    De omgeving instellenDe omgeving instellen

  4. Klik op de knop No restriction en selecteer Selected branches and tags.

    Omgevingsbeperkingen instellenOmgevingsbeperkingen instellen

  5. Klik op Add deployment branch or tag rule, voer "production" in het veld Name pattern in en klik vervolgens op Add rule.

    Omgevingsbranch instellenOmgevingsbranch instellen Omgevingsbranch instellenOmgevingsbranch instellen

  6. Onder Environment secrets, klik op Add secret.

    Geheim toevoegenGeheim toevoegen

  7. Voor het geheim, voer STACKHERO_CERTIFICATES_PASSWORD in als naam en plak uw certificaatwachtwoord als Value.

    Het certificaatwachtwoordgeheim instellenHet certificaatwachtwoordgeheim instellen

  8. Onder Environment variables, klik op Add variable.

    Variabelen instellenVariabelen instellen

  9. Voer STACKHERO_ENDPOINT in als naam en plak uw Docker-service endpoint in de Value. U kunt dit endpoint vinden in uw Stackhero-dashboard.

    Het endpointvariabele instellenHet endpointvariabele instellen

Als u de domeinnaam van uw service hebt aangepast, gebruik dan de aangepaste versie in plaats van xxxxxx.stackhero-network.com.

Als het docker-compose.yml bestand aanwezig is in de root van uw project en er geen aanpassingen nodig zijn, kunt u deze sectie overslaan.

Standaard verwacht GitHub Actions dat het Docker Compose-bestand docker-compose.yml zich in de root van uw project bevindt. Als u een ander bestand moet gebruiken, kunt u de implementatieopdracht aanpassen. Bijvoorbeeld, als u onze Getting started with Node.js and Docker boilerplate gebruikt, kunt u een nieuwe omgevingsvariabele genaamd STACKHERO_DEPLOY_COMMAND maken en deze instellen op:

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

Navigeer op uw lokale machine naar uw Git-repository en maak een directory genaamd .github/workflows. Maak in deze directory een bestand genaamd deploy-to-stackhero.yml met de volgende inhoud:

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

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

on:
  push:
    # Deze branches activeren de implementatieactie bij een push.
    # Zorg ervoor dat u een omgeving maakt die overeenkomt met de branchnaam in GitHub (onder Settings > Environments).
    # Voeg vervolgens het geheim STACKHERO_CERTIFICATES_PASSWORD en de variabele STACKHERO_ENDPOINT toe in die omgeving.
    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:
        # Het geheim STACKHERO_CERTIFICATES_PASSWORD en de variabele STACKHERO_ENDPOINT moeten worden gedefinieerd in de overeenkomstige branchomgeving op GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command is optioneel. Gebruik het als u de Docker Compose-opdracht moet aanpassen.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Commit uw wijzigingen door het volgende uit te voeren:

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

Maak vervolgens een productiebranch door het volgende uit te voeren:

git checkout -b production

Duw ten slotte uw productiebranch naar GitHub:

git push --set-upstream origin production

Zodra deze is gepusht, zal GitHub Actions automatisch uw code implementeren naar uw productie Stackhero-instantie. U kunt de implementatie volgen door het Actions tabblad in uw GitHub-project te bezoeken.

GitHub Actions die naar productie heeft geïmplementeerdGitHub Actions die naar productie heeft geïmplementeerd

Gefeliciteerd! U kunt nu uw code automatisch naar productie implementeren met behulp van GitHub Actions.

Het instellen van de staging-omgeving is vergelijkbaar met de productie-instelling. Herhaal eenvoudig de bovenstaande stappen, waarbij u production vervangt door staging.

Maak vervolgens een staging-branch door het volgende uit te voeren:

git checkout -b staging

Duw uw staging-branch naar GitHub met:

git push --set-upstream origin staging

GitHub Actions zal automatisch uw staging-branch implementeren naar de aangewezen Docker-instantie voor staging.

U kunt omgevingsvariabelen definiëren in uw GitHub-project die toegankelijk zullen zijn binnen uw docker-compose.yml bestand. Dit is handig als u naar verschillende domeinen wilt implementeren (bijvoorbeeld staging.my-company.com voor staging en my-company.com voor productie).

  1. Ga op GitHub naar Settings > Environments en maak een omgevingsvariabele genaamd WEBSITE_DOMAIN.
  2. Voor de staging-omgeving, stel WEBSITE_DOMAIN in op "staging.my-company.com".
  3. Voor de productieomgeving, stel WEBSITE_DOMAIN in op "my-company.com".

Werk vervolgens het .github/workflows/deploy-to-stackhero.yml bestand bij om de WEBSITE_DOMAIN variabele door te geven aan de Stackhero GitHub Action:

name: Deploy to Stackhero
description: Implementeer branch "${{ github.ref_name }}" naar 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 }}

Werk ten slotte uw docker-compose.yml bestand bij om de WEBSITE_DOMAIN variabele te gebruiken in plaats van een hard-coded domeinnaam:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Gebruikt de WEBSITE_DOMAIN omgevingsvariabele als de domeinnaam.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Het is een goede gewoonte om de production en staging branches te beschermen om directe pushes te voorkomen. Met branchbescherming ingeschakeld, moet er een pull request worden gemaakt voor de staging branch en vervolgens worden samengevoegd door iemand met de nodige rechten. Zodra gevalideerd op het staging-platform, kan hetzelfde proces worden gevolgd voor de production branch.

Deze aanpak helpt zowel de veiligheid (alleen geautoriseerde teamleden kunnen naar staging en productie implementeren) als de betrouwbaarheid (functies worden getest op een staging-platform voordat ze naar productie worden geïmplementeerd) te waarborgen.