Công việc xuất / nhập tại Jenkins


268

Có thể trao đổi công việc giữa 2 Jenkins khác nhau không? Tôi đang tìm cách để xuất / nhập công việc.


2
Không trực tiếp trả lời cho câu hỏi của bạn mà là một cách thực hành tốt nhất: hãy thử viết cấu hình công việc của bạn với DSL Pipeline DSL và biến nó thành một phần trong kho của dự án của bạn. Như vậy, các công việc dễ dàng di chuyển từ máy chủ Jenkins này sang máy chủ khác. Xem github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs

Một số lời khuyên tại stackoverflow.com/questions/38585734/ cũng như
Ben Creasy

Câu trả lời:


154

Jenkins có một wiki khá tốt, mặc dù khó đọc khi bạn chưa quen với phần mềm CI ...

Họ cung cấp một giải pháp đơn giản để di chuyển công việc giữa các máy chủ

Thủ thuật có lẽ là cần phải tải lại cấu hình từ Trang cấu hình Jenkins.

Cập nhật 2020.03.10

Khung cảnh JenkinsCI đã thay đổi rất nhiều ... Tôi đã sử dụng DSL công việc được một thời gian rồi. Chúng tôi có một công việc SEED tạo ra phần còn lại của công việc.

Điều này giúp chúng tôi vừa tạo lại hoặc di chuyển cho máy chủ Jenkins bất cứ khi nào cần :) Bạn cũng có thể phiên bản các tệp đó để có thể bảo trì nhiều hơn!


22
Vì vậy, bạn cần truy cập vào hệ thống nơi jenkins được cài đặt? Vì vậy, đây không phải là một câu trả lời cho người dùng bình thường.
Wouter Schut

Xác nhận, bạn cần tải lại Jenkins sau khi áp dụng những gì tài liệu nói.
Miguel Ortiz

180

Có thể sử dụng dòng lệnh jenkins là một tùy chọn khác, xem https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • tạo công việc: Tạo một công việc mới bằng cách đọc stdin dưới dạng tệp XML cấu hình.
  • get-job: Kết xuất định nghĩa công việc XML thành thiết bị xuất chuẩn

Vì vậy bạn có thể làm

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

Nó hoạt động tốt đối với tôi và tôi được sử dụng để lưu trữ bên trong hệ thống kiểm soát phiên bản của mình


3
Để làm việc này, java trên máy chủ cũ, máy chủ mới và máy cục bộ của bạn cần phải có cùng phiên bản. Nếu không, vấn đề luồng / phiên bản lạ phát sinh. Cổng jnlp của bạn cũng cần phải được mở.
MaratC

Đường dẫn đầy đủ đến ứng dụng khách CLI là JENKINS_HOME / war / WEB-INF / jenkins-cli.jar trong đó JENKINS_HOME là vị trí của JENKINS_HOME
Rob

1
Phương pháp này có vấn đề với các ký hiệu trần trụi trong XML, chẳng hạn như khi bạn có & trong mã Groovy.
Rob Ki ERIC

các ký hiệu không được mã hóa trong XML đã xuất có thể xảy ra trong mã Groovy quay lại các tham số của Active Choice Plugin (uno-select); sẽ trình bày giải pháp nếu tôi có thể.
Rob Ki ERIC

1
@in information_interchange chính xác như đề xuất trong câu trả lời của tôi dưới đây.
MaratC

151

Một lớp lót:

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

Với xác thực:

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

Với Crumb, nếu CSRF đang hoạt động ( xem chi tiết tại đây ):

Nhận vụn với:

$ 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)')

Áp dụng vụn với -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
Cần mã thông báo xác thực để làm việc, nhưng công việc tuyệt vời bằng thép!
Viroide

7
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | curl -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createdItem? name = JOBNAME' --header "Content-Type: application / xml" -d @ - <br/> Nhận khóa API người dùng từ : JENKIS_URL / người dùng / <USER> / configure > Mã thông báo API> Hiển thị mã thông báo API
Suhas Gaikwad

1
Chỉ cần một đóng góp bổ sung về điều này. Khi gửi bài đến máy chủ mục tiêu, bạn có khả năng nhận được mã lỗi HTTP 403 Sự cố khi truy cập / createdItem. Lý do: Không có mẩu vụn hợp lệ được bao gồm trong yêu cầu. Bạn sẽ cần tạo mã thông báo bảo vệ CSRF cho máy chủ Jenkins mục tiêu. Làm theo lời khuyên của @Kenorb từ chuỗi này: stackoverflow.com/questions/38137760/iêu
Mig82

2
Thậm chí không cần sử dụng các lệnh curl vì bạn chỉ cần truy cập http://OLD_JENKINS/job/JOBNAME/config.xmlliên kết trong trình duyệt của mình để lấy config.xmltệp.
entpnerd

1
Bạn cần --data-binarythay vì -dtrong curllệnh, bởi vì -dcó thể làm rối tung khoảng trắng trong tập lệnh của bạn.
Gabor Csardi

24

Có một plugin gọi là Plugin nhập công việc có thể là những gì bạn đang tìm kiếm. Tôi đã sử dụng nó. Nó có vấn đề với việc nhập các dự án từ một máy chủ không cho phép truy cập ẩn danh.

