Jenkins'ten Docker kapsayıcılarında derlemeler nasıl çalıştırılır


18

Jenkins Docker kapsayıcısında bir C ++ projesi oluşturmak için kullanmaya çalışıyorum. Jenkins'te ya da Jenkins dışında bir kapta inşa etmekte sorun yaşamıyorum.

Aşağıda denedim. Netlik için cilt haritalamasını atlıyorum.

Dava 1

Aşağıdaki komut, bir kabukta bir derlemeyi başarıyla çalıştırır.

docker run --rm --interactive=true --tty=true $IMAGE make

Ancak Jenkins "kabuk yürütme" adımı olarak çalıştırıldığında Docker aşağıdaki hatayı döndürür.

cannot enable tty mode on non tty input

Durum 2

Aşağıdaki komut öncekine benzer ancak etkileşimi devre dışı bırakır.

docker run --rm $IMAGE make

Jenkins bir yapıyı başarıyla çalıştırabilir. Ancak bir yapıyı iptal ederken ciddi sorunlar var. Derleme derhal durduruldu olarak işaretlenir, ancak derleme tamamlanıncaya kadar kap çalışmaya devam eder. Ayrıca kap olup olmayan çıktıktan sonra çıkarıldı.

Bir kabukta çalıştırıldığında komut başarılı bir şekilde oluşturulur ancak kesilmesi mümkün değildir. Ayrıca kap çıktıktan sonra çıkarılır.

Soru

Jenkins'ten Docker kapsayıcılarında derlemeleri nasıl temizleyeceğini ve derlemeleri iptal etme özelliğini nasıl koruyacağını bilen var mı?

Docker çağrıları komut dosyalarının içinde olduğundan ve kolayca çıkarılamadığından Jenkins eklentilerinden herhangi birini kullanmak bir seçenek değildir.


1
Belki de görevi konteyneri kaldırmak olan bir post-build işi ile? Ve bir yapıyı iptal ettiğiniz durumlarda, belki de tüm sahte kapları durduran ve kaldıran özel bir yapınız olabilir mi? Bu yetersizdir, ancak en azından, kurulumu kolay bir çözümdür. :-)
lgeorget

1
Bu benim temiz tanımımla tam olarak eşleşmiyor :) Ama öneriyi takdir ediyorum ve kesinlikle geçerli bir çözüm.
marcv81

Yanıtlar:


3

Docker yapılarınızı Jenkins'te çalıştırmanın en kolay yolu boru hattı işini kullanmaktır. Docker ortamınızı ve kaplarınızı kontrol edebilecek birçok dahili eklentiye sahiptir.

birkaç örnek

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

Daha fazla bilgi için: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

Aşağıdaki iş akışını uygulayabilirsiniz:

  1. bir liman işçisi konteyneri oluşturun ve kolayca başvurabileceğiniz bir ad belirtin (örn. komut dosyalarında)
  2. başlatın ve kabın çalışmasını sağlayan bir şey giriş noktası olarak kullanın
  3. docker exec container cmd ...Derleme ve test komutlarınızı vermek için kullanın
  4. Kabı durdurun
  5. Görüntüyü kaldır

docker exec ...Bir ağ makine için bir uzak kabuk erişimi gibidir. Varsayılan olarak etkileşimli değildir ve ayrıca bir tty ayırmaz. Test paketlerinin derlenmesi ve yürütülmesi için bu iyi olmalıdır. Komut, kap içinde yürütülen komutun çıkış durumunu düzgün bir şekilde iletir.

Bir oluşturma işi daha sonra şu yolla iptal edilebilir:

  • docker stop container (TERM ve KILL gönderir ve arada bekler), veya
  • docker kill container, ya da
  • docker exec container pkill someexecutable

Somut komutlarla iş akışı:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

Bu iş akışını kullanan bir gerçek Örneğin, bu bakabilirsiniz .travis.yml , dosyanın asıl CI komut dosyalarını , konteyner içinde çalışan komut ve liman işçisi dosyalarının Kullanılan görüntülerin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.