Pekerjaan ekspor / impor di Jenkins

268

Apakah mungkin untuk bertukar pekerjaan antara 2 Jenkins yang berbeda? Saya mencari cara untuk mengekspor / mengimpor pekerjaan.

damluar
sumber
2
Bukan secara langsung jawaban atas pertanyaan Anda tetapi beberapa praktik terbaik: cobalah untuk menulis konfigurasi pekerjaan Anda dengan Jenkins Pipeline DSL dan menjadikannya bagian dari repositori proyek Anda. Seperti itu, pekerjaannya mudah dibawa-bawa dari satu server Jenkins ke yang lain. Lihat github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs
Beberapa saran di stackoverflow.com/questions/38585734/… juga
Ben Creasy

Jawaban:

154

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!

Khez
sumber
22
Jadi, Anda perlu akses ke sistem tempat jenkins diinstal? Jadi ini bukan jawaban untuk pengguna normal.
Wouter Schut
Dikonfirmasi, Anda perlu memuat ulang Jenkins setelah menerapkan apa yang dikatakan dokumen itu.
Miguel Ortiz
180

Mungkin menggunakan jenkins command line adalah opsi lain, lihat https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: Membuat pekerjaan baru dengan membaca stdin sebagai file XML konfigurasi.
  • get-job: Membuang definisi kerja XML ke stdout

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

Larry Cai
sumber
3
Agar ini berfungsi, java di server lama, server baru, dan mesin lokal Anda harus memiliki versi yang sama. Jika tidak, muncul masalah aliran / versi yang aneh. Port jnlp Anda juga harus terbuka.
MaratC
Path lengkap ke klien CLI adalah JENKINS_HOME / war / WEB-INF / jenkins-cli.jar di mana JENKINS_HOME adalah lokasi JENKINS_HOME
Rob Kielty
1
Metode ini memiliki masalah dengan ampersand telanjang telanjang di XML seperti ketika Anda memiliki & dalam kode Groovy.
Rob Kielty
ampersand yang tidak disandikan dalam XML yang diekspor dapat terjadi dalam kode Groovy yang mendukung parameter Plugin Pilihan Aktif (tidak terpilih); akan menghadirkan solusi jika saya bisa.
Rob Kielty
1
@information_interchange persis seperti yang diusulkan dalam jawaban saya di bawah ini.
MaratC
151

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 @-
MaratC
sumber
1
Perlu token autentikasi agar berfungsi, tetapi menghasilkan pekerjaan yang bagus!
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 "Type-Type: application / xml" -d @ - <br/> Dapatkan kunci API Pengguna dari : JENKIS_URL / user / <USER> / configure > Token API> Tampilkan Token API
Suhas Gaikwad
1
Hanya satu kontribusi tambahan untuk ini. Ketika POSTing ke server target Anda cenderung mendapatkan kode kesalahan HTTP 403 Masalah mengakses / membuat Item. Alasan: Tidak ada remah yang valid yang termasuk dalam permintaan. Anda harus membuat token perlindungan CSRF untuk server Jenkins target. Ikuti saran dari @Kenorb dari utas ini: stackoverflow.com/questions/38137760/…
Mig82
2
Bahkan tidak perlu menggunakan perintah ikal karena Anda bisa pergi ke http://OLD_JENKINS/job/JOBNAME/config.xmltautan di browser Anda untuk mengambil config.xmlfile.
entpnerd
1
Anda perlu --data-binarybukannya -ddalam curlperintah, karena -dmungkin mengacaukan spasi putih di skrip Anda.
Gabor Csardi
24

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 .

jerny
sumber
Saya tidak percaya saat ini bergerak selain konfigurasi.
jwernerny
14

Buka halaman depan server Jenkins Anda, klik REST API di bagian bawah halaman:

Buat Pekerjaan

Untuk membuat pekerjaan baru, poskan config.xmlke URL ini dengan parameter kueri name=JOBNAME. Anda harus mengirim Content-Type: application/xmltajuk. Anda akan mendapatkan 200kode status jika pembuatannya berhasil, atau 4xx/5xxkode jika gagal. config.xmladalah 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.

pengguna1050755
sumber
13

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.

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

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

GaneSH Malkar
sumber
6

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
Katu
sumber
5

Dalam kunjungan browser web:

http://[jenkinshost]/job/[jobname]/config.xml

Simpan saja file ke disk Anda.

Gayan Weerakutti
sumber
jawaban tidak lengkap :(
Pradeep Singh
4

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
karthick
sumber
2

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"
Justin Morgan
sumber
2

Sangat mudah hanya mengunduh nama plugin

Plugin Impor Pekerjaan

Masukkan URL server Remote Jenkins Anda dan itu akan mengimpor pekerjaan secara otomatis

Wali
sumber
1
Ini mungkin bekerja untuk beberapa orang, tetapi tidak untuk saya. Ini hanya berfungsi jika instance Jenkins baru memiliki akses langsung ke instance Jenkins lama. Milik saya berada di dua jaringan yang berbeda.
Justin Domnitz
1

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);
}
Jitendra Chandani
sumber
1

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.

pcrews
sumber
1

Cara paling mudah, dengan akses langsung ke mesin adalah menyalin folder pekerjaan dari jenkins pertama ke yang lain (Anda dapat mengecualikan ruang kerja - workspacefolder), 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 modulesfolder

xxxvodnikxxx
sumber
0

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

Dixon Joseph Dalmeida
sumber
0

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.

SwimBikeRun
sumber