Megosztás a következőn keresztül:


Szolgáltatástárolók

Azure DevOps Services

Ha a folyamat egy vagy több szolgáltatás támogatását igényli, előfordulhat, hogy feladatonként létre kell hoznia, csatlakoznia kell és törölnie kell a szolgáltatásokat. Előfordulhat például, hogy a folyamat olyan integrációs teszteket futtat, amelyek hozzáférést igényelnek egy újonnan létrehozott adatbázishoz és memória-gyorsítótárhoz a folyamat minden egyes feladatához.

A tárolók egyszerű és hordozható módot biztosítanak egy olyan szolgáltatás futtatására, amelytől a folyamat függ. A szolgáltatástárolók lehetővé teszi a tárolóalapú szolgáltatások életciklusának automatikus létrehozását, hálózatba helyezését és kezelését. Minden szolgáltatástároló csak az azt igénylő feladat számára érhető el. A szolgáltatástárolók bármilyen feladattal működnek, de leggyakrabban tárolófeladatokkal használják.

Követelmények

  • A szolgáltatástárolóknak meg kell határozniuk egy CMD vagy ENTRYPOINT. A folyamat argumentumok nélkül fut docker run a megadott tárolóhoz.

  • Az Azure Pipelines Linux- vagy Windows-tárolókat futtathat. Használhatja a linuxos tárolók üzemeltetett Ubuntu tárolókészletét, vagy a Windows-tárolók üzemeltetett Windows-készletét. A üzemeltetett macOS-készlet nem támogatja a tárolók futtatását.

Feljegyzés

A szolgáltatástárolók nem támogatottak a klasszikus folyamatokban.

Egytárolós feladat

Az alábbi példa YAML-folyamatdefiníció egyetlen tárolófeladatot mutat be.

resources:
  containers:
  - container: my_container
    image: buildpack-deps:focal
  - container: nginx
    image: nginx

pool:
  vmImage: 'ubuntu-latest'

container: my_container
services:
  nginx: nginx

steps:
- script: |
    curl nginx
  displayName: Show that nginx is running

Az előző folyamat lekéri az és buildpack-deps a tárolókat a nginx Docker Hubról, majd elindítja a tárolókat. A tárolók hálózatba vannak állítva, hogy a nevük alapján services elérhessék egymást.

Ebben a feladattárolóban a gazdagép neve docker-hálózatkezeléssel nginx oldja fel a megfelelő szolgáltatásokat. A hálózaton lévő összes tároló automatikusan elérhetővé teszi az összes portot egymásnak.

Egyetlen nem kontainer feladat

A szolgáltatástárolókat feladattároló nélkül is használhatja, ahogyan az alábbi példában is látható.

resources:
  containers:
  - container: nginx
    image: nginx
    ports:
    - 8080:80
    env:
      NGINX_PORT: 80
  - container: redis
    image: redis
    ports:
    - 6379

pool:
  vmImage: 'ubuntu-latest'

services:
  nginx: nginx
  redis: redis

steps:
- script: |
    curl localhost:8080
    echo $AGENT_SERVICES_REDIS_PORTS_6379

Az előző folyamat elindítja a legújabb nginx tárolókat. Mivel a feladat nem tárolóban fut, nincs automatikus névfeloldás. Ehelyett a szolgáltatásokat a következővel localhostérheti el: . A példa explicit módon biztosítja a portot 8080:80 .

Egy másik módszer, ha lehetővé teszi egy véletlenszerű port dinamikus hozzárendelését futásidőben. Ezeket a dinamikus portokat ezután változókkal érheti el. Ezek a változók a következő formában lesznek: agent.services.<serviceName>.ports.<port>. Egy Bash-szkriptben a folyamatkörnyezet használatával érheti el a változókat.

Az előző példában redis egy véletlenszerűen elérhető port van hozzárendelve a gazdagépen. A agent.services.redis.ports.6379 változó tartalmazza a portszámot.

Több feladat

A szolgáltatástárolók akkor is hasznosak, ha ugyanazt a lépést ugyanazon szolgáltatás több verzióján futtatják. Az alábbi példában ugyanezek a lépések a PostgreSQL több verzióján futnak.

resources:
  containers:
  - container: my_container
    image: ubuntu:22.04
  - container: pg15
    image: postgres:15
  - container: pg14
    image: postgres:14

pool:
  vmImage: 'ubuntu-latest'

strategy:
  matrix:
    postgres15:
      postgresService: pg15
    postgres14:
      postgresService: pg14

container: my_container

services:
  postgres: $[ variables['postgresService'] ]
