Tárolófeladatok YAML-folyamatokban

Azure DevOps Szolgáltatások | Azure DevOps Server | Azure DevOps Server 2022

Ez a cikk az Azure Pipelines tárolófeladatait ismerteti. A tárolók egyszerű absztrakciók a gazdagép operációs rendszeréből, amelyek biztosítják a feladatok adott környezetben való futtatásához szükséges összes elemet.

Alapértelmezés szerint az Azure Pipelines-feladatok közvetlenül a gazdagépeken telepített ügynökökön futnak. Az üzemeltetett ügynökfeladatok kényelmesek, kevés kezdeti telepítést vagy infrastruktúra-karbantartást igényelnek, és jól használhatók alapszintű projektekhez. A feladatkörnyezet további szabályozásához definiálhat és futtathat folyamatfeladatokat tárolókban, hogy pontos verziójú operációs rendszereket, eszközöket és függőségeket kapjon.

Tárolófeladat esetén az ügynök először lekéri és elindítja a tárolót, majd futtatja a feladat minden lépését a tárolón belül. Ha az egyes buildelési lépések részletesebb szabályozására van szüksége, a lépéscélok használatával minden lépéshez kiválaszthat egy tárolót vagy gazdagépet.

Konténerfeladatokra vonatkozó követelmények

  • YAML-alapú folyamat. A klasszikus folyamatok nem támogatják a konténerfeladatokat.
  • Windows vagy Ubuntu által üzemeltetett ügynök. A MacOS-ügynökök nem támogatják a tárolókat. Nem Ubuntu Linux-ügynökök használatához lásd: Nonglibc-alapú tárolók.
  • A Docker telepítve van az ügynökön, és engedéllyel rendelkezik a Docker démon eléréséhez.
  • Az ügynök közvetlenül a gazdagépen fut, nem már egy tárolóban. A beágyazott tárolók nem támogatottak.

A Linux-alapú tárolókra a következő követelmények vonatkoznak:

  • A Bash telepítve van.
  • GNU C-kódtár (glibc)-alapú. A Nonglibc-tárolókhoz további beállításokra van szükség. További információ: Nonglibc-alapú tárolók.
  • Nem ENTRYPOINT. Előfordulhat, hogy a tárolók ENTRYPOINT nem működnek, mert a Docker Exec elvárja, hogy a tároló mindig futjon.
  • USER hozzáféréssel rendelkezik groupadd és más emelt szintű parancsokhoz anélkül, hogy sudo-t használna.
  • Az ügynök által biztosított Node.jsfuttatásának képessége.

    Feljegyzés

    Node.js a Windows-gazdagépeken futó Linux-tárolókhoz előre telepítve kell lennie.

Néhány lecsupaszított tároló, amely elérhető a Docker Hubon, különösen az Alpine Linuxon alapuló tárolók, nem felelnek meg ezeknek a követelményeknek. További információ: Nonglibc-alapú tárolók.

Egyedi munka

Az alábbi példa egy windowsos vagy linuxos egyfeladatos tárolót határoz meg.

Ez a példa arra utasítja a rendszert, hogy kérje le a ubuntu18.04 címkézett lemezképet, majd indítsa el a tárolót. A printenv parancs a ubuntu:18.04 tárolóban fut.

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Több feladat

A tárolók használatával ugyanazt a lépést több feladatban is futtathatja. Az alábbi példa ugyanazt a lépést futtatja az Ubuntu Linux több verziójában. Nem kell használnia a jobs kulcsszót, mert csak egyetlen feladat van definiálva.

pool:
  vmImage: 'ubuntu-latest'

strategy:
  matrix:
    ubuntu16:
      containerImage: ubuntu:16.04
    ubuntu18:
      containerImage: ubuntu:18.04
    ubuntu20:
      containerImage: ubuntu:20.04

container: $[ variables['containerImage'] ]

steps:
- script: printenv

Több feladat egyetlen ügynök gazdagépén

A tárolófeladat a mögöttes gazdagépügynök Docker-konfigurációs fájlját használja a rendszerkép-beállításjegyzék engedélyezéséhez. Ez a fájl a Docker-beállításjegyzék-tároló inicializálásának végén jelentkezik ki.

A tárolófeladatok beállításjegyzék-rendszerképeinek lekérése megtagadható jogosulatlan hitelesítés esetén, ha az ügynökön párhuzamosan futó másik feladat már kijelentkeztette a Docker-konfigurációs fájlt. A megoldás az, hogy a Docker-környezeti változók közé beállítunk egyet az üzemeltetett ügynökön futó minden ügynökkészlet számára DOCKER_CONFIG néven.

Exportálja a DOCKER_CONFIG minden ügynökkészlet runsvc.sh szkriptjébe az alábbiak szerint:

export DOCKER_CONFIG=./.docker

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

A tulajdonság használatával megadhatja a options tárolóindítási beállításokat.

container:
  image: ubuntu:18.04
  options: --hostname container-test --ip 192.168.0.1

steps:
- script: echo hello

Futtassa a docker create --help parancsot a Docker meghívásának átadható beállítások listájának megtekintéséhez. Nem minden beállítás garantáltan működik az Azure Pipelines szolgáltatással. Először ellenőrizze, hogy használhat-e tulajdonságot container ugyanahhoz a célra.

További információkért tekintse meg a docker-tároló létrehozási parancsreferenciáját és a resources.containers.container definícióját az Azure Pipelines YAML-sémareferenciájában.

Docker-szoftvercsatornák leképezése

