Tárolófeladatok definiálása (YAML)

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

Alapértelmezés szerint a feladatok azon a gazdagépen futnak, amelyen az ügynök telepítve van. Ez kényelmes és általában jól használható az Azure Pipelines bevezetésének első szakaszában megkezdett projektekhez. Idővel előfordulhat, hogy jobban szeretné szabályozni azt a környezetet, amelyben a tevékenységek futnak. A YAML-folyamatok tárolófeladatokat kínálnak ehhez a vezérlési szinthez.

Linux- és Windows-ügynökökön a feladatok futtathatók a gazdagépen vagy egy tárolóban. (MacOS és Red Hat Enterprise Linux 6 rendszeren a tárolófeladatok nem érhetők el.) A tárolók elkülönítést biztosítanak a gazdagéptől, és lehetővé teszik az eszközök és függőségek meghatározott verzióinak rögzítését. A gazdagépfeladatok karbantartásához kevesebb kezdeti beállításra és infrastruktúrára van szükség.

A tárolók egyszerű absztrakciót biztosítanak a gazdagép operációs rendszere felett. Kiválaszthatja az operációs rendszerek, eszközök és függőségek pontos verzióit, amelyekre a buildnek szüksége van. Amikor megad egy tárolót a folyamatban, az ügynök először beolvassa és elindítja a tárolót. Ezután a feladat minden lépése a tárolóban fog futni. Beágyazott tárolók nem lehetnek. A tárolók nem támogatottak, ha egy ügynök már fut egy tárolón belül.

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

Követelmények

Linux-alapú tárolók

Az Azure Pipelines-rendszer néhány dolgot igényel Linux-alapú tárolókban:

  • Bash
  • glibc-alapú
  • Futtathat Node.js (amelyet az ügynök biztosít)
  • Nem határoz meg ENTRYPOINT
  • USERhozzáféréssel és egyéb jogosultsági parancsokkal rendelkezik anélkül, hogy groupaddsudo

És az ügynök gazdagépén:

  • Győződjön meg arról, hogy a Docker telepítve van
  • Az ügynöknek engedéllyel kell rendelkeznie a Docker démon eléréséhez

Győződjön meg arról, hogy a tárolóban elérhetőek ezek az eszközök. A Docker Hubon elérhető lecsupaszított tárolók némelyike, különösen az Alpine Linuxon alapuló tárolók némelyike nem felel meg ezeknek a minimális követelményeknek. Előfordulhat, hogy a tárolók ENTRYPOINT nem működnek, mivel az Azure Pipelines egy várakozó tárolót és docker exec egy parancssorozatot fog docker create létrehozni, amely arra számít, hogy a tároló mindig működik.

Feljegyzés

Windows-alapú Linux-tárolók esetén Node.js előre telepíteni kell.

Windows-tárolók

Az Azure Pipelines Windows-tárolókat is futtathat. A Windows Server 1803-es vagy újabb verziójára van szükség. A Dockert telepíteni kell. Győződjön meg arról, hogy a folyamatügynök rendelkezik engedéllyel a Docker-démon eléréséhez.

A Windows-tárolónak támogatnia kell a Node.js futtatását. A Csomópont futtatásához szükséges függőségek hiányoznak egy alap Windows Nano Server-tárolóból.

Saját ügynökök

Csak windows-2019 a ubuntu-* rendszerképek támogatják a tárolók futtatását. A macOS rendszerkép nem támogatja a tárolók futtatását.

Önálló feladat

Egy egyszerű példa:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Ez azt jelzi a rendszernek, hogy lekérje a ubuntu Docker Hubról címkézett 18.04 rendszerképet, majd indítsa el a tárolót. Amikor a printenv parancs fut, az a tárolóban ubuntu:18.04 történik.

Windows-példa:

pool:
  vmImage: 'windows-2019'

container: mcr.microsoft.com/windows/servercore:ltsc2019

steps:
- script: set

Feljegyzés

A Windows megköveteli, hogy a gazdagép és a tároló kernelverziója egyezzen. Mivel ez a példa a Windows 2019 rendszerképet használja, a 2019 tároló címkéjét fogjuk használni.

