Apakah mungkin untuk bertukar pekerjaan antara 2 Jenkins yang berbeda? Saya mencari cara untuk mengekspor / mengimpor pekerjaan.
Apakah mungkin untuk bertukar pekerjaan antara 2 Jenkins yang berbeda? Saya mencari cara untuk mengekspor / mengimpor pekerjaan.
Jawaban:
Jenkins memiliki wiki yang cukup bagus, meskipun sulit dibaca ketika Anda baru mengenal perangkat lunak CI ...
Mereka menawarkan solusi sederhana untuk memindahkan pekerjaan antar server
Triknya mungkin adalah kebutuhan untuk memuat ulang konfigurasi dari Halaman Konfigurasi Jenkins.
Pembaruan 2020.03.10
Lansekap JenkinsCI telah banyak berubah ... Saya telah menggunakan Job DSL untuk sementara waktu sekarang. Kami memiliki SEED Job yang menghasilkan sisa pekerjaan.
Ini membantu kami untuk membuat ulang atau pindah ke server Jenkins kapan pun diperlukan :) Anda juga dapat membuat versi file-file tersebut untuk lebih mudah dirawat!
Mungkin menggunakan jenkins command line adalah opsi lain, lihat https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
Jadi kamu bisa melakukannya
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
Ini berfungsi dengan baik untuk saya dan saya terbiasa menyimpan di dalam sistem kontrol versi saya
Satu kalimat:
$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-
Dengan otentikasi:
$ 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 @-
Dengan Crumb, jika CSRF aktif ( lihat detailnya di sini ):
Menjadi remah dengan:
$ 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)')
Oleskan remah dengan -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
tautan di browser Anda untuk mengambil config.xml
file.
--data-binary
bukannya -d
dalam curl
perintah, karena -d
mungkin mengacaukan spasi putih di skrip Anda.
Ada plugin bernama Job Import Plugin yang mungkin Anda cari. Saya sudah menggunakannya. Itu memang memiliki masalah dengan mengimpor proyek dari server yang tidak memungkinkan akses anonim.
Untuk Kelengkapan: Jika Anda memiliki akses baris perintah ke keduanya, Anda dapat melakukan prosedur yang telah disebutkan oleh Khez untuk Memindahkan, Menyalin, dan Mengganti Nama Pekerjaan Jenkins .
Buka halaman depan server Jenkins Anda, klik REST API di bagian bawah halaman:
Buat Pekerjaan
Untuk membuat pekerjaan baru, poskan config.xml
ke URL ini dengan parameter kueri name=JOBNAME
. Anda harus mengirim Content-Type: application/xml
tajuk. Anda akan mendapatkan 200
kode status jika pembuatannya berhasil, atau 4xx/5xx
kode jika gagal. config.xml
adalah format yang digunakan Jenkins untuk menyimpan proyek dalam sistem file, sehingga Anda dapat melihat contohnya di direktori home Jenkins, atau dengan mengambil konfigurasi XML dari pekerjaan yang ada /job/JOBNAME/config.xml
.
Dalam contoh Jenkins saya (versi 1.548) file konfigurasi di:
/var/lib/jenkins/jobs/-the-project-name-/config.xml
Dimiliki oleh pengguna jenkins dan grup jenkins dengan 644 izin. Menyalin file ke dan dari sini seharusnya berfungsi. Saya belum mencoba mengubahnya secara langsung tetapi telah mencadangkan konfigurasi dari tempat ini jika proyek perlu diatur kembali.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Plugin Impor Pekerjaan adalah cara mudah di sini untuk mengimpor pekerjaan dari instance Jenkins lain. Hanya perlu memberikan URL sumber Jenkins contoh. URL Remote Jenkins dapat mengambil salah satu dari jenis-jenis URL berikut:
http://$JENKINS
- dapatkan semua pekerjaan pada instance jarak jauh
http://$JENKINS/job/$JOBNAME
- dapatkan satu pekerjaan
http://$JENKINS/view/$VIEWNAME
- dapatkan semua pekerjaan dalam tampilan tertentu
Berkat jawaban Larry Cai, saya berhasil membuat skrip untuk mencadangkan semua pekerjaan Jenkins saya. Saya menciptakan pekerjaan yang menjalankan ini setiap minggu. Jika seseorang menemukan itu berguna, ini dia:
#!/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
Dalam kunjungan browser web:
http://[jenkinshost]/job/[jobname]/config.xml
Simpan saja file ke disk Anda.
Jenkins mengekspor pekerjaan ke direktori
#! /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
Impor pekerjaan
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
Bagi kita di dunia Windows yang mungkin atau mungkin tidak memiliki Bash, inilah port PowerShell saya dari Katu dan Larry Cai . Semoga ini bisa membantu seseorang.
##### 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"
Sangat mudah hanya mengunduh nama plugin
Masukkan URL server Remote Jenkins Anda dan itu akan mengimpor pekerjaan secara otomatis
Script php sederhana bekerja untuk saya.
Ekspor:
// 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);
}
Impor:
<?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);
}
Ini tidak bekerja untuk pekerjaan yang ada, namun ada pembangun pekerjaan Jenkins .
Ini memungkinkan seseorang untuk menyimpan definisi pekerjaan dalam file yaml dan repo git yang sangat portabel.
Cara paling mudah, dengan akses langsung ke mesin adalah menyalin folder pekerjaan dari jenkins pertama ke yang lain (Anda dapat mengecualikan ruang kerja - workspace
folder), karena seluruh konfigurasi pekerjaan disimpan dalam file xml pada disk.
Lalu di jenkins baru saja reload configuration
di pengaturan global (akses admin diperlukan) harus cukup, jika tidak, maka Anda perlu me-restart alat Jenkins.
Cara lain dapat menggunakan plugin yang disebutkan di atas posting ini.
edit: - jika Anda mungkin juga dapat mengecualikan modules
folder
Mengimpor Pekerjaan Secara Manual: Cara alternatif
Unggah Pekerjaan ke Git (Kontrol Versi) Pada dasarnya unggah config.xml dari Pekerjaan.
Jika Server Linux:
cd /var/lib/jenkins/jobs/<Job name>
Download the config.xml from Git
Nyalakan kembali Jenkins
Sebagai pengguna web, Anda dapat mengekspor dengan masuk ke Job Config History, lalu mengekspor XML.
Saya dalam situasi tidak memiliki akses ke mesin Jenkins berjalan dan ingin diekspor sebagai cadangan.
Sedangkan untuk mengimpor xml sebagai pengguna web, saya masih ingin tahu.