Sobes.tech
Senior

Hogyan szervezzük meg három csapat számára a teljes CI/CD ciklust?

sobes.tech MI

Válasz az MI-től

A három csapat teljes CI/CD ciklusának szervezéséhez az alábbi megközelítéseket és eszközöket lehet alkalmazni:

  1. Egységes CI/CD platform: Egy központosított platform, mint például Jenkins, GitLab CI/CD, GitHub Actions, Azure DevOps vagy CircleCI használata. Ez lehetővé teszi a folyamatok szabványosítását, átláthatóságát és az összes pipeline kezelését egy helyről.

  2. Monorepo vagy Polirepo:

    • Monorepo: Minden csapat egy repositoryban dolgozik. Ez bonyolultabb branch és trigger beállítást igényel, hogy a pipeline-ok csak a megfelelő kódváltozások esetén fussanak. Egyszerűsíti az függőségek kezelését és a verziózást.
    • Polirepo: Minden csapat saját repositoryval rendelkezik. Ez izolációt könnyít, de nehezíti a csapatok közötti függőségek kezelését és a folyamatok szabványosítását.
  3. Folyamatok szabványosítása:

    • Egységes pipeline formátum: Deklaratív pipeline-ok (Jenkinsfile, .gitlab-ci.yml, .github/workflows/*.yml) használata a CI/CD lépések kódba írásához.
    • Közös könyvtárak/minták: Újrahasznosítható lépések vagy sablonok létrehozása közös feladatokra (építés, tesztelés, telepítés), a duplikáció csökkentése és az egységesség biztosítása érdekében.
    • Verziókezelő rendszer (VCS): Egy egységes VCS (pl. Git) használata, világos branch politikákkal (Gitflow, Trunk-based development).
  4. CI/CD pipeline:

    • CI (Folyamatos integráció):
      • Trigger a fejlesztési ágra (pl. develop vagy feature branch) történő push esetén.
      • Forráskód letöltése.
      • Az alkalmazás buildelése (fordítás, csomagolás).
      • Automatizált tesztek futtatása (egység-, integrációs tesztek).
      • Kód elemzése (statikus elemzés, szabványellenőrzés).
      • Artefakt létrehozása (Docker kép, JAR, WAR stb.) és feltöltése artefakt tárhelyre (Nexus, Artifactory, Docker Registry).
      • Sikeres vagy sikertelen eredmény értesítése.
    • CD (Folyamatos szállítás/telepítés):
      • Trigger a sikeres CI befejezése után és/vagy a fő ágba történő merge esetén.
      • Artefakt letöltése a tárhelyről.
      • Telepítés tesztkörnyezetbe (dev/staging).
      • Mélyebb tesztek (funkcionális, smoke, teljesítmény).
      • Continuous Delivery esetén: kézi jóváhagyás és szünet a produkciós telepítés előtt.
      • Continuous Deployment esetén: automatikus telepítés a produkcióba sikeres tesztek után.
      • Konfigurációkezelő és telepítő eszközök (Ansible, Chef, Puppet) vagy orkestráció (Kubernetes Helm/Argo CD/Flux) használata.
      • Az alkalmazás állapotának ellenőrzése a telepítés után.
      • Rollback problémák esetén.
  5. Eszközök:

    • VCS: Git (GitHub, GitLab, Bitbucket).
    • CI/CD platformok: Jenkins, GitLab CI/CD, GitHub Actions, Azure DevOps, CircleCI.
    • Build eszközök: Maven, Gradle, npm, yarn, pip, Go Modules, Docker build.
    • Teszt keretrendszerek: JUnit, TestNG, Pytest, Mocha, Jest.
    • Statikus elemzés: SonarQube, Linters (ESLint, Pylint).
    • Artefakt tárhely: Nexus, Artifactory, Docker Registry.
    • Konfiguráció kezelés: Ansible, Chef, Puppet.
    • Konténerizáció: Docker.
    • Orkesztráció: Kubernetes, Docker Swarm.
    • Telepítési stratégiák: Blue/Green, Canary, Rolling Update.
    • Monitorozás és naplózás: Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana).
    • Értesítés: Slack, Email, Microsoft Teams.
  6. Felelősségek és hozzáférés szétválasztása:

    • Szerepkörök és jogosultságok pontos meghatározása az eszközökön és környezeteken minden csapat számára.
    • Titkos adatok és környezeti változók használata a biztonságos jelszavak tárolására.
  7. Visszacsatolás:

    • Pipeline-ok integrálása értesítési rendszerekkel és monitorozó eszközökkel, hogy a csapatok gyorsan értesüljenek a problémákról.

Példa egy csapat pipeline szerkezetére (GitLab CI/CD):

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  TEST_IMAGE: $CI_REGISTRY_IMAGE/testrunner:$CI_COMMIT_SHORT_SHA

build_job:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    # Alkalmazás buildelése (pl. Java Maven-nel)
    # ./mvnw clean package -DskipTests
    # Docker kép építése
    docker build -t $DOCKER_IMAGE .
    # Bejelentkezés a GitLab Container Registry-be
    docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    # Docker kép feltöltése
    docker push $DOCKER_IMAGE
  artifacts:
    paths:
      - target/*.jar # vagy más artefaktok

test_job:
  stage: test
  image: $DOCKER_IMAGE # Az épített kép vagy külön teszt kép
  script:
    # Egység- és integrációs tesztek futtatása
    # Java esetén:
    # java -jar target/my-app.jar --run-tests
    # Node.js esetén:
    # npm test
    echo "Tesztelés..."
    sleep 10 # Példa
  needs:
    - build_job

deploy_staging_job:
  stage: deploy
  image: alpine/curl # vagy eszközökkel ellátott kép a telepítéshez
  script:
    # Telepítés staging környezetbe
    # API hívás vagy kubectl parancs
    echo "$DOCKER_IMAGE telepítése staging-be..."
    # kubectl apply -f k8s/staging.yaml --namespace <csapat-nevep>
    sleep 10 # Példa
  environment:
    name: staging
    url: https://staging.your-app.com
  only:
    - main # Trigger merge esetén

deploy_production_job:
  stage: deploy
  image: alpine/curl # vagy eszközökkel ellátott kép a telepítéshez
  script:
    # Telepítés produkcióba
    echo "$DOCKER_IMAGE telepítése production-ba..."
    # kubectl apply -f k8s/production.yaml --namespace <csapat-nevep>
    sleep 10 # Példa
  environment:
    name: production
    url: https://your-app.com
  when: manual # Kézi jóváhagyás a produkcióhoz
  only:
    - main
  needs:
    - deploy_staging_job

Ez a három csapat esetében bővíthető, külön pipeline-ok (vagy szekciók/mappák monorepo-ban) létrehozásával, esetleg közös sablonok vagy könyvtárak használatával az ismétlődő lépésekhez, mint például a konténer építése vagy Kubernetes-be telepítés. Minden csapat saját kódját és pipeline-ját kezeli, de egy egységes platform és szabványok keretében.