Az Ügynök 5.279.0-s verziójától kezdve a Linux-ügynökök tárolófeladatai alapértelmezés szerint nem csatlakoztatják a gazda Docker-szoftvercsatornát (/var/run/docker.sock) a feladattárolóba. Ez az alapértelmezett beállítás a minimális jogosultság elvét követi, így azok a feladatok, amelyek nem igényelnek Docker-in-container viselkedést, nem kapnak hozzáférést a gazdagép Docker démonához.

Ha a tárolófeladat Docker-parancsokat futtat a gazdagép démonja ellen (Docker-in-container), ezt kifejezetten engedélyezze úgy, hogy a tárolóerőforráson a(z) mapDockerSocket értékét true értékre állítja.

resources:
  containers:
  - container: my_container
    image: ubuntu:22.04
    mapDockerSocket: true

Nagyszabású üzembe helyezések esetén, ahol nem praktikus mindenhol frissíteni a YAML-t, ideiglenesen beállíthatja az ügynökgazda AZP_AGENT_DEFAULT_MAP_DOCKER_SOCKET_TO_FALSE=false környezeti változóját az előző alapértelmezett működés visszaállításához, amelyben a Linux-tárolófeladatok a /var/run/docker.sock értékre képeződnek le, kivéve, ha a mapDockerSocket kifejezetten konfigurálva van. Ezt a beállítást csak rövid távú kerülőmegoldásként használja, mivel alapértelmezés szerint újraengedélyezi a Docker-socket leképezését.

Caution

A Docker-szoftvercsatornák leképezése komoly biztonsági következményekkel jár. A tárolóban lévő kód gyökérként futtatható a Docker-gazdagépen. Csak akkor állítsa be mapDockerSocket: true , ha a feladat docker-in-container viselkedést igényel.

Újrafelhasználható tárolódefiníció

Az alábbi YAML-példa a szakaszban szereplő tárolókat resources határozza meg, majd a hozzájuk rendelt aliasok alapján hivatkozik rájuk. A jobs kulcsszót a rendszer az egyértelműség kedvéért használja.

resources:
  containers:
  - container: u16
    image: ubuntu:16.04

  - container: u18
    image: ubuntu:18.04

  - container: u20
    image: ubuntu:20.04

jobs:
- job: RunInContainer
  pool:
    vmImage: 'ubuntu-latest'

  strategy:
    matrix:
      ubuntu16:
        containerResource: u16
      ubuntu18:
        containerResource: u18
      ubuntu20:
        containerResource: u20

  container: $[ variables['containerResource'] ]

  steps:
  - script: printenv

Szolgáltatásvégpontok

A nyilvános Docker Hubon kívül más regisztrációs adatbázisokban is üzemeltethet tárolókat. Ha rendszerképet szeretne üzemeltetni az Azure Container Registryben vagy egy másik privát tárolóregisztrációs adatbázisban, beleértve egy privát Docker Hub-beállításjegyzéket, adjon hozzá egy szolgáltatáskapcsolatot a beállításjegyzék eléréséhez. Ezután hivatkozhat a végpontra a tárolódefinícióban.

Privát Docker Hub-kapcsolat:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

Azure Container Registry-kapcsolat:

container:
  image: myprivate.azurecr.io/windowsservercore:1803
  endpoint: my_acr_connection

Feljegyzés

Az Azure Pipelines nem tud szolgáltatáskapcsolatot beállítani az Amazon Elastic Container Registryhez (ECR), mert az Amazon ECR más ügyféleszközökre is szükség van ahhoz, hogy az Amazon Web Services (AWS) hitelesítő adatai használhatóak legyenek a Docker-hitelesítéshez.

Glibc nélküli tárolók

Az üzemeltetett Azure Pipelines-ügynökök Node.jsszolgáltatnak, amely a feladatok és szkriptek futtatásához szükséges. A Node.js verzió általában a felhőben használt glibc C-futtatókörnyezetre fordul. Egyes Linux-változatok más C futtatókörnyezeteket használnak. Az Alpine Linux például a musl-t használ. További információ: Microsoft által üzemeltetett ügynökök.

Ha nem glibc-alapú konténert szeretne használni egy folyamatláncban, a következők szerint kell eljárnia:

  • Adja meg saját Node.js másolatát.
  • Adjon hozzá egy címkét a képhez, amely a Node.js bináris fájl helyére mutat.
  • Adja meg az bash, sudo, whichés groupadd az Azure Pipelines függőségeit.

Saját Node.js

Ha nemglibc-alapú tárolót használ, csomópont bináris fájlt kell hozzáadnia a tárolóhoz. Node.js 18 biztonságos választás. Kezdje a node:18-alpine képről.

Irányítsa az ügynököt a Node.js-hez

Az ügynök felolvassa a tárolócímkét "com.azure.dev.pipelines.handler.node.path". Ha ez a címke létezik, akkor a Node.js bináris elérési útjának kell lennie.

Például egy képen node:18-alpinea következő sor hozzáadása a Dockerfile-hoz:

LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"

Szükséges csomagok hozzáadása

Az Azure Pipelines megköveteli, hogy egy Bash-alapú rendszer általános felügyeleti csomagokkal rendelkezzen. Az Alpine Linux nem rendelkezik több szükséges csomaggal. Telepítse bash, sudo, és shadow, és fedezze az alapvető igényeket.

RUN apk add bash sudo shadow

Ha bármilyen beépített vagy Marketplace-feladattól függ, adja meg a szükséges bináris fájlokat is.

Teljes Dockerfile-példa

FROM node:18-alpine

RUN apk add --no-cache --virtual .pipeline-deps readline linux-pam \
  && apk add bash sudo shadow \
  && apk del .pipeline-deps

LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"

CMD [ "node" ]