Jenkinsfile'da yerel olarak yapılan bir değişikliği nasıl test edebilirim?


210

Jenkins boru hatları yazarken, çalışıp çalışmadığını görmek için her yeni değişikliği taahhüt etmek çok zordur.

Kodu taahhüt etmeden bunları yerel olarak yürütmenin bir yolu var mı?

Yanıtlar:


139

Pipeline betiğini yerel olarak çalıştıramazsınız, çünkü tüm amacı Jenkins'i betiğe yazmaktır. (Bu, Jenkinsfilekısa ve gerçekte Jenkins özellikleriyle ilgili kodla sınırlı kalmanın en iyi nedenlerinden biridir ; gerçek oluşturma mantığınız, bir satır shveya batadımla çağırdığınız harici süreçlerle veya oluşturma araçlarıyla ele alınmalıdır .)

Bir değişikliği Jenkinsfileyaşamak için test etmeyi ancak taahhüt etmeden test etmek istiyorsanız , 1.14'te eklenen Tekrar Oynat özelliğini kullanın

JENKINS-33925 , otomatik test çerçevesi için istenenleri izler.


Blog yayını bir 'tekrar oynat' düğmesi olduğunu söylüyor. Nerede bir fikrin var mı? Onu bulamýyorum.
BoltzmannBrain

8
@BoltzmannBrain, yapım işinizin Jenkins sayfasına gidin. Sol tarafta önceki derleme çalışmalarının listesini görmelisiniz. Bir yapı çalışma kimliğinin (örneğin "# 123") veya bir yapı çalışmasının tarihinin üzerine geldiğinizde, küçük bir aşağı ok görünür. Üzerine tıklandığında "Tekrar Oynat" seçeneğine sahip bir bağlam menüsü görünür. Bu seçenek ayrıca bir derleme çalıştırması sayfasında da bulunur.
İyi Geceler Nerd Pride

2
Concourse, yerel komut dosyalarınızı bir hedef oluşturma sunucusuna karşı yürütmenize izin verir, böylece değişikliklerinizi gerçekleştirmeden önce uzak sunucuda da çalışacağını doğrulayabilirsiniz. concourse.ci/fly-cli.html . Jenkins tekrar oynatma özelliği buna bir ölçüde benzerdir, ancak sınırlamaları vardır ve tekrar oynatmak için önce bir yapı oluşturmanız gerekir.
mdo123

2
Aradığınızı sağlamayı amaçlayan bu projeye bir göz atabilirsiniz .
Romain

1
JenkinsPipelineUnit'e bir göz atın ( github.com/jenkinsci/JenkinsPipelineUnit )
user864279

78

Benim için iyi çalışan bir çözümüm var. Docker'da çalışan bir yerel jenkinlerden ve her taahhütte yerel jenkinlerde boru hattını tetiklemek için bir git web kancasından oluşur. Boru hattını test etmek için artık github veya bitbucket deponuza itmeniz gerekmiyor.

Bu yalnızca linux ortamında test edilmiştir.

Bu talimat biraz uzun olsa da, bu işi yapmak oldukça basittir. Çoğu adım orada.

İhtiyacın olan şey bu

  • Docker kurulu ve çalışıyor. Bu, bu talimatın bir parçası değildir.
  • Docker'da yerel olarak çalışan bir Jenkins. Aşağıda nasıl açıklandığı.
    • Yerel Jenkins docker kullanıcınızın yerel git deponuzdan alması için uygun haklar (ssh erişim anahtarı). Aşağıda nasıl açıklandığı.
    • Yerel git deponuzdan alan bir Jenkins boru hattı projesi. Aşağıda açıklanmıştır.
    • Yerel Jenkins'inizde minimum haklara sahip bir git kullanıcısı. Aşağıda açıklanmıştır.
  • Boru hattı projesini tetikleyen taahhüt sonrası web kancalı bir git projesi. Aşağıda açıklanmıştır.

Bunu böyle yapıyorsun

Jenkins Docker

Seçtiğiniz yerine Dockerfile adlı bir dosya oluşturun. Bunu bununla /opt/docker/jenkins/Dockerfiledolduruyorum:

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins

Local_jenkins resmini oluşturun

Bunu Dockerfile'a bir şey ekledikten sonra veya yalnızca bir kez yapmanız gerekir.

$ docker build -t local_jenkins /opt/docker/jenkins/

Local_jenkins'i başlatın ve yeniden başlatın

Zaman zaman jenkinleri kolayca başlatmak ve yeniden başlatmak istersiniz. Örneğin, makinenizi yeniden başlattıktan sonra. Bunun için .bash_aliasesana klasöre koyduğum bir takma ad yaptım .