Để hoàn thiện: Nếu bạn có quyền truy cập dòng lệnh cho cả hai, bạn có thể thực hiện quy trình đã được Khez đề cập cho Di chuyển, Sao chép và Đổi tên Công việc Jenkins .


Tôi không tin rằng nó hiện đang di chuyển bất cứ thứ gì ngoài cấu hình.
jwernerny

14

Chuyển đến trang trước của máy chủ Jenkins của bạn, nhấp vào API REST ở cuối trang:

Tạo việc làm

Để tạo một công việc mới, đăng config.xmllên URL này với tham số truy vấn name=JOBNAME. Bạn cần gửi một Content-Type: application/xmltiêu đề. Bạn sẽ nhận được 200mã trạng thái nếu việc tạo thành công hoặc 4xx/5xxmã nếu thất bại. config.xmllà định dạng mà Jenkins sử dụng để lưu trữ dự án trong hệ thống tệp, vì vậy bạn có thể xem các ví dụ về chúng trong thư mục chính của Jenkins hoặc bằng cách truy xuất cấu hình XML của các công việc hiện có /job/JOBNAME/config.xml.


13

Trong ví dụ Jenkins của tôi (phiên bản 1.548), tệp cấu hình có tại:

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

Thuộc sở hữu của người dùng jenkins và nhóm jenkins với 644 quyền. Sao chép tập tin vào và từ đây sẽ hoạt động. Tôi đã không thử thay đổi nó trực tiếp nhưng đã sao lưu cấu hình từ vị trí này trong trường hợp dự án cần phải được thiết lập lại.


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

8

Plugin nhập công việc là cách dễ dàng ở đây để nhập công việc từ một phiên bản Jenkins khác. Chỉ cần cung cấp URL của ví dụ Jenkins nguồn. URL Jenkins từ xa có thể lấy bất kỳ loại URL nào sau đây:

  • http://$JENKINS - nhận tất cả các công việc trên ví dụ từ xa

  • http://$JENKINS/job/$JOBNAME - có một công việc duy nhất

  • http://$JENKINS/view/$VIEWNAME - có được tất cả các công việc trong một cái nhìn cụ thể


6

Nhờ câu trả lời của Larry Cai, tôi đã tạo ra một kịch bản để sao lưu tất cả các công việc Jenkins của mình. Tôi đã tạo ra một công việc chạy này mỗi tuần. Trong trường hợp ai đó thấy nó hữu ích, thì đây là:

#!/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

5

Trong một lần truy cập trình duyệt web:

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

Chỉ cần lưu tệp vào đĩa của bạn.


câu trả lời không đầy đủ :(
Pradeep Singh

4

Jenkins xuất công việc vào một thư mục

 #! /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

Nhập khẩu công việc

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

Đối với những người trong chúng ta trong thế giới Windows, những người có thể có hoặc không có sẵn Bash, đây là cổng PowerShell của Katu và cách tiếp cận của Larry Cai . Hy vọng nó sẽ giúp được ai đó.

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

Nó rất dễ dàng chỉ cần tải xuống tên plugin

Plugin nhập công việc

Nhập URL của máy chủ Remote Jenkins của bạn và nó sẽ tự động nhập các công việc


1
Điều này có thể làm việc cho một số, nhưng không phải cho tôi. Điều này chỉ hoạt động nếu phiên bản Jenkins mới có quyền truy cập trực tiếp vào phiên bản Jenkins cũ. Của tôi là trên hai mạng khác nhau.
Justin Domnitz

1

Kịch bản php đơn giản làm việc cho tôi.

Xuất khẩu:

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

Nhập khẩu:

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

Điều này không làm việc cho các công việc hiện tại, tuy nhiên có người xây dựng công việc Jenkins .

Điều này cho phép một người giữ các định nghĩa công việc trong các tệp yaml và trong một repo git rất dễ mang theo.


1

Cách dễ nhất, với quyền truy cập trực tiếp vào máy là sao chép thư mục công việc từ jenkins đầu tiên sang một thư mục khác (bạn có thể loại trừ không gian làm việc - workspacethư mục), vì toàn bộ cấu hình công việc được lưu trữ trong tệp xml trên đĩa.

Sau đó, trong jenkins mới chỉ reload configurationtrong cài đặt toàn cầu (yêu cầu quyền truy cập quản trị viên) là đủ, nếu không, thì bạn sẽ cần phải khởi động lại công cụ Jenkins.

Một cách khác có thể là sử dụng các plugin được đề cập ở trên bài đăng này.

chỉnh sửa: - trong trường hợp bạn cũng có thể loại trừ modulescác thư mục


0

Nhập công việc thủ công: Cách khác

Tải công việc lên Git (Kiểm soát phiên bản) Về cơ bản tải lên tệp config.xml của Công việc.

Nếu máy chủ Linux:

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

Khởi động lại Jenkins


0

Là người dùng web, bạn có thể xuất bằng cách đi tới Lịch sử cấu hình công việc, sau đó xuất XML.

Tôi đang ở trong tình trạng không có quyền truy cập vào máy Jenkins đang chạy và muốn xuất dưới dạng bản sao lưu.

Đối với việc nhập xml với tư cách là người dùng web, tôi vẫn muốn biết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.