YAML işlem hatlarında kapsayıcı işleri

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Bu makalede Azure Pipelines'daki kapsayıcı işleri açıklanmaktadır.

Varsayılan olarak, Azure Pipelines işleri doğrudan aracının yüklü olduğu konak makinelerde çalışır. Barındırılan aracı işleri kullanışlıdır, bakımı için çok az ilk kurulum ve altyapı gerektirir ve temel projeler için uygundur.

Görev bağlamı üzerinde daha fazla denetim istiyorsanız kapsayıcılarda işleri tanımlayabilir ve çalıştırabilirsiniz. Kapsayıcılar, konaktan yalıtım sağlayan konak işletim sistemi üzerinde basit bir soyutlamadır. kapsayıcılarda işleri çalıştırdığınızda, derlemenizin gerektirdiği işletim sistemlerinin, araçların ve bağımlılıkların tam sürümlerini seçebilirsiniz.

Linux ve Windows aracıları işlem hattı işlerini doğrudan konakta veya kapsayıcılarda çalıştırabilir. Kapsayıcı işleri macOS'ta kullanılamaz.

Kapsayıcı işi için aracı önce kapsayıcıyı getirir ve başlatır. Ardından işin her adımı kapsayıcı içinde çalışır.

Tek tek derleme adımı düzeyinde ayrıntılı denetime ihtiyacınız varsa, adım hedefleri her adım için bir kapsayıcı veya konak seçmenize olanak tanır.

Önkoşullar

  • YAML işlem hattı kullanın. Klasik işlem hatları kapsayıcı işlerini desteklemez.
  • Barındırılan bir Windows veya Ubuntu aracısı kullanın. Yalnızca windows-* ve ubuntu-* aracıları kapsayıcı çalıştırmayı destekler. Aracılar macos-* kapsayıcı çalıştırmayı desteklemez.
  • Aracınız kapsayıcı işleri için ayarlandı.
    • Windows ve Linux aracılarının Docker yüklü olması ve Docker daemon'a erişmek için izne sahip olması gerekir.
    • Aracı zaten bir kapsayıcı içinde çalışırken kapsayıcılar desteklenmez. İç içe kapsayıcılara sahip olamazsınız.

Ek kapsayıcı gereksinimleri

Linux tabanlı kapsayıcılar aşağıdaki gereksinimlere sahiptir. Geçici çözümler için bkz . Nonglibc tabanlı kapsayıcılar.

  • Bash yüklendi
  • GNU C Kitaplığı (glibc) tabanlı
  • Hayır ENTRYPOINT
  • ve diğer ayrıcalıklı komutlaragroupadd, kullanmadan erişim sağlama USERsudo
  • Aracının sağladığı Node.js çalıştırabilir

    Not

    Node.js, Windows konaklarında Linux kapsayıcıları için önceden yüklenmiş olmalıdır.

Özellikle Alpine Linux tabanlı kapsayıcılar olmak üzere Docker Hub'da bulunan bazı kaldırılmış kapsayıcılar bu gereksinimleri karşılamaz. Azure Pipelines ile kapsayıcılar ENTRYPOINT docker create çalışmayabilir ve docker exec kapsayıcının her zaman çalışır durumda olmasını bekler.

Tek iş örnekleri

Aşağıdaki örnekler tek bir iş için bir Windows veya Linux kapsayıcısı tanımlar.

Aşağıdaki basit örnek bir Linux kapsayıcısını tanımlar:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Yukarıdaki örnek sisteme Docker Hub'dan etiketlenen 18.04 görüntüyü getirmesini ubuntu ve ardından kapsayıcıyı başlatmasını söyler. komutu printenv kapsayıcı içinde ubuntu:18.04 çalışır.

Birden çok iş

Kapsayıcıları kullanarak aynı adımı birden çok işte çalıştırabilirsiniz. Aşağıdaki örnek, Ubuntu Linux'un birden çok sürümünde aynı adımı çalıştırır. Yalnızca tek bir iş tanımlandığından anahtar sözcüğünden jobs bahsetmeniz gerekmez.

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

Tek bir aracı konağı üzerinde aracı havuzları olan birden çok iş

Kapsayıcı işi, görüntü kayıt defteri yetkilendirmesi için temel konak aracısının Docker yapılandırma dosyasını kullanır. Bu dosya, Docker kayıt defteri kapsayıcısı başlatma işleminin sonunda oturumu kapattırır. Paralel çalışan başka bir iş Docker yapılandırma dosyasının oturumunu kapattığı için sonraki kapsayıcı işleri için unauthorized authentication kayıt defteri görüntüsü çekme işlemleri reddedilebilir.