$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases  # To make it work

/opt/docker/jenkins/jenkins_homeKlasörün var olduğundan ve kullanıcının okuma ve yazma haklarına sahip olduğunuzdan emin olun .

Jenkinlerinizi başlatmak veya yeniden başlatmak için şunu yazın:

$ localjenkinsrestart

Yerel jenkinlerinizde yaptığınız her şey / opt / docker / jenkins / jenkins_home klasöründe saklanır ve yeniden başlatmalar arasında korunur.

Docker cenkins'inizde bir ssh erişim anahtarı oluşturun

Bunun çalışması için bu çok önemli bir parçadır. İlk olarak liman işçisi konteynerini başlatıyoruz ve ona bir bash kabuğu yaratıyoruz:

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

Artık docker konteynerine girdiniz, bu jenkins@e7b23bad10aa:/$terminalinizdeki gibi bir şeyle görebilirsiniz . @ 'Den sonraki karma kesinlikle farklı olacaktır.

Anahtarı oluşturun

jenkins@e7b23bad10aa:/$ ssh-keygen

Soruyu geri alana kadar tüm sorularda enter tuşuna basın

Anahtarı bilgisayarınıza kopyalayın. Docker konteynerinin içinden merak ediyorsanız bilgisayarınız 172.17.0.1'dir.

jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1

user = kullanıcı adınız ve 172.17.0.1, docker konteyneri içinden bilgisayarınızın ip adresidir.

Bu noktada şifrenizi yazmanız gerekecektir.

Şimdi docker konteynerinden bilgisayarınıza ssh yaparak döngüyü tamamlamaya çalışalım.

jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1

Bu sefer şifrenizi girmeniz gerekmez. Bunu yaparsanız, bir şeyler ters gitti ve tekrar denemeniz gerekiyor.

Artık bilgisayarların giriş klasöründe olacaksınız. Deneyin lsve bir göz atın.

Dışarı çıkmamız gereken bir ssh kabuğu zincirimiz olduğu için burada durmayın.

$ exit
jenkins@e7b23bad10aa:/$ exit

Sağ! Şimdi geri döndük ve devam etmeye hazırız.

Jenkins'inizi kurun

Yerel Jenkins'inizi tarayıcınızda http: // localhost: 8787 adresinde bulabilirsiniz .

Tarayıcınızı yerel Jenkins'e ilk yönlendirdiğinizde, bir Kurulum Sihirbazı ile büyüleneceksiniz. Varsayılanlar iyi, kurulum sırasında boru hattı eklentisini yüklediğinizden emin olun.

Cenkins'inizi kurun

Öyle çok önemli üzerinde matris esaslı güvenlik aktive olduğunu // localhost: 8787 / configureSecurity http ve kendinizi tüm haklarını vermek matrise kendinizi ekleyerek ve tüm kutuları işaretleyin. (En sağda bir onay kutuları simgesi vardır)

  • Jenkins’ own user databaseGüvenlik Bölgesi olarak seçin
  • Matrix-based securityYetkilendirme bölümünde seçin
  • Kullanıcı adınızı alana yazın User/group to add:ve [ Add ]düğmesini tıklayın
  • Yukarıdaki tabloda kullanıcı adınızın yanında bir kişi simgesi görünmelidir. Üzerinden geçilirse, kullanıcı adınızı yanlış yazdınız.
  • Tablonun en sağına gidin ve tümünü işaretle düğmesini tıklayın veya satırınızdaki tüm kutuları manuel olarak işaretleyin.
  • Lütfen onay kutusunun Prevent Cross Site Request Forgery exploitsişaretli olmadığını doğrulayın . (Bu Jenkins sadece bilgisayarınızdan ulaşılabilir olduğu için bu çok önemli değil)
  • Tıklayın [ Save ]ve Jenkins'in çalıştığından emin olmak için tekrar oturum açın. Yoksa, /opt/docker/jenkins/jenkins_homeyeniden başlatmadan önce baştan başlamanız ve klasörü boşaltmanız gerekir.

Git kullanıcısını ekle

Git kancalarımızın yerel Jenkins'e minimum haklarla giriş yapmasına izin vermeliyiz. Sadece iş görmek ve inşa etmek yeterlidir. Bu nedenle gitşifre ile adlandırılan bir kullanıcı oluşturuyoruz login.

Tarayıcınızı http: // localhost: 8787 / securityRealm / addUser adresine yönlendirin ve gitkullanıcı adı ve loginşifre olarak ekleyin . Tıklayın [ Create User ].

Git kullanıcısına hak ekleme