Több feladat

A tárolók akkor is hasznosak, ha ugyanazokat a lépéseket több feladatban is futtatják. Az alábbi példában ugyanezek a lépések az Ubuntu Linux több verziójában futnak. (És nem kell megemlítenünk a jobs kulcsszót, mivel 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

Végpontok

A tárolók nem nyilvános Docker Hub-regisztrációs adatbázisokon üzemeltethetők. 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 is), adjon hozzá egy szolgáltatáskapcsolatot a privát beállításjegyzékhez. Ezután hivatkozhat rá egy tároló specifikációjában:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

steps:
- script: echo hello

vagy

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

steps:
- script: echo hello

Más tárolóregisztrációs adatbázisok is működhetnek. Az Amazon ECR jelenleg nem működik, mivel más ügyféleszközökre is szükség van az AWS hitelesítő adatainak a Docker általi hitelesítéshez való átalakításához.

Feljegyzés

Az ügynök Red Hat Enterprise Linux 6 buildje nem futtat tárolófeladatot. Válasszon másik Linux-ízt, például Red Hat Enterprise Linux 7 vagy újabb verziót.

Beállítások

Ha szabályoznia kell a tárolóindítást, 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 a Docker-meghívásnak átadható lehetőségek listáját tartalmazza. 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 tárolótulajdonságot ugyanahhoz a célhoz. További információt a YAML-sémában és adocker createparancshivatkozásban találresources.containers.container.

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

Az alábbi példában a tárolók az erőforrások szakaszban vannak definiálva. Ezután a rendszer később hivatkozik az egyes tárolókra a hozzárendelt aliasra hivatkozva. (Itt explicit módon felsoroljuk a kulcsszót az jobs 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

Nem glibc-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örnyezet alapján van lefordítva, általában glibc. A Linux egyes változatai más C futtatókörnyezeteket használnak. Az Alpine Linux például muslt használ.

Ha nem glibc-alapú tárolót szeretne feladattárolóként használni, néhány dolgot önállóan kell elrendeznie. Először meg kell adnia a saját Node.js másolatát. Másodszor, fel kell vennie egy címkét a képre, amely közli az ügynökkel, hogy hol található a Node.js bináris fájl. Végül, a stock Alpine nem jár más függőségekkel, amelyektől az Azure Pipelines függ: bash, sudo, amely és groupadd.

Saját Node.js

Ön a felelős azért, hogy csomópont bináris fájlt adjon hozzá a tárolóhoz. A Node 18 biztonságos választás. A képből node:18-alpine indulhat ki.

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

Az ügynök felolvas egy "com.azure.dev.pipelines.handler.node.path" tárolócímkét. 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épben, amely alapján node:18-alpine, adja hozzá ezt a sort a Dockerfile-hoz:

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

Követelmények 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ítés bash, sudoés shadow az alapvető igényeket fogja kielégíteni.

RUN apk add bash sudo shadow

Ha bármilyen beépített vagy Marketplace-feladattól függ, meg kell adnia azokat a bináris fájlokat is, amelyekre szükségük van.

Teljes példa egy Dockerfile-ra

FROM node:10-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" ]

Több feladat ügynökkészletekkel egyetlen üzemeltetett ügynökön

A tárolófeladat a mögöttes gazdaügynököt, a Docker-config.json használja a rendszerkép-beállításjegyzék-engedélyezéshez, amely a Docker-beállításjegyzék-tároló inicializálásának végén kijelentkezik. A rendszerképek későbbi lekéréses engedélyezése megtagadható a "jogosulatlan hitelesítés" miatt, mert a rendszerben a hitelesítéshez regisztrált Docker-config.json fájlt már kijelentkezteti az egyik másik, párhuzamosan futó tárolófeladat.

A megoldás az üzemeltetett ügynökön futó összes ügynökkészlet-szolgáltatásra jellemző Docker-környezeti változó DOCKER_CONFIG beállítása. Exportálja az DOCKER_CONFIG egyes ügynökkészletek runsvc.sh szkriptjét:

#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker