Menentukan pekerjaan kontainer (YAML)

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Secara default, pekerjaan berjalan pada komputer host tempat agen diinstal. Ini nyaman dan biasanya cocok untuk proyek yang baru saja mulai mengadopsi Azure Pipelines. Seiring waktu, Anda mungkin menemukan bahwa Anda ingin kontrol lebih besar atas konteks tempat tugas Anda dijalankan. Alur YAML menawarkan pekerjaan kontainer untuk tingkat kontrol ini.

Pada agen Linux dan Windows, pekerjaan dapat dijalankan pada host atau dalam kontainer. (Di macOS dan Red Hat Enterprise Linux 6, pekerjaan kontainer tidak tersedia.) Kontainer menyediakan isolasi dari host dan memungkinkan Anda menyematkan versi alat dan dependensi tertentu. Pekerjaan host memerlukan lebih sedikit penyiapan awal dan infrastruktur untuk dipertahankan.

Kontainer menawarkan abstraksi ringan atas sistem operasi host. Anda dapat memilih versi sistem operasi, alat, dan dependensi yang tepat yang diperlukan build Anda. Saat Anda menentukan kontainer di alur Anda, agen akan terlebih dahulu mengambil dan memulai kontainer. Kemudian, setiap langkah pekerjaan akan berjalan di dalam kontainer. Anda tidak dapat memiliki kontainer berlapis. Kontainer tidak didukung saat agen sudah berjalan di dalam kontainer.

Jika Anda memerlukan kontrol terperinci pada tingkat langkah individual, target langkah memungkinkan Anda memilih kontainer atau host untuk setiap langkah.

Persyaratan

Kontainer berbasis Linux

Sistem Azure Pipelines memerlukan beberapa hal dalam kontainer berbasis Linux:

  • Bash
  • berbasis glibc
  • Dapat menjalankan Node.js (yang disediakan agen)
  • Tidak menentukan ENTRYPOINT
  • USER memiliki akses ke groupadd dan perintah hak istimewa lainnya tanpa sudo

Dan di host agen Anda:

  • Pastikan Docker terinstal
  • Agen harus memiliki izin untuk mengakses daemon Docker

Pastikan kontainer Anda memiliki masing-masing alat ini yang tersedia. Beberapa kontainer yang dilucuti tersedia di Docker Hub, terutama yang didasarkan pada Alpine Linux, tidak memenuhi persyaratan minimum ini. Kontainer dengan ENTRYPOINT mungkin tidak berfungsi, karena Azure Pipelines akan docker create menjadi kontainer yang menunggu dan docker exec serangkaian perintah, yang mengharapkan kontainer selalu aktif dan berjalan.

Catatan

Untuk kontainer Linux berbasis Windows, Node.js harus diinstal sebelumnya.

Kontainer Windows

Azure Pipelines juga dapat menjalankan Kontainer Windows. Windows Server versi 1803 atau yang lebih tinggi diperlukan. Docker harus diinstal. Pastikan agen alur Anda memiliki izin untuk mengakses daemon Docker.

Kontainer Windows harus mendukung menjalankan Node.js. Kontainer Windows Nano Server dasar kehilangan dependensi yang diperlukan untuk menjalankan Simpul.

Agen yang dihosting

Hanya windows-2019 dan ubuntu-* gambar mendukung kontainer yang sedang berjalan. Gambar macOS tidak mendukung kontainer yang sedang berjalan.

Pekerjaan tunggal

Contoh sederhana:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Ini memberi tahu sistem untuk mengambil gambar yang ubuntu ditandai 18.04 dari Docker Hub dan kemudian memulai kontainer. printenv Ketika perintah berjalan, perintah akan terjadi di ubuntu:18.04 dalam kontainer.

Contoh Windows:

pool:
  vmImage: 'windows-2019'

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

steps:
- script: set

Catatan

Windows mengharuskan versi kernel host dan kontainer cocok. Karena contoh ini menggunakan gambar Windows 2019, kita akan menggunakan 2019 tag untuk kontainer.

Beberapa pekerjaan

Kontainer juga berguna untuk menjalankan langkah yang sama dalam beberapa pekerjaan. Dalam contoh berikut, langkah-langkah yang sama berjalan di beberapa versi Ubuntu Linux. (Dan kita tidak perlu menyebutkan jobs kata kunci, karena hanya ada satu pekerjaan yang ditentukan.)

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

Titik akhir

Kontainer dapat dihosting pada registri selain registri Docker Hub publik. Untuk menghosting gambar di Azure Container Registry atau registri kontainer privat lainnya (termasuk registri Docker Hub privat), tambahkan koneksi layanan ke registri privat. Kemudian Anda dapat mereferensikannya dalam spesifikasi kontainer:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

