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-*
ésubuntu-*
az ügynökök támogatják a tárolók futtatását. Azmacos-*
ü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ásaUSER
é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
ésgroupadd
.
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-alpine
a 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 sudo
shadow
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" ]