Pekerjaan ekspor / impor di Jenkins


268

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


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

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!


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


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 @-

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


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.


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.


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


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


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

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"

2

Sangat mudah hanya mengunduh nama plugin

Plugin Impor Pekerjaan

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


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);
}

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.


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


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.