GitLab Runner: Docker atvaizdų kūrimas

Efektyviai kurkite ir įkelkite Docker atvaizdus iš savo GitLab CI/CD procesų naudodami Stackhero runner'ius ir Docker-in-Docker

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo lengvai naudojamą GitLab Runner cloud sprendimą, sukurtą efektyviam jūsų GitLab CI/CD užduočių vykdymui. Štai ko galite tikėtis:

  • Neribotos CI/CD minutės: nėra apmokestinimo už kiekvieną minutę, todėl jūsų pipelines gali būti vykdomi bet kada, kai tik reikia.
  • Kelios vienu metu vykdomos užduotys: paleiskite kelis darbus vienu metu, kad pagreitintumėte visą pipeline procesą.
  • Docker executor su Docker-in-Docker palaikymu: supaprastinkite konteinerių atvaizdų kūrimą ir jų įkėlimą (push).
  • Suderinama su GitLab.com ir bet kuria self-managed GitLab instancija.
  • Privati, dedikuota VM, veikianti su greitais NVMe/SSD diskais, užtikrinančiais nuoseklius ir patikimus build'us.
  • Pasiekiama tiek 🇪🇺 Europoje, tiek 🇺🇸 JAV regionuose.

Taupykite laiką: galite prijungti savo pirmąjį GitLab Runner ir pradėti vykdyti pipelines vos per kelias minutes!

Naudojant Stackhero GitLab Runner, kiekviena užduotis vykdoma izoliuotame konteineryje su Docker executor. Galite kurti savo Docker atvaizdus tiesiogiai pipeline'e įjungę Docker-in-Docker (DinD). Tokia konfigūracija paleidžia Docker daemon'ą kartu su jūsų užduotimi, todėl CI/CD procese galite naudoti docker build ir docker push komandas.

Kiekvienas paleidimas turi neribotą CI/CD minučių kiekį: galite atlikti tiek build'ų, kiek reikia, nesirūpindami limitais. Jūsų build cache saugomas runner'iui dedikuotame diske, todėl pakartotiniai build'ai gali naudoti ankstesnius sluoksnius. Tai žymiai sumažina build laiką ir pagreitina pipeline'ų vykdymą.

Į savo repozitoriją galite pridėti šį .gitlab-ci.yml pavyzdį. Ši konfigūracija build'ina šakniniame projekto kataloge esantį Dockerfile:

build-image:
  stage: build
  image: docker:29
  services:
    - docker:29-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker info
  script:
    # Pakeiskite "my-image" norimu pavadinimu:
    - docker build -t my-image .
    # Papildomai, galite greitai patikrinti sukurtą atvaizdą:
    # - docker run --rm my-image /path/to/tests

Šiame pavyzdyje naudojame Docker atvaizdo 29 versiją. Galite rinktis naujesnę versiją, jei ji prieinama. Naujausius tag'us rasite oficialiame Docker atvaizdų puslapyje.

Šioje konfigūracijoje docker:29-dind servisas paleidžia Docker daemon'ą. Kintamasis DOCKER_TLS_CERTDIR: "/certs" užtikrina saugų TLS ryšį tarp jūsų užduoties ir Docker daemon'o.

GitLab pateikia iš anksto apibrėžtus kintamuosius (CI_REGISTRY, CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, CI_REGISTRY_IMAGE), kad pipeline galėtų autentifikuotis ir saugiai įkelti atvaizdus į jūsų projekto container registry. Papildomų slaptų duomenų nereikia.

Štai pavyzdinė užduotis, kuri build'ina ir įkelia jūsų atvaizdą:

build-and-push:
  stage: build
  image: docker:29
  services:
    - docker:29-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  script:
    - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
    # Jei esate numatytoje šakoje, galite taip pat pažymėti ir įkelti "latest":
    - |
      if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]; then
        docker tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" "$CI_REGISTRY_IMAGE:latest"
        docker push "$CI_REGISTRY_IMAGE:latest"
      fi

Norėdami įkelti atvaizdus į kitą registry (pvz., Docker Hub ar privatų registry), galite saugoti prisijungimo duomenis kaip CI/CD kintamuosius ir naudoti juos su docker login tokiu pačiu principu.

Runner'io diskas išlieka tarp pipeline'ų, todėl galite naudoti atvaizdų sluoksnius kaip build cache. Tai leidžia pakartotinius build'us atlikti daug greičiau. Štai pavyzdinė konfigūracija:

build-cached:
  stage: build
  image: docker:29
  services:
    - docker:29-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  script:
    # Atsisiųskite naujausią atvaizdą cache'ui (jei yra):
    - docker pull "$CI_REGISTRY_IMAGE:latest" || true
    - docker build --cache-from "$CI_REGISTRY_IMAGE:latest" -t "$CI_REGISTRY_IMAGE:latest" .
    - docker push "$CI_REGISTRY_IMAGE:latest"

Šis metodas leidžia build'ams naudoti Docker sluoksnių cache, todėl bus perbuildinami tik nauji ar pakeisti sluoksniai.

Jūsų planas nurodo, kiek užduočių gali būti vykdoma vienu metu. Tos pačios stadijos užduotys startuoja kartu, iki jūsų nustatyto lygiagretumo limito. Tai reiškia, kad kelios nepriklausomos užduotys gali būti vykdomos lygiagrečiai ir baigsis, kai lėčiausia užduotis bus įvykdyta, nereikia laukti, kol kiekviena užduotis baigsis paeiliui.

Pavyzdys:

stages:
  - test

unit:
  stage: test
  image: node:22
  script: npm run test:unit

integration:
  stage: test
  image: node:22
  script: npm run test:integration

e2e:
  stage: test
  image: node:22
  script: npm run test:e2e

Jei nustatysite concurrency reikšmę 1 ar didesnę, unit, integration ir e2e užduotys bus vykdomos vienu metu.

Daugiau informacijos apie Docker atvaizdų kūrimą GitLab CI/CD pipeline'uose rasite oficialioje GitLab dokumentacijoje apie Docker build'us.