Jenkinsでのジョブのエクスポート/インポート


268

2つの異なるジェンキンスの間で仕事を交換することは可能ですか?ジョブをエクスポート/インポートする方法を探しています。


2
質問への直接の回答ではなく、いくつかのベストプラクティス:Jenkins Pipeline DSLを使用してジョブ構成を記述し、それをプロジェクトのリポジトリの一部にするようにしてください。そのように、Jenkinsサーバー間でジョブを簡単に移植できます。github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.mdを
Michael Lihs

時を超えるいくつかのアドバイスstackoverflow.com/questions/38585734/...だけでなく
ベンCreasy

回答:


154

Jenkinsには、CIソフトウェアに慣れていないと読みにくいですが、かなり良いwikiがあります...

サーバー間でジョブ移動するためのシンプルなソリューションを提供します

トリックはおそらくJenkins設定ページから設定をリロードする必要性でした。

アップデート2020.03.10

JenkinsCIの状況は大きく変わりました...私はしばらくの間、ジョブDSLを使用しています。残りのジョブを生成するSEEDジョブがあります。

これにより、必要に応じてJenkinsサーバーを再作成または移動することができます:)これらのファイルをバージョン管理して、さらに保守性を高めることもできます。


22
jenkinsがインストールされているシステムにアクセスする必要がありますか?したがって、これは通常のユーザーにとっては答えではありません。
Wouter Schut、2015年

確認されました。ドキュメントの内容を適用した後、Jenkinsをリロードする必要があります。
ミゲルオルティス

180

おそらくjenkinsコマンドラインを使用することも別のオプションです。https: //wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLIを参照してください

  • create-job:stdinを構成XMLファイルとして読み取ることにより、新しいジョブを作成します。
  • get-job:ジョブ定義XMLをstdoutにダンプします

だからできる

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

私には問題なく動作し、バージョン管理システム内に保存するのに慣れています


3
これが機能するためには、古いサーバー、新しいサーバー、ローカルマシンのJavaが同じバージョンである必要があります。そうしないと、奇妙なストリーム/バージョンの問題が発生します。jnlpポートも開いている必要があります。
MaratC、2015年

CLIクライアントへの絶対パスはJENKINS_HOME / war / WEB-INF / jenkins-cli.jarです。JENKINS_HOMEはJENKINS_HOMEの場所です
Rob Kielty

1
このメソッドには、Groovyコードがある場合など、XMLの裸のアンパサンドに問題があります。
Rob Kielty、2016年

エクスポートされたXML内のエンコードされていないアンパサンドは、Active Choiceプラグイン(非選択)パラメーターをサポートするGroovyコードで発生する可能性があります。できれば解決策を提示します。
Rob Kielty、2016年

1
以下の私の回答で提案されているとおりの@information_interchange。
MaratC 2018

151

ワンライナー:

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

認証あり:

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

Crumbで、CSRFがアクティブな場合(詳細はこちらを参照):

次のものを使用してください:

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

でパン粉を塗る-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
機能するには認証トークンが必要ですが、すばらしい仕事です!
Viroide 2016年

7
curl -s http:// <ユーザー>:<API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | curl -X POST 'http:// <USER>:<API_TOEKN> @ NEW_JENKINS / createItem?name = JOBNAME' --header "Content-Type:application / xml" -d @-<br/>からユーザーAPIキーを取得:JENKIS_URL / user / <USER> / configure > API Token> Show API Token
Suhas Gaikwad

1
これに対する追加の貢献は1つだけです。ターゲットサーバーにPOSTすると、エラーコードHTTP 403が表示される可能性があります/ createItemへのアクセス。理由:リクエストに有効なクラムが含まれていませんでした。ターゲットのJenkinsサーバーのCSRF保護トークンを生成する必要があります。このスレッドから@Kenorbのアドバイスに従ってください:stackoverflow.com/questions/38137760/...
Mig82

2
http://OLD_JENKINS/job/JOBNAME/config.xmlブラウザのリンクに移動してconfig.xmlファイルを取得できるため、curlコマンドを使用する必要もありません。
entpnerd

1
コマンド内では--data-binaryなく、スクリプト内の空白を混乱させる可能性があるため-d、必要です。curl-d
Gabor Csardi

