Jenkins konumundaki ihracat / ithalat işleri


268

2 farklı Jenkins 'arasında iş alışverişi yapmak mümkün mü? İşleri dışa / içe aktarmanın bir yolunu arıyorum.


2
Doğrudan sorunuzun yanıtı değil, bazı en iyi uygulamalar: İş yapılandırmanızı Jenkins Pipeline DSL ile yazmaya çalışın ve projelerinizin depolarının bir parçası haline getirin. Bu şekilde, işler bir Jenkins sunucusundan diğerine kolayca taşınabilir. Bkz. Github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs

En üzerinden Bazı tavsiyeler stackoverflow.com/questions/38585734/... yanı
Ben Creasy

Yanıtlar:


154

CI yazılımında yeni olduğunuzda okumak zor olsa da Jenkins'in oldukça iyi bir wiki'si var ...

İşleri sunucular arasında taşımak için basit bir çözüm sunar

Hile muhtemelen yapılandırmayı Jenkins Yapılandırma Sayfasından yeniden yüklemeye ihtiyaç duyuyordu.

Güncelleme 2020.03.10

JenkinsCI manzarası çok değişti ... Bir süredir Job DSL kullanıyorum . Geri kalan işleri üreten bir SEED Job'umuz var.

Bu, gerektiğinde Jenkins sunucusunu hem yeniden oluşturmamıza hem de taşımamıza yardımcı olur :) Ayrıca bu dosyaları daha da sürdürülebilirlik için sürümlendirebilirsiniz!


22
Yani jenkinlerin kurulu olduğu sisteme erişmeniz mi gerekiyor? Yani bu normal kullanıcılar için bir cevap değil.
Wouter Schut

Onaylandı, belgenin söylediklerini uyguladıktan sonra Jenkins'i yeniden yüklemeniz gerekiyor.
Miguel Ortiz

180

Muhtemelen jenkins komut satırını kullanmak başka bir seçenektir, bkz. Https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: Stdin'i yapılandırma XML dosyası olarak okuyarak yeni bir iş oluşturur.
  • get-job: İş tanımı XML'sini stdout'a döker

Böylece yapabilirsin

java -jar jenkins-cli.jar -s http://server get-job myjob > myjob.xml
java -jar jenkins-cli.jar -s http://server create-job newmyjob < myjob.xml

Benim için iyi çalışıyor ve sürüm kontrol sistemimin içinde depolamaya alışkınım


3
Bunun çalışması için eski sunucunuzdaki, yeni sunucunuzdaki ve yerel makinenizdeki java'nın aynı sürümde olması gerekir. Aksi takdirde, garip akış / sürüm sorunları ortaya çıkar. Jnlp portlarınızın da açık olması gerekir.
MaratC

CLI müşteriye Tam yoldur JENKINS_HOME / savaş / WEB-INF JENKINS_HOME JENKINS_HOME konumudur / Jenkins-cli.jar
Rob Kielty

1
Bu yöntem, XML'de çıplak Groovy kodunuz olduğunda & gibi çıplak çıplak ve işaretleri ile ilgili sorunlara sahiptir.
Rob Kielty

dışa aktarılan XML'deki kodlanmamış ve işaretleri, Aktif Seçim Eklentisi (seçimsiz) parametrelerini destekleyen Groovy kodunda oluşabilir; yapabilirsem çözüm sunacak.
Rob Kielty

1
@ info_interchange tam olarak aşağıdaki cevabımda önerildiği gibi.
MaratC

151

Bir astar:

$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

Kimlik doğrulaması ile:

$ curl -s http:///<USER>:<API_TOKEN>@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http:///<USER>:<API_TOKEN>@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

Crumb ile CSRF etkinse ( ayrıntılara bakın ):

İle kırıntı alın:

