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 farklı Jenkins 'arasında iş alışverişi yapmak mümkün mü? İşleri dışa / içe aktarmanın bir yolunu arıyorum.
Yanıtlar:
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!
Muhtemelen jenkins komut satırını kullanmak başka bir seçenektir, bkz. Https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
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
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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
için tarayıcınızdaki bağlantıya gidebileceğiniz için curl komutlarını kullanmanıza bile gerek yok config.xml
.
--data-binary
yerine -d
de curl
, çünkü komuta -d
kudreti karışıklık senin komut boşluk yukarı.
İş İçe Aktarma Eklentisi adlı bir eklenti var . Ben kullandım. Anonim erişime izin vermeyen bir sunucudan proje aktarmayla ilgili sorunları var.
Tamlık için: Her ikisine de komut satırı erişiminiz varsa, Jenkins İşlerini Taşıma, Kopyalama ve Yeniden Adlandırma için Khez tarafından daha önce belirtilen prosedürü yapabilirsiniz .
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.xml
sorgu parametresiyle bu URL'ye gönderin name=JOBNAME
. Bir Content-Type: application/xml
başlık göndermeniz gerekir . 200
Oluşturma başarılı olursa durum kodu veya 4xx/5xx
başarısız olursa kod alırsınız . config.xml
Jenkins 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
.
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.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
İş 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
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
Bir web tarayıcısı ziyaretinde:
http://[jenkinshost]/job/[jobname]/config.xml
Sadece dosyayı diskinize kaydedin.
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
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"
Eklenti adını indirmek çok kolay
Uzak Jenkins sunucunuzun URL'sini girin, işleri otomatik olarak alır
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);
}
Bu mevcut işler için geçerli değildir, ancak Jenkins iş üreticisi de vardır .
Bu, iş tanımlarının yaml dosyalarında ve çok taşınabilir bir git repo'sunda kalmasına izin verir.
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 modules
klasörleri hariç tutabilirsiniz
İş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
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.