steps:
- script: echo hello

or

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

steps:
- script: echo hello

Registri kontainer lainnya juga dapat berfungsi. Amazon ECR saat ini tidak berfungsi, karena ada alat klien lain yang diperlukan untuk mengonversi info masuk AWS menjadi sesuatu yang dapat digunakan Docker untuk mengautentikasi.

Catatan

Build Red Hat Enterprise Linux 6 dari agen tidak akan menjalankan pekerjaan kontainer. Pilih rasa Linux lain, seperti Red Hat Enterprise Linux 7 atau lebih tinggi.

Opsi

Jika Anda perlu mengontrol startup kontainer, Anda dapat menentukan options.

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

steps:
- script: echo hello

Menjalankan docker create --help akan memberi Anda daftar opsi yang dapat diteruskan ke pemanggilan Docker. Tidak semua opsi ini ditujukan untuk bekerja dengan Azure DevOps. Periksa terlebih dahulu untuk melihat apakah Anda dapat menggunakan properti kontainer untuk mencapai tujuan yang sama. Untuk informasi selengkapnya, lihat resources.containers.container di skema YAML dan docker create referensi perintah .

Definisi kontainer yang dapat digunakan kembali

Dalam contoh berikut, kontainer ditentukan di bagian sumber daya. Setiap kontainer kemudian dirujuk kemudian, dengan merujuk pada alias yang ditetapkan. (Di sini, kami secara eksplisit mencantumkan kata kunci untuk kejelasan jobs .)

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

Kontainer berbasis non glibc

Agen Azure Pipelines menyediakan salinan Node.js, yang diperlukan untuk menjalankan tugas dan skrip. Untuk mengetahui versi Node.js untuk agen yang dihosting, lihat Agen yang dihosting Microsoft. Versi Node.js dikompilasi terhadap runtime C yang kami gunakan di cloud yang dihosting, biasanya glibc. Beberapa varian Linux menggunakan runtime C lainnya. Misalnya, Alpine Linux menggunakan musl.

Jika Anda ingin menggunakan kontainer berbasis non-glibc sebagai kontainer pekerjaan, Anda harus mengatur beberapa hal sendiri. Pertama, Anda harus menyediakan salinan Node.js Anda sendiri. Kedua, Anda harus menambahkan label ke gambar Anda yang memberi tahu agen tempat menemukan biner Node.js. Akhirnya, stok Alpine tidak datang dengan dependensi lain yang bergantung pada Azure Pipelines: bash, sudo, yang, dan groupadd.

Bawa Node.js Anda sendiri

Anda bertanggung jawab untuk menambahkan biner Node ke kontainer Anda. Node 14 adalah pilihan yang aman. Anda dapat memulai dari node:14-alpine gambar.

Beri tahu agen tentang Node.js

Agen akan membaca label kontainer "com.azure.dev.pipelines.handler.node.path". Jika label ini ada, label harus berupa jalur ke biner Node.js. Misalnya, dalam gambar berdasarkan node:10-alpine, tambahkan baris ini ke Dockerfile Anda:

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

Menambahkan persyaratan

Azure Pipelines mengasumsikan sistem berbasis Bash dengan paket administrasi umum yang diinstal. Alpine Linux khususnya tidak dilengkapi dengan beberapa paket yang diperlukan. bashMenginstal , sudo, dan shadow akan mencakup kebutuhan dasar.

RUN apk add bash sudo shadow

Jika Anda bergantung pada tugas dalam kotak atau Marketplace apa pun, Anda juga harus menyediakan biner yang mereka butuhkan.

Contoh lengkap Dockerfile

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" ]

Beberapa pekerjaan dengan kumpulan agen pada satu agen yang dihosting

Pekerjaan kontainer menggunakan agen host dasar Docker config.json untuk otorisasi registri gambar, yang keluar di akhir inisialisasi kontainer registri Docker. Gambar registri berikutnya yang menarik otorisasi mungkin ditolak untuk "autentikasi tidak sah" karena file Docker config.json yang terdaftar dalam sistem untuk autentikasi telah dicatat oleh salah satu pekerjaan kontainer lain yang berjalan secara paralel.

Solusinya adalah mengatur variabel DOCKER_CONFIG lingkungan Docker yang khusus untuk setiap layanan kumpulan agen yang berjalan pada agen yang dihosting. DOCKER_CONFIG Ekspor di setiap skrip runsvc.sh kumpulan agen:

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