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.
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.
Câu trả lời:
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!
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
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
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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
liên kết trong trình duyệt của mình để lấy config.xml
tệp.
--data-binary
thay vì -d
trong curl
lệnh, bởi vì -d
có thể làm rối tung khoảng trắng trong tập lệnh của bạn.
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 .
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.xml
lên URL này với tham số truy vấn name=JOBNAME
. Bạn cần gửi một Content-Type: application/xml
tiêu đề. Bạn sẽ nhận được 200
mã trạng thái nếu việc tạo thành công hoặc 4xx/5xx
mã nếu thất bại. config.xml
là đị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
.
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.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
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ể
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
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.
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
Đố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"
Nó rất dễ dàng chỉ cần tải xuống tên plugin
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
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);
}
Đ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.
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 - workspace
thư 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 configuration
trong 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ừ modules
các thư mục
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
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.