steps:
- script: printenv

Portok

Tárolóerőforrás vagy beágyazott tároló meghívásakor megadhatja a tárolón közzéteendő tömböt ports , ahogyan az alábbi példában is látható.

resources:
  containers:
  - container: my_service
    image: my_service:latest
    ports:
    - 8080:80
    - 5432

services:
  redis:
    image: redis
    ports:
    - 6379/tcp

ports Nem szükséges megadni, ha a feladat tárolóban fut, mert az ugyanazon a Docker-hálózaton lévő tárolók alapértelmezés szerint automatikusan elérhetővé teszik az összes portot egymásnak.

Ha a feladat a gazdagépen fut, ports a szolgáltatás eléréséhez szükséges. A portok formátuma <hostPort>:<containerPort> vagy csak <containerPort> a végén választható /<protocol> . Például 6379/tcp a gazdagép egy véletlenszerű portjához kötött porton 6379keresztül teszi elérhetővétcp.

A gazdagép véletlenszerű portjához kötött portok esetében a folyamat létrehozza az űrlap agent.services.<serviceName>.ports.<port> változóját, hogy a feladat hozzáférhessen a porthoz. Feloldja például agent.services.redis.ports.6379 a gazdagép véletlenszerűen hozzárendelt portját.

Mennyiségek

A kötetek hasznosak az adatok szolgáltatások közötti megosztásához vagy egy feladat több futtatása közötti adatmegőrzéshez. A kötetcsatlakozásokat az űrlap tömbjeként volumes adhatja meg, ahol <source> egy elnevezett kötet vagy egy abszolút elérési út lehet a gazdagépen, és <destinationPath> abszolút elérési út a tárolóban.<source>:<destinationPath> A kötetek nevezhetők Docker-köteteknek, névtelen Docker-köteteknek vagy kötéscsatlakozásoknak a gazdagépen.

services:
  my_service:
    image: myservice:latest
    volumes:
    - mydockervolume:/data/dir
    - /data/dir
    - /src/dir:/dst/dir

Feljegyzés

Ha Microsoft által üzemeltetett készleteket használ, a kötetek nem maradnak meg a feladatok között, mert a gazdagép az egyes feladatok befejezése után törlődik.

Indítási beállítások

A szolgáltatástárolók ugyanazokkal a tárolóerőforrásokkal osztoznak, mint a tárolófeladatok. Ez azt jelenti, hogy ugyanazokat az indítási beállításokat használhatja.

Állapot-ellenőrzés

Ha bármelyik szolgáltatástároló a HEALTHCHECK értéket adja meg, az ügynök opcionálisan megvárhatja, amíg a tároló kifogástalan állapotban van a feladat futtatása előtt.

Több tároló például szolgáltatásokkal

Az alábbi példában egy Django Python-webtároló van csatlakoztatva a PostgreSQL- és MySQL-adatbázistárolókhoz.

  • A PostgreSQL-adatbázis az elsődleges adatbázis, a tároló neve pedig .db
  • A db tároló kötetet /data/db:/var/lib/postgresql/datahasznál, és három adatbázisváltozót ad át a tárolónak env.
  • A mysql tároló portot 3306:3306használ, és vannak adatbázisváltozók is.env
  • A web tároló nyitva van a porttal 8000.

A lépések során telepíti a függőségeket, pip majd django-teszteket futtat.

Egy működő példa beállításához be kell állítania egy Django-webhelyet, amely két adatbázissal rendelkezik. A példa feltételezi, hogy a manage.py fájl a gyökérkönyvtárban található, és a Django-projekt is ezen a könyvtáron belül található. Ha nem, előfordulhat, hogy frissítenie kell az elérési utat a /__w/1/s/ következőben /__w/1/s/manage.py test: .

resources:
  containers:
    - container: db
      image: postgres
      volumes:
          - '/data/db:/var/lib/postgresql/data'
      env:
        POSTGRES_DB: postgres
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
    - container: mysql
      image: 'mysql:5.7'
      ports:
         - '3306:3306'
      env:
        MYSQL_DATABASE: users
        MYSQL_USER: mysql
        MYSQL_PASSWORD: mysql
        MYSQL_ROOT_PASSWORD: mysql
    - container: web
      image: python
      volumes:
      - '/code'
      ports:
        - '8000:8000'

pool:
  vmImage: 'ubuntu-latest'

container: web
services:
  db: db
  mysql: mysql

steps:
    - script: |
        pip install django
        pip install psycopg2
        pip install mysqlclient
      displayName: set up django
    - script: |
          python /__w/1/s/manage.py test