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


Tárolófeladatok YAML-folyamatokban

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Ez a cikk az Azure Pipelines tárolófeladatait ismerteti.

Alapértelmezés szerint az Azure Pipelines-feladatok közvetlenül azon a gazdagépen futnak, amelyen az ügynök telepítve van. Az üzemeltetett ügynökfeladatok kényelmesek, kevés kezdeti telepítést és infrastruktúrát igényelnek a karbantartáshoz, és jól alkalmazhatók az alapszintű projektekhez.

Ha jobban szeretné szabályozni a tevékenységkörnyezetet, definiálhat és futtathat feladatokat tárolókban. A tárolók egy egyszerű absztrakció a gazdagép operációs rendszere felett, amely elkülöníti a gazdagépet. Amikor feladatokat futtat tárolókban, kiválaszthatja az operációs rendszerek, az eszközök és a függőségek pontos verzióit, amelyekre a buildnek szüksége van.

A Linux- és Windows-ügynökök közvetlenül a gazdagépen vagy tárolókban futtathatnak folyamatfeladatokat. A tárolófeladatok nem érhetők el macOS rendszeren.

Tárolófeladat esetén az ügynök először lekéri és elindítja a tárolót. Ezután a feladat minden lépése a tárolóban fut.

Ha részletes vezérlésre van szüksége az egyes buildelési lépések szintjén, a lépéscélok lehetővé teszik, hogy minden lépéshez válasszon egy tárolót vagy gazdagépet.

Előfeltételek

  • HASZNÁLJON YAML-folyamatot. A klasszikus folyamatok nem támogatják a tárolófeladatokat.
  • Üzemeltetett Windows- vagy Ubuntu-ügynök használata. Csak windows-* és ubuntu-* az ügynökök támogatják a tárolók futtatását. Az macos-* ügynökök nem támogatják a tárolók futtatását.
  • Az ügynök be van állítva tárolófeladatokhoz.
    • A Windows- és Linux-ügynököknek telepítve kell lenniük a Dockerben, és engedélyre van szükségük a Docker démon eléréséhez.
    • A tárolók nem támogatottak, ha az ügynök már fut egy tárolóban. Beágyazott tárolók nem lehetnek.

További tárolókövetelmények

A Linux-alapú tárolókra az alábbi követelmények vonatkoznak. Kerülő megoldásokért tekintse meg a Nonglibc-alapú tárolókat.

  • Bash telepítve
  • GNU C-kódtár (glibc)-alapú
  • Nem ENTRYPOINT
  • Hozzáférés groupadd biztosítása USER és más kiemelt parancsok használata nélkülsudo
  • Futtathat Node.js, amelyet az ügynök biztosít

    Feljegyzés

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

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. Előfordulhat, hogy a ENTRYPOINT tárolók nem működnek, mert az Azure Pipelines docker create docker exec arra számít, hogy a tároló mindig működik.

Példák önálló feladatokra

Az alábbi példák egy Windows- vagy Linux-tárolót határoznak meg egyetlen feladathoz.

Az alábbi egyszerű példa egy Linux-tárolót határoz meg:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Az előző példa arra utasítja a rendszert, hogy kérje le a ubuntu Docker Hubról címkézett 18.04 rendszerképet, majd indítsa el a tárolót. A printenv parancs a tárolóban ubuntu:18.04 fut.

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 megemlítenie a kulcsszót jobs , 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 ügynökkészletekkel egyetlen ügynök gazdagépen

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. Előfordulhat, hogy a beállításjegyzék rendszerképének lekérése a későbbi tárolófeladatok esetében unauthorized authentication megtagadható, mert egy párhuzamosan futó másik feladat már kijelentkeztette a Docker konfigurációs fájlját.

A megoldás egy Docker-környezeti változó DOCKER_CONFIG beállítása, amely az üzemeltetett ügynökön futó minden ügynökkészletre jellemző. Exportálja az DOCKER_CONFIG egyes ügynökkészletek runsvc.sh szkriptjét az alábbiak szerint:

export DOCKER_CONFIG=./.docker

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

A tárolóindítás szabályozását az alábbi példához hasonlóan megadhatja options :

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

steps:
- script: echo hello

A futtatás docker create --help azoknak a beállításoknak a listáját tartalmazza, amelyeket átadhat a Docker meghívásának. Ezek közül a lehetőségek közül nem minden garantáltan működik az Azure DevOpsszal. Először ellenőrizze, hogy használhat-e tulajdonságot container ugyanahhoz a célhoz.

További információkért tekintse meg a docker create parancsreferenciáját és a resources.containers.container definícióját az Azure DevOps YAML sémahivatkozásában.

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

Az alábbi 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ó explicit módon van felsorolva az egyértelműség kedvéért.

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 megköveteli, hogy más ügyféleszközök is átalakítják az AWS-hitelesítő adatokat a Docker által a hitelesítéshez használhatóvá.

Nemglibc-alapú tárolók

Az Azure Pipelines-ügynök biztosítja a Node.js egy példányát, amely a feladatok és szkriptek futtatásához szükséges. Az üzemeltetett ügynökhöz tartozó Node.js verziójának megtekintéséhez tekintse meg a Microsoft által üzemeltetett ügynököket.

A Node.js verziója az üzemeltetett felhőben használt C-futtatókörnyezetre fordít, általában a Glibc-ra. Egyes Linux-változatok más C futtatókörnyezeteket használnak. Az Alpine Linux például muslt használ.

Ha nemglibc-alapú tárolót szeretne használni, a következőkre van szüksége:

  • Adja meg saját Node.js másolatát.
  • Adjon hozzá egy címkét a képhez, amely közli az ügynökkel, hogy hol keresse meg a Node.js bináris fájlt.
  • Adjon meg más függőségeket, amelyektől az Azure Pipelines függ: bash, sudo, whichés groupadd.

Saját Node.js

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

Tájékoztassa az ügynököt a Node.js

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 egy Bash-alapú rendszert feltételez, amelyen telepítve vannak a gyakori felügyeleti csomagok. Az Alpine Linux különösen nem tartalmaz több szükséges csomagot. Telepítse bashés sudoshadow 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" ]