web-dev-qa-db-ja.com

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

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

248
damluar

あなたがCIソフトウェアに慣れていないときに読みにくいけれども、ジェンキンスはかなり良いウィキを持っています...

サーバー間でジョブを移動する ための簡単な解決策を提供します

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

147
Khez

おそらくjenkinsコマンドラインを使うことも別の方法です。 https://wiki.jenkins-ci.org/display/JENKINS/Jenkins + CLI

  • create-job:設定XMLファイルとしてstdinを読み込んで新しいジョブを作成します。
  • get-job:ジョブ定義XMLを標準出力にダンプします

だからあなたはできる

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

それは私のためにうまく働きますそして私は私のバージョン管理システムの中に格納するのに慣れています

168
Larry Cai

ワンライナー:

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

Job Import Plugin というプラグインがあります。私はそれを使いました。匿名アクセスを許可しないサーバーからプロジェクトをインポートする際に問題があります。

完全性のために:もしあなたが両方へのコマンドラインアクセスを持っているなら、 Jenkinsジョブの移動、コピーそして名前変更 のためにKhezによって既に述べられた手順をすることができます。

24
jwernerny

Jenkinsサーバのフロントページに行き、ページ下部のREST AP​​Iをクリックします。

ジョブを作成

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

13
user1050755

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

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

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

10
jimmont

Job Importプラグインは、他のJenkinsインスタンスからジョブをインポートする簡単な方法です。ソースのJenkinsインスタンスのURLを入力するだけです。リモートJenkins URLは、次の種類のURLのいずれかを取ります。

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

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

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

8
GaneSH Malkar

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
6
Katu

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
4
karthick

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

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

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

1
Guardian

Bashが利用可能かどうかに関わらず、Windowsの世界にいる私達にとっては、これが私のPowerShellのKatuです。 )Larry Caiのアプローチ。誰かに役立つことを願っています。

##### 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"
1
Justin Morgan

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

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

別の方法は、この記事の上で言及したプラグインを使うことです。

編集: - おそらくmodulesフォルダも除外できる場合

1
xxxvodnikxxx

簡単な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

これは既存のジョブでは機能しませんが、 Jenkinsジョブビルダー があります。

これにより、yamlファイルと非常に移植性の高いgitリポジトリにジョブ定義を保存することができます。

1
pcrews

手動でのジョブのインポート:代替方法

JobをGit(Version Control)にアップロードする基本的にJobのconfig.xmlをアップロードします。

Linuxサーバーの場合

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

Jenkinsを再起動してください

0
Dixon Almeida

デフォルトでは、これは〜/ .jenkinsに設定されていますが、以下のいずれかの方法でこれを変更できます。

* Set "JENKINS_HOME" environment variable to the new home directory before launching 
the servlet container.
* Set "JENKINS_HOME" system property to the servlet container.
* Set JNDI environment entry "JENKINS_HOME" to the new directory.

あなたのコンテナのためにこれをする方法の詳細についてはコンテナ特有のドキュメントコレクションを参照してください。

Jenkinsをしばらく使用した後でこの場所を変更することもできます。これを行うには、Jenkinsを完全に停止し、内容を古いJENKINS_HOMEから新しいホームに移動し、新しいJENKINS_HOMEを設定して、Jenkinsを再起動します。

JENKINS_HOMEのディレクトリ構造は、次のようになっています。

JENKINS_HOME
 +- config.xml     (jenkins root configuration)
 +- *.xml          (other site-wide configuration files)  
 +- userContent    (files in this directory will be served under your 
 http://server/userContent/)  
 +- fingerprints   (stores fingerprint records)
 +- plugins        (stores plugins)
 +- workspace (working directory for the version control system)
     +- [JOBNAME] (sub directory for each job)
 +- jobs
 +- [JOBNAME]      (sub directory for each job)
     +- config.xml     (job configuration file)
     +- latest         (symbolic link to the last successful build)
     +- builds
         +- [BUILD_ID]     (for each build)
             +- build.xml      (build result summary)
             +- log            (log file)
             +- changelog.xml  (change log)

バックアップして復元します。

すべての設定、ビルドログ、アーティファクトアーカイブはJENKINS_HOMEディレクトリに格納されています。このディレクトリを単にアーカイブするだけでバックアップできます。同様に、データの復元は、バックアップからJENKINS_HOMEディレクトリの内容を置き換えるだけです。

サーバーを停止せずにバックアップを取ることができますが、復元するときはサーバーを停止してください。

ジョブの移動/コピー/リネーム

あなたはできる:

  1. 対応するジョブディレクトリをコピーするだけで、Jenkinsのインストール間でジョブを移動できます。
  2. ジョブディレクトリのクローンを別の名前で作成して、既存のジョブのコピーを作成します。
  3. ディレクトリの名前を変更して既存のジョブの名前を変更します。ジョブ名を変更した場合は、名前を変更したジョブを呼び出そうとする他のジョブも変更する必要があります。

これらの操作は、Jenkinsが実行されていても実行できます。このような変更を有効にするには、 "reload config"をクリックしてJenkinsにディスクから設定をリロードさせる必要があります。

バッチ名変更ジョブ

ジョブ名のスペースを下線で置き換える

$ rename 's/\s/_/g' *

未使用のジョブをアーカイブする

Jenkinsから仕事を削除したい場合がありますが、必要に応じて後で復活できるように削除します。これを行うには、$ JENKINS_HOMEに移動して、ジョブディレクトリのアーカイブを作成します。次のコマンドは、ジョブ「xyz」をアーカイブして削除する方法を示しています。

$ cd $JENKINS_HOME/jobs
$ tar czf xyz.tgz xyz
// go to Jenkins GUI "Manage Jenkins" page and "Reload Configuration from Disk"

アーカイブの作成中にxyzプロジェクトをビルドしていない限り、Jenkinsをオフラインにせずにこの操作を実行できます。

"Shelve Project"プラグイン もご覧ください。

スクリプトコンソール

トラブルシューティング、診断、またはジョブのバッチ更新に便利です。Jenkinsは、すべてのJenkins内部にアクセスできるスクリプトコンソールを提供しています。これらのスクリプトはGroovyで書かれていて、この ページ にそれらのサンプルがいくつかあります。

URLオプション

http://[jenkins-server]/[command]

ここで[command]は

  1. シャットダウン・ジェンキンスを終了します
  2. 再起動jenkins
  3. 設定をリロードするにはreload
0
Gavriel Cohen

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

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

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

0
SwimBikeRun