Bagikan melalui


Pekerjaan kontainer dalam alur YAML

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

Artikel ini menjelaskan pekerjaan kontainer di Azure Pipelines.

Secara default, pekerjaan Azure Pipelines berjalan langsung di komputer host tempat agen diinstal. Pekerjaan agen yang dihosting nyaman, memerlukan sedikit pengaturan awal dan infrastruktur untuk dipertahankan, dan sangat cocok untuk proyek dasar.

Jika Anda ingin kontrol lebih atas konteks tugas, Anda dapat menentukan dan menjalankan pekerjaan dalam kontainer. Kontainer adalah abstraksi ringan atas sistem operasi host yang menyediakan isolasi dari host. Saat menjalankan pekerjaan dalam kontainer, Anda dapat memilih versi sistem operasi, alat, dan dependensi yang tepat yang diperlukan build Anda.

Agen Linux dan Windows dapat menjalankan pekerjaan alur langsung di host atau dalam kontainer. Pekerjaan kontainer tidak tersedia di macOS.

Untuk pekerjaan kontainer, agen terlebih dahulu mengambil dan memulai kontainer. Kemudian setiap langkah pekerjaan berjalan di dalam kontainer.

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

Prasyarat

  • Gunakan alur YAML. Alur klasik tidak mendukung pekerjaan kontainer.
  • Gunakan agen Windows atau Ubuntu yang dihosting. Hanya windows-* agen dan ubuntu-* yang mendukung kontainer yang sedang berjalan. Agen macos-* tidak mendukung kontainer yang sedang berjalan.
  • Agen Anda disiapkan untuk pekerjaan kontainer.
    • Agen Windows dan Linux harus menginstal Docker, dan memerlukan izin untuk mengakses daemon Docker.
    • Kontainer tidak didukung saat agen sudah berjalan di dalam kontainer. Anda tidak dapat memiliki kontainer berlapis.

Persyaratan kontainer tambahan

Kontainer berbasis Linux memiliki persyaratan berikut. Untuk solusinya, lihat Kontainer berbasis Nonglibc.

  • Bash terinstal
  • Berbasis Pustaka C GNU (glibc)
  • Tanpa ENTRYPOINT
  • Menyediakan USER akses ke groupadd dan perintah istimewa lainnya tanpa menggunakan sudo
  • Dapat menjalankan Node.js, yang disediakan agen

    Catatan

    Node.js harus diinstal sebelumnya untuk kontainer Linux pada host Windows.

Beberapa kontainer yang dilucuti tersedia di Docker Hub, terutama kontainer berdasarkan Alpine Linux, tidak memenuhi persyaratan ini. Kontainer dengan ENTRYPOINT mungkin tidak berfungsi karena Azure Pipelines docker create dan docker exec mengharapkan bahwa kontainer selalu aktif dan berjalan.

Contoh pekerjaan tunggal

Contoh berikut menentukan kontainer Windows atau Linux untuk satu pekerjaan.

Contoh sederhana berikut mendefinisikan kontainer Linux:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Contoh sebelumnya memberi tahu sistem untuk mengambil gambar yang ubuntu ditandai 18.04 dari Docker Hub lalu memulai kontainer. Perintah printenv berjalan di ubuntu:18.04 dalam kontainer.

Beberapa pekerjaan

Anda dapat menggunakan kontainer untuk menjalankan langkah yang sama dalam beberapa pekerjaan. Contoh berikut menjalankan langkah yang sama di beberapa versi Ubuntu Linux. Anda tidak perlu menyebutkan jobs kata kunci karena hanya 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

Beberapa pekerjaan dengan kumpulan agen pada satu host agen

Pekerjaan kontainer menggunakan file konfigurasi Docker agen host yang mendasar untuk otorisasi registri gambar. File ini keluar di akhir inisialisasi kontainer registri Docker. Penarikan gambar registri untuk pekerjaan kontainer berikutnya mungkin ditolak unauthorized authentication karena pekerjaan lain yang berjalan secara paralel sudah keluar dari file konfigurasi Docker.

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

export DOCKER_CONFIG=./.docker

Opsi startup

Anda dapat menentukan options untuk mengontrol startup kontainer, seperti dalam contoh berikut:

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

steps:
- script: echo hello

Menjalankan docker create --help memberi Anda daftar opsi yang dapat Anda teruskan ke pemanggilan Docker. Tidak semua opsi ini dijamin berfungsi dengan Azure DevOps. Periksa terlebih dahulu untuk melihat apakah Anda dapat menggunakan container properti untuk mencapai tujuan yang sama.

Untuk informasi selengkapnya, lihat referensi perintah buat docker dan definisi resources.containers.container dalam referensi skema YAML Azure DevOps.

Definisi kontainer yang dapat digunakan kembali

Contoh berikut mendefinisikan kontainer di bagian resources , lalu mereferensikannya dengan alias yang ditetapkan. Kata jobs kunci secara eksplisit tercantum untuk kejelasan.

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

Titik akhir layanan

Anda dapat menghosting kontainer di registri lain daripada Docker Hub publik. Untuk menghosting gambar di Azure Container Registry atau registri kontainer privat lainnya, termasuk registri Docker Hub privat, tambahkan koneksi layanan untuk mengakses registri. Kemudian Anda dapat mereferensikan titik akhir dalam definisi kontainer.

Koneksi Docker Hub Privat:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

Koneksi Azure Container Registry:

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

Catatan

Azure Pipelines tidak dapat menyiapkan koneksi layanan untuk Amazon Elastic Container Registry (ECR), karena Amazon ECR memerlukan alat klien lain untuk mengonversi kredensial AWS menjadi sesuatu yang dapat digunakan Docker untuk mengautentikasi.

Kontainer berbasis Nonglibc

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 digunakan di cloud yang dihosting, biasanya glibc. Beberapa varian Linux menggunakan runtime C lainnya. Misalnya, Alpine Linux menggunakan musl.

Jika Anda ingin menggunakan kontainer berbasis nonglibc, Anda perlu:

  • Berikan salinan Node.js Anda sendiri.
  • Tambahkan label ke gambar Anda yang memberi tahu agen tempat menemukan biner Node.js.
  • Berikan dependensi lain yang bergantung pada Azure Pipelines: bash, , sudowhich, dan groupadd.

Menyediakan Node.js Anda sendiri

Jika Anda menggunakan kontainer berbasis nonglibc, Anda bertanggung jawab untuk menambahkan biner Node ke kontainer Anda. Node.js 18 adalah pilihan yang aman. Mulai dari node:18-alpine gambar.

Beri tahu agen tentang Node.js

Agen membaca label "com.azure.dev.pipelines.handler.node.path"kontainer . Jika label ini ada, label harus berupa jalur ke biner Node.js.

Misalnya, dalam gambar berdasarkan node:18-alpine, tambahkan baris berikut ke Dockerfile Anda:

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

Menambahkan paket yang diperlukan

Azure Pipelines mengasumsikan sistem berbasis Bash dengan paket administratif umum yang diinstal. Alpine Linux khususnya tidak dilengkapi dengan beberapa paket yang diperlukan. Instal bash, sudo, dan shadow untuk memenuhi kebutuhan dasar.

RUN apk add bash sudo shadow

Jika Anda bergantung pada tugas dalam kotak atau Marketplace, berikan juga biner yang mereka butuhkan.

Contoh Dockerfile Lengkap

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