Git http: // localhost: 8787 / configureSecurity sayfasını tarayıcınızda. Git kullanıcısını matrise ekleyin:

  • gitAlana yazın User/group to add:ve tıklayın[ Add ]

Şimdi git kullanıcısı için minimum haklar için kutuları işaretlemenin zamanı geldi. Sadece bunlar gereklidir:

  • Genel: okuma
  • iş: build
  • iş: keşfetmek
  • iş: okumak

Prevent Cross Site Request Forgery exploitsOnay kutusunun işaretli olmadığından emin olun ve tıklayın[ Save ]

Boru hattı projesi oluşturma

Kullanıcı adının userve git etkin projemizin Jenkinsfileiçinde çağrıldığını projectve/home/user/projects/project

Reklamlara http: // localhost: 8787 Jenkins yeni boru hattı projesi ekleyin. Referans için hookpipeline adını verdim.

  • New ItemJenkins menüsünde tıklayın
  • Projeye bir ad verin hookpipeline
  • Boru Hattına tıklayın
  • Tıklayın [ OK ]
  • Poll SCMOluşturma Tetikleyicileri bölümündeki onay kutusunu işaretleyin . Programı boş bırakın.
  • Boru Hattı bölümünde:
    • seçmek Pipeline script from SCM
    • içinde Repository URLalana girmekuser@172.17.0.1:projects/project/.git
    • içinde Script Pathalana girmekJenkinsfile
  • Hookpipeline projesini kaydedin
  • Hookpipeline'ı bir kez manuel olarak oluşturun, Anket SCM'nin çalışmaya başlaması için bu gereklidir.

Git kancasını oluştur

/home/user/projects/project/.git/hooksKlasöre gidin ve aşağıdakileri post-commitiçeren bir dosya oluşturun :

#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'

curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"

Bu dosyayı yürütülebilir yap:

$ chmod +x /home/user/projects/project/.git/hooks/post-commit

İşlem sonrası kancasını test edin:

$ /home/user/projects/project/.git/hooks/post-commit

Hookpipeline projenizin tetiklenip tetiklenmediğini Jenkins'te kontrol edin.

Son olarak projenizde keyfi bir değişiklik yapın, değişiklikleri ekleyin ve bir taahhütte bulunun. Bu artık yerel Jenkins'teki boru hattını tetikleyecektir.

Mutlu günler!


Ben değiştirmek zorunda docker build -t local_jenkins /opt/docker/jenkins/Dockerfileolan docker build -t local_jenkins /opt/docker/jenkins": bağlam bir dizin olmalıdır bağlamı hazırlamak mümkün" Docker şikayet çünkü.
Etienne Neveu

1
Mac'te bu hatayı alıyorum. Birisi bana bu konuda yardımcı olabilir mi? >> HATA: ssh: sunucuya bağlan 172.17.0.1 port 22: Bağlantı reddedildi -
Manoj Shrestha

@ManojShrestha: ip 172.17.0.1, liman işleyici kaplarını çalıştıran makinenin varsayılan ipidir. Bunun yerine makinelerinizi (MAC: s) ip kullanabilirsiniz.
javabeangrinder

@ManojShrestha: Ayrıca kurulumunuzun ağ geçidi ipini şu şekilde bulmayı deneyebilirsiniz:$ docker inspect jenkins | grep Gateway
javabeangrinder

2
Docker ana makineniz macOS'a yüklüyse ve docker kapsayıcısından oturum açmak istiyorsanız ssh user@docker.for.mac.localhost , IP adresini kullanmak yerine. Ayrıca macOs Sistem Tercihleri ​​-> Paylaşımlı Klasör menüsünden Uzaktan Giriş özelliğini etkinleştirdiğinizden emin olun
Paolo Angioletti

61

TL; DR

Uzun Versiyon
Jenkins Boru Hattı testi gittikçe daha fazla acı çekiyor. Kullanıcının, kullanıcı arayüzünün yeni kullanıcı arayüzüne maruz kaldığı şeylerle sınırlı olduğu klasik bildirim işi yapılandırma yaklaşımının aksine, bildirim parçasını kendi kodunuzla karıştırdığınız oluşturma işlemi için tam teşekküllü bir programlama dilidir. İyi geliştiriciler olarak biz de bu tür kodlar için bazı birim testleri yapmak istiyoruz.