$ CRUMB_OLD=$(curl -s 'http://<USER>:<API_TOKEN>@OLD_JENKINS/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
$ CRUMB_NEW=$(curl -s 'http://<USER>:<API_TOKEN>@NEW_JENKINS/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')

Kırıntıyı aşağıdakilerle uygulayın -H CRUMB:

$ curl -s -H $CRUMB_OLD http:///<USER>:<API_TOKEN>@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST -H $CRUMB_NEW 'http:///<USER>:<API_TOKEN>@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

1
Çalışmak için kimlik doğrulama jetonlarına ihtiyacınız var, ancak çelik harika bir iş!
Viroide

7
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | curl -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createItem? name = JOBNAME' --header "Content-Type: application / xml" -d @ - <br/> Kullanıcı API'sı anahtarını buradan al : JENKIS_URL / user / <KULLANICI> / configure > API Jetonu> Show API Jetonu
Suhas Gaikwad

1
Buna sadece bir ek katkı. Hedef sunucuya POST gönderirken büyük olasılıkla bir hata kodu alırsınız HTTP 403 Erişim / createItem sorunu. Sebep: Talebe geçerli bir kırıntı dahil edilmedi. Hedef Jenkins sunucusu için bir CSRF koruma jetonu oluşturmanız gerekir. Bu konudaki @Kenorb'un tavsiyelerine uyun: stackoverflow.com/questions/38137760/…
Mig82

2
Dosyayı almak http://OLD_JENKINS/job/JOBNAME/config.xmliçin tarayıcınızdaki bağlantıya gidebileceğiniz için curl komutlarını kullanmanıza bile gerek yok config.xml.
entpnerd

1
İhtiyacınız --data-binaryyerine -dde curl, çünkü komuta -dkudreti karışıklık senin komut boşluk yukarı.
Gabor Csardi


14

Jenkins sunucunuzun ön sayfasına gidin, sayfanın altındaki REST API'sını tıklayın:

İş Oluştur

Yeni bir iş oluşturmak için, config.xmlsorgu parametresiyle bu URL'ye gönderin name=JOBNAME. Bir Content-Type: application/xmlbaşlık göndermeniz gerekir . 200Oluşturma başarılı olursa durum kodu veya 4xx/5xxbaşarısız olursa kod alırsınız . config.xmlJenkins projeyi dosya sisteminde depolamak için kullandığı biçimdir, bu nedenle bunların örneklerini Jenkins ana dizininde veya varolan işlerin XML yapılandırmasını alarak görebilirsiniz /job/JOBNAME/config.xml.


13

Jenkins örneğimde (sürüm 1.548) yapılandırma dosyası:

/var/lib/jenkins/jobs/-the-project-name-/config.xml

644 izinli jenkins kullanıcısı ve jenkins grubuna aittir. Dosyanın buraya ve buradan kopyalanması gerekir. Doğrudan değiştirmeyi denemedim, ancak projenin tekrar kurulması gerektiğinde yapılandırmayı bu noktadan yedekledim.


1
WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond

8

İş Alma eklentisi , burada başka bir Jenkins örneğinden iş aktarmanın kolay yoludur. Kaynak Jenkins örneğinin URL'sini sağlamanız yeterlidir. Uzak Jenkins URL'si aşağıdaki URL türlerinden herhangi birini alabilir:

  • http://$JENKINS - tüm işleri uzaktan yönetim ortamına alma

  • http://$JENKINS/job/$JOBNAME - tek bir iş bul

  • http://$JENKINS/view/$VIEWNAME - tüm işleri belirli bir görünümde elde edin


6

Larry Cai'nin cevabı sayesinde tüm Jenkins işlerimi yedeklemek için bir senaryo oluşturmayı başardım. Bunu her hafta çalıştıran bir iş yarattım. Birinin yararlı bulması durumunda, işte burada:

#!/bin/bash
#IFS for jobs with spaces.
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for i in $(java -jar /run/jenkins/war/WEB-INF/jenkins-cli.jar -s http://server:8080/ list-jobs); 
do 
  java -jar /run/jenkins/war/WEB-INF/jenkins-cli.jar -s http://server:8080/ get-job ${i} > ${i}.xml;
done
IFS=$SAVEIFS
mkdir deploy
tar cvfj "jenkins-jobs.tar.bz2" ./*.xml


4

Jenkins işleri bir dizine aktarır

 #! /bin/bash
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")
    declare -i j=0
    for i in $(java -jar jenkins-cli.jar -s http://server:8080/jenkins list-jobs  --username **** --password ***);
    do
    let "j++";
    echo $j;
    if [ $j -gt 283 ] // If you have more jobs do it in chunks as it will terminate in the middle of the process. So Resume your job from where it ends.
     then
    java -jar jenkins-cli.jar -s http://lxvbmcbma:8080/jenkins get-job --username **** --password **** ${i} > ${i}.xml;
    echo "done";
    fi
    done

İşleri içe aktarma

for f in *.xml;
do
echo "Processing ${f%.*} file.."; //truncate the .xml extention and load the xml file for job creation
java -jar jenkins-cli.jar -s http://server:8080/jenkins create-job ${f%.*}  < $f
done

2

Windows dünyasında Bash'i kullanan veya olmayanlar için, Katu'nun PowerShell limanı ve Larry Cai'nin yaklaşımı. Umarım birine yardımcı olur.

##### Config vars #####
$serverUri = 'http://localhost:8080/' # URI of your Jenkins server
$jenkinsCli = 'C:\Program Files (x86)\Jenkins\war\WEB-INF\jenkins-cli.jar' # Path to jenkins-cli.jar on your machine
$destFolder = 'C:\Jenkins Backup\' # Output folder (will be created if it doesn't exist)
$destFile = 'jenkins-jobs.zip' # Output filename (will be overwritten if it exists)
########################

$work = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Force -Path $work | Out-Null # Suppress output noise
echo "Created a temp working folder: $work"

$jobs = (java -jar $jenkinsCli -s $serverUri list-jobs)
echo "Found $($jobs.Length) existing jobs: [$jobs]"

foreach ($j in $jobs)
{
    $outfile = Join-Path $work "$j.xml"
    java -jar $jenkinsCli -s $serverUri get-job $j | Out-File $outfile
}
echo "Saved $($jobs.Length) jobs to temp XML files"

New-Item -ItemType Directory -Force -Path $destFolder | Out-Null # Suppress output noise
echo "Found (or created) $destFolder folder"

$destPath = Join-Path $destFolder $destFile
Get-ChildItem $work -Filter *.xml | 
    Write-Zip -Level 9 -OutputPath $destPath -FlattenPaths |
    Out-Null # Suppress output noise
echo "Copied $($jobs.Length) jobs to $destPath"

Remove-Item $work -Recurse -Force
echo "Removed temp working folder"

2

Eklenti adını indirmek çok kolay

İş Alma Eklentisi

Uzak Jenkins sunucunuzun URL'sini girin, işleri otomatik olarak alır


1
Bu bazıları için işe yarayabilir, ama benim için değil. Bu yalnızca yeni Jenkins örneğinin eski Jenkins örneğine doğrudan erişimi varsa çalışır. Benimki iki farklı ağdaydı.
Justin Domnitz

1

Basit php betiği benim için çalıştı.

İhracat:

// add all job codes in the array
$jobs = array("job1", "job2", "job3");

foreach ($jobs as $value)
{
    fwrite(STDOUT, $value. " \n") or die("Unable to open file!");
    $path = "http://server1:8080/jenkins/job/".$value."/config.xml";
    $myfile = fopen($value.".xml", "w");
    fwrite($myfile, file_get_contents($path));
    fclose($myfile);
}

İthalat:

<?php

// add all job codes in the array
$jobs = array("job1", "job2", "job3");

foreach ($arr as $value)
{
    fwrite(STDOUT, $value. " \n") or die("Unable to open file!");
    $cmd = "java -jar jenkins-cli.jar -s http://server2:8080/jenkins/ create-job ".$value." < ".$value.".xml";
    echo exec($cmd);
}


1

Makineye doğrudan erişimle en kolay yol, iş klasörünü ilk cenkinden diğerine kopyalamaktır (çalışma alanlarını hariç tutabilirsiniz - workspace klasörü ), çünkü tüm iş yapılandırması diskteki xml dosyasında saklanır.

Sonra yeni jenkinlerde reload configuration küresel ayarlarda (yönetici erişimi gereklidir) yeterli olmalı, değilse, o zaman Jenkins aracını yeniden başlatmanız gerekir.

Başka bir yol, bu gönderinin yukarıda belirtilen eklentileri kullanmak olabilir.

edit: - muhtemelen modulesklasörleri hariç tutabilirsiniz


0

İşleri Manuel Olarak İçe Aktarma: Alternatif yol

İşleri Git'e yükleyin (Sürüm Denetimi) Temel olarak İşin config.xml dosyasını yükleyin.

Linux Sunucuları ise:

cd /var/lib/jenkins/jobs/<Job name> 
Download the config.xml from Git

Jenkins'i yeniden başlatın


0

Bir web kullanıcısı olarak, İş Yapılandırma Geçmişi'ne gidip XML'yi dışa aktararak dışa aktarabilirsiniz.

Jenkins'in çalıştığı ve yedek olarak dışa aktarmak istediği makineye erişememe durumundayım.

Bir web kullanıcısı olarak xml'i içe aktarmaya gelince, hala bilmek istiyorum.

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.