24

あなたが探しているものかもしれないジョブインポートプラグインと呼ばれるプラグインがあります。私はそれを使用しました。匿名アクセスを許可しないサーバーからのプロジェクトのインポートには問題があります。

完全を期すために:コマンドラインから両方にアクセスできる場合は、KhezがJenkinsジョブの移動、コピー、名前変更についてすでに述べた手順を実行できます。


私はそれが現在設定以外のものを動かすとは思わない。
jwernerny

14

Jenkinsサーバーのフロントページに移動し、ページの下部にあるREST APIをクリックします。

ジョブを作成

新しい求人を作成するには、config.xmlクエリパラメータを使用してこのURL に投稿しますname=JOBNAMEContent-Type: application/xmlヘッダーを送信する必要があります。200作成が成功した場合はステータスコードを取得し、4xx/5xx失敗した場合はコードを取得します。config.xmlは、Jenkinsがプロジェクトをファイルシステムに保存するために使用するフォーマットです。そのため、Jenkinsホームディレクトリで、またはから既存のジョブのXML構成を取得することで、それらの例を確認できます/job/JOBNAME/config.xml


13

私のJenkinsインスタンス(バージョン1.548)では、構成ファイルは次の場所にあります。

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

jenkinsユーザーとjenkinsグループが所有し、644の権限があります。こことの間でファイルのコピーが機能するはずです。私はそれを直接変更しようとしませんでしたが、プロジェクトを再度セットアップする必要がある場合に備えて、このスポットから構成をバックアップしました。


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

8

ジョブインポートプラグインは、別のJenkinsインスタンスからジョブをインポートする簡単な方法です。ソースのJenkinsインスタンスのURLを指定するだけです。リモートJenkins URLは、次のタイプのURLのいずれかを取ることができます。

  • http://$JENKINS -リモートインスタンスのすべてのジョブを取得する

  • http://$JENKINS/job/$JOBNAME -単一の仕事を得る

  • http://$JENKINS/view/$VIEWNAME -特定のビューですべてのジョブを取得する


6

Larry Caiの回答のおかげで、すべてのJenkinsジョブをバックアップするスクリプトを作成することができました。これを毎週実行するジョブを作成しました。誰かがそれを便利だと思った場合、ここにそれがあります:

#!/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がジョブをディレクトリにエクスポートする

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

ジョブをインポートする

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

または、バッシュを用意して、ここでの私のPowerShellのポートのない場合があり、誰のWindowsの世界では、私たちの方のためKatuラリー・カイのアプローチが。それが誰かを助けることを願っています。

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

プラグイン名をダウンロードするだけでとても簡単です

ジョブインポートプラグイン

リモートJenkinsサーバーのURLを入力すると、ジョブが自動的にインポートされます


1
これは一部ではうまくいくかもしれませんが、私にはうまくいきません。これは、新しいJenkinsインスタンスが古いJenkinsインスタンスに直接アクセスできる場合にのみ機能します。鉱山は2つの異なるネットワーク上にありました。
Justin Domnitz

1

単純なphpスクリプトが私のために働いた。

書き出す:

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

インポート:

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

マシンに直接アクセスする最も簡単な方法は、ジョブフォルダーworkspace全体をディスク上のxmlファイルに保存するため、ジョブフォルダーを最初のジェンキンスから別のジェンキンスにコピーすることです(ワークスペース- フォルダーを除外できます)。

次に、新しいjenkins reload configurationではグローバル設定(管理者アクセスが必要)で十分ですが、そうでない場合は、Jenkinsツールを再起動する必要があります。

別の方法は、この投稿の上で述べたプラグインを使用することです。

編集:- modulesフォルダーも除外できる場合


0

ジョブを手動でインポートする:別の方法

ジョブをGit(バージョン管理)にアップロードする基本的に、ジョブのconfig.xmlをアップロードします。

Linuxサーバーの場合:

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

Jenkinsを再起動します


0

Webユーザーは、Job Config Historyに移動してからXMLをエクスポートすることでエクスポートできます。

Jenkinsが実行されているマシンにアクセスできない状況で、バックアップとしてエクスポートしたいと考えています。

xmlをWebユーザーとしてインポートすることについては、まだ知りたいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.