Jenkins Boru Hatları geliştirirken izlemeniz gereken üç adım vardır. Adım 1. kullanımları vakaların% 80 kapsamalıdır.

  1. Derleme komut dosyalarında mümkün olduğunca yapın (örn. Maven, Gradle, Gulp vb.). Daha sonra boru hattı komut dosyalarınızda derleme görevlerini doğru sırayla çağırır. Yapı hattı sadece yapı görevlerini düzenler ve yürütür, ancak özel bir sınama gerektiren önemli bir mantığı yoktur.
  2. Önceki kural tam olarak uygulanamıyorsa , özel mantığı kendi başınıza geliştirip test edebileceğiniz ve bunları boru hattına entegre edebileceğiniz Boru Hattı Paylaşılan kitaplıklarına geçin .
  3. Yukarıdakilerin tümü başarısız olursa, yakın zamanda gelen kütüphanelerden birini deneyebilirsiniz (Mart-2017). Jenkins Boru Hattı Birimi test çerçevesi veya boru hattı Birimi (örnekler). 2018'den beri Jenkins boru hatlarını bir komut satırı aracından yürütmek için bir paket olan Jenkinsfile Runner da var .

Örnekler

PipelineUnit GitHub Repo nasıl kullanılacağına ilişkin bazı Spock örnekler içermektedir Jenkins Boru Hattı Ünitesi test çerçeve


1
Bu iki kütüphanenin kısa bir karşılaştırmasını da ekleyebilir misiniz?
sorin

24

Jenkins, bir işi kaynakları güncellemeden hızlı bir şekilde tekrar oynatmanızı sağlayan bir 'Tekrar Oynat' özelliğine sahiptir:

Tekrar oynatma özelliği


1
Proje veya şube sayfasında değil derleme sayfasında göründüğünü unutmayın.
ArtOfWarfare

17

Blue Ocean eklentisi ile yazıldığınızda (Temmuz 2017 sonu) , açıklayıcı bir boru hattının sözdizimini doğrudan görsel boru hattı düzenleyicisinden kontrol edebilirsiniz . Editör, sadece github projeleri için "yapılandır" ı tıkladığınızda Blue Ocean UI'den çalışır (bu bilinen bir konudur ve git vb üzerinde de çalışmasını sağlamak için çalışmaktadır).

Ancak, bu soruda açıklandığı gibi, aşağıdakilere göz atarak düzenleyiciyi açabilirsiniz:

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

Ardından sayfanın ortasına tıklayın ve düğmesine basın Ctrl+S, bu bir boru hattı bildirim komut dosyası yapıştırabileceğiniz bir metin alanı açar. Güncelle'yi tıkladığınızda , bir sözdizimi hatası varsa, editör sözdizimi hatasının nerede olduğunu size bildirir. Bu ekran görüntüsünde olduğu gibi:

Hızlı bir test olarak yanlış "adımlar" yerine "stepler" yazdım

Sözdizimi hatası yoksa, metin alanı kapanacak ve sayfa ardışık düzeninizi görselleştirecektir. Endişelenmeyin, hiçbir şey kurtaramaz (bir github projesi ise Jenkinsfile değişikliğini yapar).

Jenkins için yeniyim ve bu oldukça yararlı, bu olmadan bir Jenkinsfile işe yarayana kadar (çok can sıkıcı!). Bu yardımcı olur umarım. Şerefe.


2
Bunun nedeni, 2017 itibariyle Jenkins'in hala tıkla ve tıkla yazılım mühendislerinin sorunlarını ele almayı hedeflemesi;) .... En azından Atom'un iyi bir Groovy linter'i var. Sadece harika ama yardımcı olur.
sorin

Sözdizimi vurgulamalı editör de klasik jenkins kullanıcı arayüzünün bir parçasıdır.
Vadimo

6