Çözüm, barındırılan aracıda çalışan her aracı havuzuna özgü bir Docker ortam değişkeni DOCKER_CONFIG ayarlamaktır. Her aracı havuzunun DOCKER_CONFIG runsvc.sh betiğindeki dosyasını aşağıdaki gibi dışarı aktarın:

export DOCKER_CONFIG=./.docker

Başlangıç seçenekleri

Aşağıdaki örnekte olduğu gibi kapsayıcı başlatmasını denetlemek için belirtebilirsiniz options :

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

steps:
- script: echo hello

Çalıştırma docker create --help , Docker çağrısına geçirebileceğiniz seçeneklerin listesini verir. Bu seçeneklerin tümünün Azure DevOps ile çalışacağı garanti değildir. Aynı hedefe ulaşmak için bir container özelliği kullanıp kullanamadığını görmek için önce denetleyin.

Daha fazla bilgi için Azure DevOps YAML şema başvurusundaki docker create komut başvurusuna ve resources.containers.container tanımına bakın.

Yeniden kullanılabilir kapsayıcı tanımı

Aşağıdaki örnek, bölümündeki kapsayıcıları resources tanımlar ve sonra atanan diğer adlarıyla bunlara başvurur. Anahtar jobs sözcüğü netlik için açıkça listelenmiştir.

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

Hizmet uç noktaları

Kapsayıcıları genel Docker Hub'dan başka kayıt defterlerinde barındırabilirsiniz. Azure Container Registry'de veya özel Docker Hub kayıt defteri de dahil olmak üzere başka bir özel kapsayıcı kayıt defterinde görüntü barındırmak için, kayıt defterine erişmek için bir hizmet bağlantısı ekleyin. Ardından kapsayıcı tanımında uç noktaya başvurabilirsiniz.

Özel Docker Hub bağlantısı:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

Azure Container Registry bağlantısı:

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

Not

Amazon ECR, AWS kimlik bilgilerini Docker'ın kimlik doğrulaması için kullanabileceği bir şeye dönüştürmek için diğer istemci araçları gerektirdiği için Azure Pipelines, Amazon Elastic Container Registry (ECR) için hizmet bağlantısı kuramaz.

Glibc tabanlı olmayan kapsayıcılar

Azure Pipelines aracısı, görevleri ve betikleri çalıştırmak için gereken Node.js bir kopyasını sağlar. Barındırılan bir aracı için Node.js sürümünü öğrenmek için bkz . Microsoft tarafından barındırılan aracılar.

Node.js sürümü genellikle glibc olarak barındırılan bulutta kullanılan C çalışma zamanına göre derlenmektedir. Bazı Linux varyantları diğer C çalışma zamanlarını kullanır. Örneğin Alpine Linux musl kullanır.

Glibc tabanlı olmayan bir kapsayıcı kullanmak istiyorsanız şunları yapmanız gerekir:

  • Kendi Node.js kopyanızı sağlayın.
  • Görüntünüze, aracıya Node.js ikili dosyasını nerede bulacağını söyleyen bir etiket ekleyin.
  • Azure Pipelines'ın bağımlı olduğu diğer bağımlılıkları sağlayın: bash, sudo, whichve groupadd.

Kendi Node.js sağlayın

Glibc tabanlı olmayan bir kapsayıcı kullanıyorsanız kapsayıcınıza Node ikili dosyası eklemek sizin sorumluluğunuzdadır. Node.js 18 güvenli bir seçimdir. Görüntüden node:18-alpine başlayın.

Aracıya Node.js hakkında bilgi ver

Aracı kapsayıcı etiketini "com.azure.dev.pipelines.handler.node.path"okur. Bu etiket varsa, Node.js ikili dosyasının yolu olmalıdır.

Örneğin, tabanlı node:18-alpinebir görüntüde Dockerfile'ınıza aşağıdaki satırı ekleyin:

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

Gerekli paketleri ekleme

Azure Pipelines, yaygın yönetim paketlerinin yüklü olduğu Bash tabanlı bir sistem olduğunu varsayar. Alpine Linux özellikle gerekli paketlerin birkaçı ile birlikte gelmez. Temel gereksinimleri karşılamak için , sudove shadow yükleyinbash.

RUN apk add bash sudo shadow

Kutu içi veya Market görevlerine bağımlıysanız, bunların gerektirdiği ikili dosyaları da sağlayın.

Tam Dockerfile örneği

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