togatttiのエンジニアメモ

過度な期待はしないでください。旧麹町で働くエンジニアのメモ帳です。

Jenkinsのジョブをコマンドラインから生成する

Jenkinsのジョブをコマンドラインから、生成する方法を調べてみた。

OSは、Ubuntu14.04。

結論から言うと、XMLファイルをjenkins-cli.jarの create-jobコマンドに与えればよい。

Jenkins CLI - Jenkins - Jenkins Wiki

以下の実行パスや、URLは各自の環境に読み替えること。

jenkins.example.comとなっている箇所は、自身のJenkinsが動作しているURLを指す。

テンプレート用のXMLファイル作成

生成するジョブのテンプレートとなるXMLファイルを作成する。 通常通り、UIからジョブを作成する。

ここでは、echo 'this is 01_job' をする簡単な01_jobを作成する。

そうすると、サーバ内に、以下のようなファイルが作成される。

jenkins@ubuntu:~$ cat /var/lib/jenkins/jobs/01_job/config.xml
<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description>this is 01_job</description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.scm.NullSCM"/>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.tasks.Shell>
      <command>echo &apos;this is 01_job&apos;</command>
    </hudson.tasks.Shell>
  </builders>
  <publishers/>
  <buildWrappers/>

Jenkins CLI

今回は、Jenkins CLIのcreate-jobコマンドを使い、ジョブを生成する。

Jenkins CLI は、コマンドラインから、Jenkinsを操作するためのjarファイルで、Jenkinsにパッケージされている。

まずは、自身のURL/jnlpJars/jenkins-cli.jar から、jenkins-cli.jarをダウンロードする。

$ wget http://jenkins.example.com/jnlpJars/jenkins-cli.jar

また、http://jenkins.example.com/cli のようなURLで、使えるコマンド一覧、 ヘルプが参照できる。

ダウンロードしたら、実際に使ってみる。

$ java -jar jenkins-cli.jar -s jenkins.example.com/ -i ~/.ssh/id_rsa version
1.627

$ java -jar jenkins-cli.jar -s http://jenkins.example.com/ -i ~/.ssh/id_rsa who-am-i
Authenticated as: togashik
Authorities:
  authenticated

-s には、jenkins のURL、-i には、秘密鍵を指定する。 秘密鍵は、ログインユーザに登録した公開鍵とペアになっているものを指定する。

早速、create-jobを使い、ジョブを生成してみる。

最後に与えた02_jobは、新規生成するジョブ名を指す。

$ cat /var/lib/jenkins/jobs/01_job/config.xml | java -jar jenkins-cli.jar -s http://jenkins.example.com/ -i ~/.ssh/id_rsa create-job 02_job

これで、ジョブが生成できたはずなので、get-jobで確認してみる。

$ java -jar jenkins-cli.jar -s http://jenkins.example.com/ -i ~/.ssh/id_rsa get-job 02_job
<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description>this is 01_job</description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.scm.NullSCM"/>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.tasks.Shell>
      <command>echo &apos;this is 01_job&apos;</command>
    </hudson.tasks.Shell>
  </builders>
  <publishers/>
  <buildWrappers/>

ただし、これでは、02_jobは01_jobの単なるコピーなので、設定に含めたシェルスクリプトecho 'this is 01_job' のままである。

これを、echo 'this is 02_job' としたいとき等、読み込むxmlファイルを変更する必要がある。

delete-jobで先ほどのジョブを削除する。

$ java -jar jenkins-cli.jar -s http://jenkins.example.com/ -i ~/.ssh/id_rsa delete-job 02_job

create-jobで、再生成する。

$ sed 's/01_job/02_job/' /var/lib/jenkins/jobs/01_job/config.xml | java -jar jenkins-cli.jar -s http://jenkins.example.com/ -i ~/.ssh/id_rsa create-job 02_job

おまけ

コマンドラインから、生成したジョブを既存のビューに追加する

Jenkins CLIを使う方法を試そうとしたけど、うまくいかなかったので、力づくでやる。

つまり、ビュー構造が定義されているconfig.ymlを手動で変更して、読み込ませる。

02_jobをblogというビューに追加する。

$ sed -n '/^\s*<name>blog/,/^\s*<\/jobNames>/p' /var/lib/jenkins/config.xml
      <name>blog</name>
      <filterExecutors>false</filterExecutors>
      <filterQueue>false</filterQueue>
      <properties class="hudson.model.View$PropertyList"/>
      <jobNames>
        <comparator class="hudson.util.CaseInsensitiveComparator"/>
        <string>01_job</string>
      </jobNames>

$ sed -i.bak -e '/<string>01_job<\/string>/a\ \ \ \ \ \ \ \ <string>02_job<\/string>' /var/lib/jenkins/config.xml

$ sed -n '/^\s*<name>blog/,/^\s*<\/jobNames>/p' /var/lib/jenkins/config.xml
      <name>blog</name>
      <filterExecutors>false</filterExecutors>
      <filterQueue>false</filterQueue>
      <properties class="hudson.model.View$PropertyList"/>
      <jobNames>
        <comparator class="hudson.util.CaseInsensitiveComparator"/>
        <string>01_job</string>
        <string>02_job</string>
      </jobNames>

Jenkinsを安全に再起動する。

$ java -jar jenkins-cli.jar -s http://jenkins.example.com/ -i ~/.ssh/id_rsa safe-restart

参考

Jenkinsはじめました - こしごぇ