Partiye biraz geç kaldım, ama bu yüzden yazdım jenny, bazı temel Jenkinsfile adımlarının küçük bir yeniden uygulanması. ( https://github.com/bmustiata/jenny )


Hiçbir suç, ama sürekli olarak şeyler güncelleme sürece boru hattı sözdizimi sürekli bir akış halinde olduğu için oldukça yararsız olacaktır şu anda görünüyor.
krad

Alınmadı. Şimdiye kadar gördüğüm kadarıyla, boru hattı sözdizimi, temel boru hattı adımları ( jenkins.io/doc/pipeline/steps/workflow-basic-steps ) için hemen hemen standartlaştırılmıştır . ~ 2 yıl boyunca, geriye dönük uyumsuz değişikliklerle karşılaşmadan kullanıyorum. Jenkins eklentileri imho kullanılmamalıdır ve değişen API, API garantilerine sahip olacağınız paylaşılan kütüphanelerdeki özel komutlar kullanılarak soyutlanabilir. Açıklayıcı sözdiziminden bahsediyorsanız, bu doğru olabilir. Boru hatlarımda yalnızca programlı API kullanıyorum ve Jenny'nin desteklediği de bu. Rock solid :)
bogdan.mustiata

5

Bildiğim kadarıyla bu Boru Hattı Eklentisi yeni Jenkinsfile mekaniğinin "Motoru", bu yüzden komut dosyalarınızı yerel olarak test etmek için bunu kullanabileceğinizden oldukça olumluyum.

Bir Jenkinsfile içine kopyalarken gerekli herhangi bir ek adım olup olmadığından emin değilim, ancak sözdizimi vb tam olarak aynı olmalıdır.

Düzenleme: "Motor" referans bulundu, bu özellik açıklamasını, son paragraf, ilk giriş kontrol edin .


5

Geliştirme kurulumumda - uygun bir Groovy editörü eksik - büyük miktarda Jenkinsfile sorunları basit sözdizimi hatalarından kaynaklanıyor . Bu sorunu çözmek için Jenkinsfile dosyasını Jenkins örneğinize göre (adresinde çalışarak) doğrulayabilirsiniz $JENKINS_HTTP_URL:

curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate

Yukarıdaki komut https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line adresinden biraz değiştirilmiş bir sürümüdür.


4
Bu sadece aradığım şey - maalesef sadece bildirim amaçlı boru hatları için çalışıyor ve senaryolu boru hatları için değil :(
thom_nic

2

Başkalarının daha önce bahsettiği Replay özelliğinin yanı sıra (yararlılığına da değinir!) Aşağıdakileri de yararlı buldum:

  1. Pipeline kodunu yazabileceğiniz veya bir şeyi hızlı bir şekilde test etmek için bir Jenkinsfile repo / şubenizi gösterebileceğiniz bir test Pipeline işi oluşturun. Daha doğru testler için, kendi çatalınıza işaret eden ve ürünü etkilemeden hızlı bir şekilde değişiklik yapabileceğiniz ve taahhütte bulunabileceğiniz Çok Bölmeli Boru Hattı kullanın. BRANCH_NAME env gibi şeyler yalnızca Multibranch'ta kullanılabilir.
  2. Jenkinsfile Groovy kodu olduğundan, basit sözdizimini doğrulamak için basitçe "groovy Jenkinsfile" ile çağırın.

Gizleyebileceğiniz ve kullanıcılarınızı şaşırtmayacağınız ayrı işleri kullanmak en önemli şeylerden biridir. Jenkins dosyalarını IntelliJ ile düzenlerim. Sözdizimi hatalarını göstermek oldukça iyidir. Ancak, cevap düğmesi anahtar şeydir. Ben temel değişiklik çalıştırmak ile bir şube oluşturmak - genellikle biraz yanlış gidiyor. Daha sonra Jenkinsfile düzenlemek ve kopya ve Replay penceresine yapıştırın ve tekrar çalıştırın - Tamam çalışana kadar bu işlemi tekrarlayın ve sonra çalışma sürümünü taahhüt.
johnfo

2

SSH anahtarınızı Jenkins profilinize yerleştirin, ardından bildirim amaçlı linter'i aşağıdaki gibi kullanın :

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

Bu Jenkinsfile üzerinde statik bir analiz yapacak. İstediğiniz düzenleyicide, bu komutu otomatik olarak çalıştıran bir klavye kısayolu tanımlayın. Kullandığım olan Visual Studio Code'da, Görevler> Görevleri Yapılandır'a gidin, ardından bir Doğrula Jenkinsfile komutu oluşturmak için aşağıdaki JSON'u kullanın:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}

0

bazı güncelleme yapmak ve hızlı bir şekilde çalıştırmak için tekrar gelecek kullanıyorum.


1
Bu işi nasıl yaptığınız hakkında biraz daha bilgi verebilir misiniz?
kosnik

1
Kaynak yöneticisi olarak Bit-bucket kullanıyorum, sonra Jenkins üzerinde otomatik olarak depomu keşfetmek dilek üzerinde bir proje oluşturduk, bu yazıyı tavsiye ederim. Repo'mdaki her basıştan sonra Jenkins otomatik olarak Jenkins dosyamı oynatır ve başarısız olursa, soldaki menüde Yeniden Oynat, ==> Bu düğme Jenkins dosyanızı içeren bir düzenleyici açar, düzenleyebilir ve işi tekrar oynatabilirsiniz ,
AhmedDrira

0

Bazı sınırlamalarla ve kodlanmış boru hatları için bu çözümü kullanıyorum:

  1. Satır içi harika bir betik ile boru hattı işi:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. Test için Jenkinsfile, lesfuretler ile aynı yapıya sahiptir:

def execute() {
 ... main job code here ...
}
execute()
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.