Docker: Diegimas naudojant GitHub Actions

Sužinokite, kaip diegti savo Docker konteinerius naudojant GitHub Actions

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Docker cloud CaaS (Containers as a Service) sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Lengvai diekite savo konteinerius į gamybą su paprastu docker-compose up.
  • Pritaikomas domeno vardas su HTTPS apsauga (pavyzdžiui, https://api.jusu-imone.com, https://www.jusu-imone.com, https://backoffice.jusu-imone.com).
  • Optimali veikla ir tvirta apsauga naudojant privačią ir dedikuotą VM.
  • Paprasti atnaujinimai vienu paspaudimu.

Taupykite laiką ir supaprastinkite savo gyvenimą: tereikia 5 minučių išbandyti Stackhero Docker CaaS cloud hosting sprendimą ir diegti savo konteinerius į gamybą!

GitHub Actions leidžia lengvai automatizuoti užduotis, tokias kaip Docker konteinerių diegimas į gamybinius serverius. Šiame vadove sužinosite, kaip saugiai ir patikimai sukonfigūruoti GitHub Actions, kad galėtumėte diegti Docker konteinerius tiek į „staging“, tiek į „production“ aplinkas.

Šiai konfigūracijai palaikysite dvi šakas: staging ir production. Kiekvieną kartą, kai įkelsite kodą į vieną iš šių šakų, jis bus automatiškai įdiegtas į atitinkamą Stackhero instanciją.

Turėti „staging“ instanciją nėra privaloma. Šį vadovą galite naudoti ir tik su „production“ instancija. Tačiau, norint sumažinti riziką ir užtikrintai diegti į gamybą, labai rekomenduojama turėti tiek „staging“, tiek „production“ instancijas. Tai yra pramonės standartas ir geriausia praktika, padedanti išvengti daugelio galimų problemų.

Prieš pradėdami, įsitikinkite, kad turite GitHub paskyrą ir repozitoriją, kurioje laikomas jūsų kodas.

Prisijunkite prie savo Stackhero valdymo skydelio ir sukurkite dvi Stackhero paslaugas: vieną „staging“, kitą – „production“. Kad būtų lengviau tvarkytis ir sumažintumėte klaidų tikimybę, rekomenduojame šias paslaugas pervadinti į „Staging“ ir „Production“.

Dar neturite Stackhero paskyros? Ją galite susikurti nemokamai vos per dvi minutes ir tada vos keliais paspaudimais paleisti savo Docker cloud paslaugas.

Docker paslaugų pavyzdysDocker paslaugų pavyzdys

Kad GitHub Actions galėtų prisijungti prie jūsų Stackhero Docker paslaugos, jums reikės dviejų duomenų: paslaugos domeno vardo ir sertifikatų slaptažodžio.

  1. Stackhero valdymo skydelyje pasirinkite savo „production“ Docker paslaugą ir spustelėkite mygtuką „Configure“.

    Paslaugos nustatymų gavimasPaslaugos nustatymų gavimas

  2. Nukopijuokite tiek „Domain name“, tiek „Docker certificates password“ – jų prireiks kituose žingsniuose.

    Paslaugos nustatymų gavimasPaslaugos nustatymų gavimas

  1. GitHub atidarykite savo projektą.

  2. Eikite į Settings > Environments ir spustelėkite New environment.

    GitHub aplinkų konfigūravimasGitHub aplinkų konfigūravimas

  3. Laukelyje Name įrašykite „production“ ir patvirtinkite.

    Aplinkos nustatymasAplinkos nustatymas

  4. Spustelėkite No restriction ir pasirinkite Selected branches and tags.

    Aplinkos apribojimų nustatymasAplinkos apribojimų nustatymas

  5. Spustelėkite Add deployment branch or tag rule, laukelyje Name pattern įrašykite „production“ ir spustelėkite Add rule.

    Aplinkos šakos nustatymasAplinkos šakos nustatymas Aplinkos šakos nustatymasAplinkos šakos nustatymas

  6. Skiltyje Environment secrets spustelėkite Add secret.

    Slapto duomens pridėjimasSlapto duomens pridėjimas

  7. Slaptam duomeniui naudokite STACKHERO_CERTIFICATES_PASSWORD kaip pavadinimą ir įklijuokite savo sertifikatų slaptažodį į lauką Value.

    Sertifikatų slaptažodžio slaptos reikšmės nustatymasSertifikatų slaptažodžio slaptos reikšmės nustatymas

  8. Skiltyje Environment variables spustelėkite Add variable.

    Kintamųjų nustatymasKintamųjų nustatymas

  9. Naudokite STACKHERO_ENDPOINT kaip pavadinimą ir įklijuokite savo Docker paslaugos endpoint'ą į lauką Value. Endpoint'ą rasite Stackhero valdymo skydelyje.

    Endpoint kintamojo nustatymasEndpoint kintamojo nustatymas

Jei esate pritaikę savo paslaugos domeno vardą, būtinai naudokite savo pasirinktą domeną vietoje <XXXXXX>.stackhero-network.com.

Jei docker-compose.yml failas jau yra jūsų projekto šaknyje ir nereikia jokių pakeitimų, šį skyrių galite praleisti.

Pagal nutylėjimą GitHub Actions ieško docker-compose.yml failo projekto šaknyje. Jei reikia naudoti kitą failą ar konfigūraciją, galite pakeisti diegimo komandą. Pavyzdžiui, jei naudojate mūsų Node.js ir Docker startinį boilerplate, galite sukurti naują aplinkos kintamąjį STACKHERO_DEPLOY_COMMAND ir nustatyti jį taip:

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

Savo kompiuteryje eikite į Git repozitoriją ir sukurkite katalogą .github/workflows. Jame sukurkite failą deploy-to-stackhero.yml su šiuo turiniu:

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

Savo pakeitimus galite įkelti su:

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

Norėdami sukurti „production“ šaką, vykdykite:

git checkout -b production

Tada įkelkite savo „production“ šaką į GitHub:

git push --set-upstream origin production

Kai tik jūsų kodas bus įkeltas, GitHub Actions automatiškai jį įdiegs į jūsų Stackhero „production“ instanciją. Diegimo eigą galite stebėti savo GitHub projekto Actions skiltyje.

GitHub Actions, įdiegęs į productionGitHub Actions, įdiegęs į production

Viskas. Dabar jūsų sistema paruošta automatiniam kodo diegimui į gamybą naudojant GitHub Actions.

Staging aplinkos paruošimas vyksta taip pat, kaip ir production – tiesiog pakartokite procesą, naudodami staging vietoje production.

Tada sukurkite „staging“ šaką vykdydami:

git checkout -b staging

Ir įkelkite savo „staging“ šaką į GitHub:

git push --set-upstream origin staging

Po šio žingsnio GitHub Actions automatiškai įdiegs jūsų „staging“ šaką į tam skirtą Docker instanciją.

GitHub projekte galite apibrėžti aplinkos kintamuosius, kurie bus pasiekiami jūsų docker-compose.yml faile. Tai labai naudinga, jei norite diegti į skirtingus domenus (pvz., staging.my-company.com „staging“ aplinkai ir my-company.com „production“ aplinkai).

  1. GitHub eikite į Settings > Environments ir sukurkite aplinkos kintamąjį pavadinimu WEBSITE_DOMAIN.
  2. „Staging“ aplinkai nustatykite WEBSITE_DOMAIN reikšmę į „staging.my-company.com“.
  3. „Production“ aplinkai nustatykite WEBSITE_DOMAIN reikšmę į „my-company.com“.

Tada atnaujinkite savo .github/workflows/deploy-to-stackhero.yml failą, kad perduotumėte WEBSITE_DOMAIN kintamąjį 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 }}

Dabar atnaujinkite savo docker-compose.yml failą, kad naudotumėte WEBSITE_DOMAIN kintamąjį vietoje fiksuoto domeno vardo:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Naudoja aplinkos kintamąjį WEBSITE_DOMAIN kaip domeno vardą.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Rekomenduojama apsaugoti production ir staging šakas, kad būtų išvengta tiesioginių pakeitimų (push). Įjungus šakų apsaugą, pakeitimai atliekami tik per pull request'us, kuriuos turi peržiūrėti ir patvirtinti asmuo su tinkamomis teisėmis. Tai leidžia funkcionalumą pirmiausia patikrinti „staging“ platformoje, o tik po patvirtinimo perkelti į gamybą.

Laikydamiesi šio darbo eigos, užtikrinate tiek saugumą (tik įgalioti komandos nariai gali diegti į „staging“ ir „production“ aplinkas), tiek patikimumą (naujos funkcijos išbandomos „staging“ platformoje prieš diegiant į gamybą).