ラベル Jenkins の投稿を表示しています。 すべての投稿を表示
ラベル Jenkins の投稿を表示しています。 すべての投稿を表示

2015年5月29日金曜日

Jenkins で ListView 内に存在する Job の数を Count する方法

概要

Countjobs Viewstabbarを使います

環境

  • CentOS 6.6 64bit
  • Jenkins 1.615
  • Countjobs Viewstabbar 1.0.0

インストール方法

Jenkins -> Jenkinsの管理 -> プラグインの管理

と進み

利用可能タブ -> 検索窓に「Countjobs Viewstabbar」を入力 -> チェック -> ダウンロードして再起動後にインストール

で再起動が完了すればOKです

設定

Jenkins -> Jenkinsの管理 -> システムの設定

と進み
「Views Tab Bar」を「CountJobs Views TabBar」に変更して保存

こんな感じ

jenkins_job_count.png

2015年4月22日水曜日

Jenkins の Workflow Plugin を使ってみた

概要

JenkinsのWorkflow Pluginを使ってみました
ビルドをchainするプラグインは他にもBuild Pipelineなどがあります
今回使うWorkflowプラグインも同じような種類のプラグインですがBuild Pipelineで問題だった点をいろいろ解決してくれているプラグインになります
インストールから簡単なサンプルの動作まで紹介します

環境

  • CentOS 6.6 64bit
  • Jenkins 1.6.10
  • Workflow Plugin 1.5

各種インストール

  • Jenkins
    ここを参考にyumでインストールしました
    Workflowプラグインを動かすためには1.580.1以上のバージョンが必要です

  • Workflowプラグインのインストール

Jenkinsの管理 -> プラグインの管理 -> Workflow: Aggregator

をインストールします
依存するプラグインも一緒にインストールされます
プラグインをインストールしたらJenkinsを一旦再起動しましょう

Workflowジョブを作成する

普通にジョブを作成する手順と同じです
Build Pipelineの場合はジョブを「下流」「上流」でchainすることで実現し、ビューでBuild Pipelineビューを作りましたが、Workflowプラグインはビューを作成しません

ジョブの種類を選択する部分で「Workflow」という項目が増えているのでこれを選択することでWorkflow用のジョブを作成することができます
create_workflow_job.png
これを選択して適当なWorkflowジョブを作成してください

Groovy でジョブのフローを記述する

ここがWorkflowプラグインの一番の肝になると思います
ジョブの設定を開くと「Definition Groovy CPS DSL」という項目でフリーのテキストエリアでScriptを記載する部分があると思います
ここにGroovyスクリプトを記載していきます

Workflowプラグインはジョブの流れや処理をGroovyのスクリプトで制御できるプラグインになります

とりあえずHello world

まずはジョブを成功させてみましょう
以下のScriptを記述してジョブを保存してください

echo 'hello from Workflow'

hello_world_workflow.png

そしてジョブを実行してみましょう
ビルド結果を確認するとechoした文章が出力されていると思います
result_hello_world_workflow.png

またScriptは以下のように記載することもできます

echo("hello from Workflow");

書きやすい方で書いてみましょう

複数のジョブを実行してみる

今回は既存の複数のジョブをWorkflow用のジョブから順番に実行できるようにしてみます
既存のジョブ名はそれぞれ「test1_job」「test2_job」とします
以下のようのScriptを記載しましょう

build 'test1_job'
build 'test2_job'

保存してジョブを実行してみます

実行結果をみると指定したジョブが上から順に実行されましたというログだけが出ています
なのでWorkflowから実行したジョブのビルド結果は各ジョブのビルド結果を見る必要があります

とりあえず既存のジョブをchainするだけならWorkflow Pluginでも簡単にできました

最後に

今回はBuild Pipelineのようにジョブをchainすることが目的だったので紹介は以上ですが、Workflow Pluguinで用意されている機能はもっとたくさんあります
SCMからリソースを取得したり、分散ビルドしたり、成果物を保存したりといったビルドの基本的な機能も実装されているので、これらをGroovyで書くことができます

感想も

かなりちょっとしか使っていませんが使ってみた感想としてはまだまだ発展の余地はあるかなと思いました
Build Pipelineに比べて優れているのは、それぞれのジョブ同士が疎結合のままchainすることができるので、ジョブを単体で実行することができる状態を保つことができます
もう少し言うとBuild Pipelineを使うと必ず下流、上流が結びついているので単体で実行すると勝手に下流のジョブも流れてしまいます
また上流のビルドパラメータを下流に引き継ぐようなジョブを作成していると、必ず上流から実行しないとパラメータの値がないので下流のジョブを単体で実行することができません
この辺のジョブの疎結合はWorkflow Pluginのほうが優れている点だと思います

ただ、Workflow Pluginではフローの可視化ができなかったり、ビルド結果の詳細を確認するには実行したジョブ側を見なければいけなかったりといろいろと改善してほしいポイントはあると思いました
ジョブの一覧でも、どのジョブがWorkflowジョブなのか一見するとわからないので命名規則でカバーしなければいけないのか、、とかも感じまいsた

なので今のところは各自のユースケースにあったプラグインを選択すればいいと思いますが、個人的には今後はWorkflow Pluginが来ると思います
理由としてはやはりビルドの内容をGroovyで完全にコード化できる点かなと思います
Infrastructure as a Codeではないですが、ジョブの状態がコードがされていれば見える化もしやすいですし、git で管理することもできるのでジョブの内容自体をCIすることもできるようになると思います

えー、いろいろ書きましたがとりあえず好感触を得ることができました
今後の発展も期待して使い続けたいと思います

参考サイト

2015年4月16日木曜日

CentOS 6.6 に yum でJenkins をインストールする方法

概要

専用のリポジトリを追加すればyumでインストールおよびパッケージ管理できるみたいなので試してみました
過去に紹介した記事だとTomcat+warファイル方式でやっています
yum でインストールすれば起動スクリプトも作ってくれるので便利です

環境

  • CentOS 6.6 64bit
  • Jenkins
  • Java 1.8.0_31 (OpenJDK)

インストール

リポジトリ追加

wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

で完了です
/etc/yum.repos.dにJenkins専用のリポジトリファイルを作成して検証のために公開鍵をrpmにインポートしています
インポートした鍵情報を確認した場合は

rpm -qa | grep gpg-pubkey

で表示される鍵情報のRPMに対して詳細情報を表示するオプションを付与して実行すればOKです

rpm -qli gpg-pubkey-xxxxxxxx-yyyyyy

xxxxxxxx-yyyyyy はランダムな文字列が入っているはずです

yum インストール

yum -y install jenkins

でOKです
2015/04/16 時点では1.609-1.1という最新版のJenkinsがインストールされました

インストールされたものを確認

  • JENKINS_HOME
    デフォルトでは/var/lib/jenkinsになっていました
    起動オプションで指定するだけなので変更したい場合はJenkinsの起動スクリプトを変更すればOKだと思います

  • warファイルの場所
    /usr/lib/jenkins/jenkins.war

  • Jenkinsのログ
    /var/log/jenkins/jenkins.log

  • その他一覧

インストールされた全資材を確認したい場合は-qliオプションで確認できます

rpm -qli jenkins-1.609-1.1.noarch

一応自分が確認した段階では以下の通りでした

/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins

動作確認

  • 起動と停止
service jenkins start
service jenkins stop

起動すると8080でLISTENします
既存のプロセス(Tomcatとか)が8080を使っている場合は停止してから実行してください
親プロセス配下に50個ほど子プロセスができるようです

java,28629 -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon--httpPo
  {java},28632
  {java},28635
  {java},28638
  ・・・
  この配下に更に50個ほどの子プロセスがあった
  • UIにアクセス

http://hostname:8080/
でJenkinsのホームにアクセスできます
デフォルトではID/PWは設定されていません

  • 自動起動設定
chkconfig jenkins on

service起動できるのでもちろんchkconfig も使うことができます

最後に

アップデートの検証までは実施していないのですがおそらくyumでupdateできると思います
できない場合はJenkinsの画面から実施する感じだと思います

2014年10月1日水曜日

Jenkinsのビルド出力結果にjava.nio.file.DirectoryNotEmptyException

概要

Jenkinsのビルドを実行した際にビルドは成功しているのだがビルドの出力結果に以下のような怪しいログが出ていることがわかりました

ユーザーanonymousが実行
ln builds\lastSuccessfulBuild C:\Program Files (x86)\Jenkins\jobs\job_name\lastSuccessful failed
java.nio.file.DirectoryNotEmptyException: C:\Program Files (x86)\Jenkins\jobs\job_name\lastSuccessful
     at sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source)
     at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(Unknown Source)
     at java.nio.file.Files.deleteIfExists(Unknown Source)
     at sun.reflect.GeneratedMethodAccessor110.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at hudson.Util.createSymlinkJava7(Util.java:1194)
     at hudson.Util.createSymlink(Util.java:1112)
     at hudson.model.Run.createSymlink(Run.java:1838)
     at hudson.model.Run.updateSymlinks(Run.java:1819)
     at hudson.model.Run.execute(Run.java:1730)
     at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
     at hudson.model.ResourceController.execute(ResourceController.java:88)
     at hudson.model.Executor.run(Executor.java:234)
ln builds\lastStableBuild C:\Program Files (x86)\Jenkins\jobs\job_name\lastStable failed
java.nio.file.DirectoryNotEmptyException: C:\Program Files (x86)\Jenkins\jobs\job_name\lastStable
     at sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source)
     at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(Unknown Source)
     at java.nio.file.Files.deleteIfExists(Unknown Source)
     at sun.reflect.GeneratedMethodAccessor110.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at hudson.Util.createSymlinkJava7(Util.java:1194)
     at hudson.Util.createSymlink(Util.java:1112)
     at hudson.model.Run.createSymlink(Run.java:1838)
     at hudson.model.Run.updateSymlinks(Run.java:1820)
     at hudson.model.Run.execute(Run.java:1730)
     at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
     at hudson.model.ResourceController.execute(ResourceController.java:88)
     at hudson.model.Executor.run(Executor.java:234)

ビルドは成功しているのにエラーが出ているという気持ち悪い状態になったので対応してみました

環境準備

  • Windows 2008 R2
  • Jenkins 1.5.73

対応方法

Jenkinsの公式で配布されている.exeファイルからインストールするとインストールディレクトリは
C:\Program Files (x86)\Jenkins\
となり
C:\Program Files (x86)\Jenkins\jobs\
がジョブを管理するディレクトリになると思うので上記にインストールされていることを想定して話を進めます

今回のエラーはlastSuccessfulBuildlastStableBuildというディレクトリが空じゃないよと言われて怒られているようです

確かにエクスプローラ等で
C:\Program Files (x86)\Jenkins\jobs\job_name\lastSuccessful
のディレクトリを見ると空ではないようでした
(archiveディレクトリやらbuild.xmlやらchangelog.xmlやらがありました)

なので素直にlastSuccessful配下にあるファイルをすべて削除してからビルドしてみたのですが、同様にエラーが発生しました
なので思い切ってlastSuccessfulのディレクトリごと削除してからビルドしてみたところ、なんとエラーが出なくなりました

エラーが出なくなったあとのディレクトリ構成を見てみると、これまでディレクトリになっていたlastSuccessfulがシンボリックリンクになっていました

どうやらlastSuccessfulは本来シンボリックリンクで管理されるものらしくbuilds/lastSuccessfulというディレクトリに対するシンボリックリンクになっていました

とりあえずこれでエラーは出なくなったのですが、ではなぜlastSuccessfulがシンボリックリンクではなくディレクトリになってしまっていたのでしょうか・・・

記憶しか遡れなかったのですが、自分がJenkinsをインストールした際に前に使っていたジョブの設定をそのままインポートしたくてjobs配下のファイルを事前にバックアップしておきました
そして、普通に.exeファイルからJenkinsをインストール後jobs配下のファイルやディレクトリをごそっとバックアップしておいたものに置き換えました
おそらく、この置き換えの動作を行ったときにシンボリックリンクからディレクトリに変わってしまったのだと思います
バックアップをzip圧縮で取っていたのでzipで圧縮した際にシンボリックリンクでは保存できずにディレクトリに置き換わったのだと思います

うーん、そもそもWindows使ってるほうが悪いとかそういう問題もありますが、公式でもディレクトリをコピーしてねって言ってるみたいだし、、、でもzip圧縮とかするとシンボリックリンクじゃなくなるみたいだし
zip圧縮しないでバックアップしとけってことですかね

2014年9月12日金曜日

改めてJenkinsのプラグインを開発する方法をまとめてみた

概要

過去にEclipseとMavenを使ってサンプルのプラグインを動作させる方法を紹介しました
JenkinsのプラグインはRubyでも書けるようになったようでいろいろと変わっていることもあるかなーと思い再びプラグインの作成方法をまとめてみました
でもまた、Java+Mavenで作っています
環境マシンはMacですが、Javaが動けばWindowsでもLinuxでも同様に開発はできるかと思います

環境準備

  • Mac
    Mac OS X 10.8.5
  • Java
    1.6.0_65
  • Maven
    3.2.3

プラグイン開発

Java+Mavenでプラグインの開発するための流れを紹介していきます

Mavenの設定

ユーザごとの設定を記述する~/.m2/settings.xmlに以下を追記します
ない場合は作成しちゃってください
すでにファイルがあり<settings>タグや<pluginGrups>タグがある場合は適切な場所に設定を追記してください

<settings>
  <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup>
  </pluginGroups>

  <profiles>
    <!-- Give access to Jenkins plugins -->
    <profile>
      <id>jenkins</id>
      <activation>
        <activeByDefault>true</activeByDefault> <!-- change this to false, if you don't like to have it on per default -->
      </activation>
      <repositories>
        <repository>
          <id>repo.jenkins-ci.org</id>
          <url>http://repo.jenkins-ci.org/public/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>repo.jenkins-ci.org</id>
          <url>http://repo.jenkins-ci.org/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <mirrors>
    <mirror>
      <id>repo.jenkins-ci.org</id>
      <url>http://repo.jenkins-ci.org/public/</url>
      <mirrorOf>m.g.o-public</mirrorOf>
    </mirror>
  </mirrors>
</settings>

詳しい内容はよくわかりません
Jenkinsのプラグインを作成するためのおまじない程度に認識しとけばOKだと思います

プロジェクトの作成

コマンド一発です

mvn -U org.jenkins-ci.tools:maven-hpi-plugin:create

いろいろなダウンロードが始まりますので完了するまで待ちます
完了するとgroupIdとartifaceIdを入力するように促されるので適当に入力します(以下ではgroupIdはデフォルトでartifaceIdは「test」としています)

Enter the groupId of your plugin [org.jenkins-ci.plugins]: 
Enter the artifactId of your plugin (normally without '-plugin' suffix): test

とりあえずビルド

cd test
mvn clean package

またものすごい勢いでダウンロードが始まります
ダウンロードが完了するとコンパイルしテストが実行され、その後プラグインの実体となるhpiファイルを作成してくれます

ls -ltr target/test.hpi
-rw-r--r-- 1 user staff 8176  9 10 14:48 target/test.hpi

サンプルの実行

せっかくビルドできてhpiファイルもできたので早速プラグインがJenkins上で動作するか試してみましょう

mvnDebug hpi:run

8080番でJenkinsが立ち上がります
Jenkins is fully up and running と表示されば起動完了です
ブラウザでhttp://localhost:8080/jenkinsにアクセスしてみましょう
当たり前ですが、8080番がすでに使われているとエラーになるのでnetstat等で使われていないことを確認してから実行してください
か、-Djetty.port=8090オプションを指定することでポートを変更することも可能です
そしてあまり関係ないが起動するJenkinsのバージョンがやや古い

このサンプルはビルド手順に「Say hello world」を追加し、ビルド時に指定した文字列を受け取って「Hello hogehoge!」という出力をコンソールに出すことができます
なので適当にジョブを作成してビルド手順に「Say hello world」を指定すればプラグインの動作を確認することができます
plugin-test.png

サンプルの拡張

せっかくなんでサンプルを使って独自の機能も追加してみます
修正するファイルは
src/main/java/org/jenkinsci/plugins/test/HelloWorldBuilder.java

src/main/resources/org/jenkinsci/plugins/test/HelloWorldBuilder/config.jelly
になります
config.jellyでUIを定義し定義したUIの部品をJavaで操作する感じです
global.jellyというファイルもありますが、これはJenkinsの管理 -> システムの設定に設定項目を表示するためのファイルとなります

すごい簡単な拡張ですが、名前以外に年齢も入力させてビルド結果に出力できるようにしてみましょう

UI拡張

まず、UIを拡張します
config.jellyに以下を追加します

<f:entry title="Age" field="age">
  <f:textbox />
</f:entry>

Nameと同様に1つテキストフォームを増やす命令となります
とりあえずこの状態だけ修正してUIを確認してもフォームが増えていることは確認できます

ロジック修正

次に、HelloWorldBuilder.javaを修正してUIから取得した値を表示させるようにします
内容的には年齢を表示するようのフィールドを宣言して、それに対するGetterの追加とコンストラクタの修正をします
あとはperformというBulderクラスから継承したメソッドで宣言したフィールド情報を表示します
部分的にですが、HelloWorldBuilder.javaに追記、修正した部分を記載します

  • フィールド追加
    フィールドを定義している箇所に以下を追加してください
private final String age;
  • コンストラクタ修正
    既存のコンストラクタを以下のように修正してください
@DataBoundConstructor
public HelloWorldBuilder(String name, String age) {
    this.name = name;
    this.age = age;
}
  • Getter追加
    Getterを定義している箇所に以下のGetterを追加してください
public String getAge() {
    return age;
}
  • perform追加
    既存のperformメソッド内でprintlnしている箇所に以下を追加してください
listener.getLogger().println(name +" is " + age + " years old.");

さらにAgeは数字だけを入力するように制限してみたいと思います
以下のバリデーションチェック用のメソッドを追記してください

public FormValidation doCheckAge(@QueryParameter String value) throws IOException, ServletException {
    if (value.length() == 0)
        return FormValidation.error("Please set a age");
    try {
        Integer.parseInt(value);
    } catch (NumberFormatException e) {
        return FormValidation.error("Isn't the type of int?");
    }
    return FormValidation.ok();
}

チェックしているのは文字数が0以上かと数字かどうかを判断しています
バリデーションエラーの場合は警告ではなく、エラーとしています

ビルド&実行

さて、作ったものを動かしてみましょう

mvn clean package
mvnDebug hpi:run

でビルド&実行します
動いている場合はCtrl+cで停止してから上記を実行してください
ジョブの設定で「ビルド手順の追加」を確認するとAgeが入力できるようになっています
Ageを指定して実行するとビルド結果にAgeの情報も出力されます
またフォーマットチェックも実装したので数字以外だとエラーが表示されることがわかると思います(ただ、エラーでもジョブの設定保存自体はできてしまうので飾りみたいな感じです)

完成版の実行イメージは以下の通りです

  • ビルド手順の追加にAgeが追加されている
    adding_parameter_age.png

  • 入力されたパラメータが数字でない場合エラーを表示する
    check_parameter_age.png

  • 実行結果にAgeの情報が追加されている
    age_appear_in_result.png

とりあえず今回はサンプルの実行と簡単な拡張方法を紹介しました
あとは作成したhpiファイルを稼働中のJenkinsに組み込む方法やJenkinsCIに取り込んでもらい一般公開する方法などやることはありますが、それはまた機会があれば紹介したいと思います

今回紹介した方法は基本中の基本の部分なのであとはリファレンスを読んだりググったりしながら独自のプラグインを開発してみてください
それでも開発につまる場合はGithubで公開されているプラグインのコードを見れください

参考リンク

2014年8月15日金曜日

Windows版のJenkinsで起動ポートを8080から変更する方法

インストールは公式で配布されているインストーラを使って実施しているものとします
またWindowsは2008R2を想定しています

  1. インストールディレクトリ配下の jenkins.xml の「--httpPort=8080」を変更
  2. Jenkins起動後「Jenkinsの管理」->「システムの設定」->「Jenkinsの位置」のポート部分を変更したポートに変更
  3. 管理ツール -> サービス でJenkinsを再起動

これで次にアクセスするときに8080以外のポートでアクセスできるようになります

2014年8月13日水曜日

Jenkinsを1.573にアップデートしたらSimple Theme Pluginが動いてなかった

プラグイン自体は問題なく動作するのですが
JenkinsのCSSやHTMLが変わっているようで独自定義したCSSの設定を変更する必要があるようです
前回、自分が紹介した記事では以下のようにCSSを設定するようにしていました
@charset "utf-8";

#main-table {
  background-image: url(jenkins_logo.png) !important;
}

#top-panel {
  background-image: url(topbar.png) !important;
}

これだとうまくヘッダーの画像とJenkinsおじさんの画像が変わらないようです
そして1.573では左下に表示されていたJenkinsおじさんがヘッダーのアイコン部分に移動してしまったので変更が厳しいです
なので
@charset "utf-8";

#header {
  background-image: url(topbar.png) !important;
}

みたいな感じでヘッダーの画像を設定するだけとなります
たぶんサイズがうまく合わないと思いますので、うまく合わせてあげてください

どうしても左上のJenkinsおじさんを変更したい場合はJavaScriptでHTMLを動的に変更するか
/static/c41db97a/images/jenkins-redbg.png
というファイルが存在すると思いますのでこれを自分の好みに合わせて直接変更しちゃってください
画像サイズは40x40みたいです

2014年7月25日金曜日

JenkinsのAPIを使ってジョブを作成してみた

P.S 20140826
curlを使ってジョブを登録する方法は下部の更におまけに追記しました



前回GET系のリクエストを試したので今回はPOST系を試してみました
Rubyを使ってジョブの登録を実施しています

実行するRubyスクリプトと同じディレクトリに下部に記載したconfig.xmlを配置して
実行してください

また、サンプルが job_list というファイルに記載されている登録したいジョブ名分
登録するようになっているので job_list というファイルも作成してください

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require 'net/http'
require 'json'

endpoint = "http://localhost:8080"

File.open("job_list").each {|f|
  path = "/createItem?name=" + f
  uri = URI.parse(endpoint + path)
  f = File.read("config.xml")
  
  header = {
    'Content-Type' =>'application/xml',
  }

  request = Net::HTTP::Post.new(uri.request_uri, header)
  request.body = f
  request.basic_auth 'username', 'password'
  
  #http = Net::HTTP::Proxy('proxy_host_name', '8080').new(uri.host, uri.port)
  http = Net::HTTP.new(uri.host, uri.port)
  http.start do |h|
    response = h.request(request)
    puts response.status
  end
}

<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description>this job is created by api</description>
  <keepdependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.scm.NullSCM"/>
  <canroam>true</canRoam>
  <disabled>false</disabled>
  <blockbuildwhendownstreambuilding>false</blockBuildWhenDownstreamBuilding>
  <blockbuildwhenupstreambuilding>false</blockBuildWhenUpstreamBuilding>
  <buildwrappers>
    <hudson.plugins.timestamper.TimestamperBuildWrapper plugin="[email protected]"/>
  </buildWrappers>
</project>

■おまけ CURLでジョブをビルドする方法
curl -X POST --user username:password http://localhost:8080/job/test_job/build

■おまけ CURLでパラメータ付きジョブをビルドする方法
curl -X POST --user username:password "http://localhost:8080/job/test_job/buildWithParameters?key1=value&key2=value"

■更におまけ CURLでジョブを作成する方法
curl -X POST --user username:password --data-binary "@config.xml" -H "Content-Type: text/xml" "http://localhost:8080/createItem?name=job_name"

■参考サイト

2014年7月23日水曜日

JenkinsのAPIを使ってみた

http://localhost:8080/ でジョブの一覧が見れるJenkinsで試した結果です
認証のユーザ情報は「Jenkinsのユーザーデータベース」を利用しています
簡単なGET系のリクエストのみとなります

環境
サーバ
Jenkins 1.517
CentOS 6.3

クライアント
Ruby 2.0.0

■CURLでリクエスト
curl --user username:password http://localhost:8080/api/json?pretty=true

■レスポンスサンプル
{
  "assignedLabels" : [
    {
      
    }
  ],
  "mode" : "NORMAL",
  "nodeDescription" : "the master Jenkins node",
  "nodeName" : "",
  "numExecutors" : 5,
  "description" : "description",
  "jobs" : [
    {
      "name" : "job001",
      "url" : "http://localhost:8080/job/job001/",
      "color" : "blue"
    },
    {
      "name" : "job002",
      "url" : "http://localhost:8080/job/job002/",
      "color" : "blue"
    }
  ],
  "overallLoad" : {
    
  },
  "primaryView" : {
    "name" : "view",
    "url" : "http://localhost:8080/"
  },
  "quietingDown" : false,
  "slaveAgentPort" : 0,
  "unlabeledLoad" : {
    
  },
  "useCrumbs" : false,
  "useSecurity" : true,
  "views" : [
    {
      "name" : "view",
      "url" : "http://localhost:8080/"
    },
    {
      "name" : "view02",
      "url" : "http://localhost:8080/view/view02/"
    }
  ]
}

■rubyから実施
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require 'open-uri'
require 'json'

uri = "http://localhost:8080/api/json?pretty=true"
auth = ['username', 'password']
#f = open(uri, {:http_basic_authentication => auth})
f = open(uri, {:http_basic_authentication => auth, :proxy => 'http://proxyname:8080/'})

json = JSON.parse(f.read)

json['jobs'].each { |i|
  p i['url']
}

ジョブのURL一覧がずらっと表示されます

特に認証を気にせずJSONでちゃちゃっと取得するだけならこれで十分そうですね
時間があればPOST系のリクエストも試してみたい

2014年5月27日火曜日

Jenkinsでnohupなジョブを作成する方法

所謂、並列処理をJenkinsで行う場合の設定例です
自分の場合は負荷テスト用のジョブを作成したかったのでそれをケースとして紹介します

また今回はシェルスクリプトを使ったテストを想定して並列テストを実施しました

■単一のジョブによる並列処理の実装
まずは非同期処理を実行することができるシェルスクリプトのジョブの設定から
for j in `seq 1 400`
do
  echo "nohup process ${j}"
  nohup sh sampleMulti.sh &
done

sleep 60;
これは400回ループをしsampleMulti.shをバックグラウンド実行させるジョブです
sampleMulti.shの処理にもよりますが最大で400プロセスが同時にバックグランドで動作します

ポイントは最後に「sleep 60;」を入れている部分

基本的にJenkinsは1つのジョブに対して1つのスレッドが動作します
なので1つのジョブ内でマルチプロセスな処理を実行させることはできないのですが
上記のように強制的にマルチプロセスを立ち上げると裏側では複数のシェルプロセスがちゃんと立ち上がります

なんですが、実はsleepを入れないでしまうとジョブを実行しているメインスレッドがforループを抜けたあとに即終了してしまいます
当たり前ですが、子プロセス(ループ内のシェルプロセス)を生成する親プロセス(ジョブ自信のスレッド)が
終了してしまうといくら実行中の子プロセスが存在していても子プロセスを強制的にkillしてしまいます

なので子プロセスの400のシェルがすべて完了するまで親プロセスのジョブは処理を待つ必要があります
普通マルチスレッドプログラミングをするときには「wait」みたいな関数が用意されており子プロセスの終了を
待ってから親プロセスを終了しますが、今回はその辺の実装を全部スルーして「子プロセスは60秒経てばすべて終了する」
という(良くなく)保証を基にジョブの設定をしています

sleepではなくwaitコマンドを使うことでシェルスクロプトでもマルチスレッドプログラム的なことをできそうなので
ちゃんと実装したい場合には軽く調べれば実装できると思います

■複数のジョブによる並列処理の実装
「sh sampleMulti.sh」を10並列、同時実行するジョブの設定を考えます

単純に「sh sampleMulti.sh」を実行するジョブを10個作成します
10個のジョブを(ほぼ)同時に実行するために「Build Pipeline Plugin」をインストールします

そして同時実行をトリガーにするためのジョブを1つ作成し、そのジョブの「ビルド後の処理の追加」で「他のプロジェクトのビルド」を設定します
設定するジョブは同時並行するジョブ10個を追加します
ジョブはカンマ区切りで指定できます
同一名称のジョブを指定しても1つのジョブとして扱われるので並列実行するジョブ名はすべて別名にしてください

最後に新規ビューで「Build Pipeline View」を作成し、トリガー用として作成したジョブを指定してビューを作成すればOKです
最終的なイメージは以下のようになります





これでトリガー用のジョブをキックすればそのあとで10個のジョブが同時並行されます

ちょっと説明が文字ばかりになってしまいわかりづらい点が多かったかもしれません。。すいません。。
どちらも長所短所がありそうですが、個人的には単一のジョブで実施するほうがいいかなと思います
理由としては単純にジョブの数が少なくて済むからです(後者は並列実行される数だけジョブを作成する必要があるのでダッシュボードがカオスになりそうだからです)

他にもやりかたはあるかと思いますので参考程度に見ていただければ幸いです

2014年4月29日火曜日

Jenkinsでビルドが失敗したらGmailに通知する方法

■環境
Windows7 64bit
Jenkins 1.560

■設定手順
1. SMTPメールサーバ(Gmail)の設定
Jenkinsの管理 -> システムの設定 -> E-mail 通知 の設定項目を開きます
「高度な設定」ボタンをクリックしSMTP認証に必要な情報を設定します
  • SMTPサーバー・・・smtp.gmail.com
  • SMTP認証・・・チェックON
  • ユーザ名・・・Gmailにログインするアカウント名
  • パスワード・・・上記アカウント名のパスワード
  • SSL・・・チェックON
  • SMTPポート・・・465
と設定します

2. ジョブ側の設定
既存のジョブでも新規のジョブでも問題ありません
ジョブの設定画面から「ビルド後の処理の追加」でE-mail通知を選択します
これはジョブが失敗した場合にメール通知するための設定でここにメールアドレスを設定します
メールアドレスはカンマ区切りで複数設定することも可能です
「不安定ビルドも逐一メールを送信」は必須ではないので適宜変更してください


以上で設定は完了です
これでジョブが失敗するとメールが通知されるようになります
通知が来ない場合はGmailの設定やACL(Gmailへのoutgoingなど)の設定を確認してみてください

通知機能はメールの他にもSNSやIMに対してもできるようです
また、プラグインで「Configuration Slicing Plugin」というプラグインがありこれをインストールするとメールを通知する設定を全部のジョブを一度に設定することができます

2014年2月19日水曜日

Jenkinsで他のJenkinsにジョブをインポートする方法

■実施方法
  1. Jenkinsのデータがある「jobs」ディレクトリ配下のジョブ名のディレクトリをコピー(またはリモードサーバに転送)
  2. 例えば「/root/.jenkins/jobs/job_name」など
  3. コピー(または転送)を実施したあとにインポートする側のJenkinsの再起動を実施
  4. コピーしたディレクトリ名のジョブをUI上で確認

以上です、簡単

上記の動作からJenkinsが同名のジョブを持つことができないのも納得かと思います
※同一ディレクトリ配下に同名のディレクトリを作成することはできないので

あとポイントとしてはディレクトリの権限で

Jenkins自体の動作はjenkinsユーザで行っているのにコピー作業をrootユーザで実施してしまったためにインポートしたジョブの権限がrootになってしまった

なんてことが発生しJenkinsがうまく起動できないことがあると思います
そんな場合は「chown -R jenkins:jenkins copy_job_name」などと実行してコピーしたジョブのディレクトリとその配下全体をjenkinsユーザの権限にしてから再起動すればOKです

基本的にJenkinsはディレクトリやファイルを元に動作しているので
これを応用してDropboxやGoogleDrive等のクラウドストレージサービスを使ってデータフォルダを共有すれば同じJenkinsデータを異なる端末で共有することもできると思います
※すいません、未検証です。。。

■参考サイト

2014年2月17日月曜日

Jenkinsで下流プロジェクトにビルドパラメータを渡す方法

■環境
Jenkins 1.525

■設定方法
1. Parameterized Trigger Plugin のインストール
Jenkinsの管理 -> プラグインの管理からParameterized Trigger Pluginを選択しインストールします
インストール完了後Jenkinsを再起動してください

2. 上流ジョブの作成
まずはビルドのパラメータを設定します
ジョブの設定の上部で「ビルドのパラメータ化」のチェックボックスをONにします
名前(変数名)やデフォルト値、説明は適当に設定してください


次にポイントの「ビルド後の処理の追加」で「Trigger parameterized build on other projects」を選択します


ビルド後の処理を追加したら
「Projects to build」
に下流のジョブをを設定します、ここでは下流のジョブを batch______test2 としています
下流ジョブを設定すると上流ビルドの終了後に自動で実行されるようになります
「Add Parameters」
も設定します、上流ジョブで設定されたパラメータを下流に渡すための「Current build parameters」を選択します
これで上流ジョブで設定されたパラメータを下流のジョブに渡すことができます


設定する箇所は以上です
あとは適宜必要なジョブの設定を追加してください

3. 下流ジョブの作成
特に設定することはありません、上流のジョブで設定されたパラメータを使用するビルドを作成してください
下流ジョブが自動で実行されるための設定は下流ジョブ側で実施する必要はありません
パラメータを使う方法は今回の場合だとパラメータの名前をTEXTと設定しているので「${TEXT}」のように使用します
適当にechoとかして表示するとパラメータが引き継がれていることがわかると思います

設定は以上で完了です
あとはBuild PipeLine Pluginがインストールされている場合は上流ビルドの流れをパイプラインで表示すると上流 -> 下流の流れが自動で設定されていることがわかるかと思います

2014年2月16日日曜日

Jenkinsを再起動する方法

http://jenkins-server-name/safeRestart/
とか
http://jenkins-server-name:8080/safeRestart/
とか
http://jenkins-server-name:8080/jenkins/safeRestart/

というURLにアクセスすると再起動を実施できます
ポイントはsafeRestartというパスにアクセスすると再起動できるというところです

Tomcat上で動作している場合は「service tomcat restart」等でJenkinsの再起動も可能ですが
chefでインストールした場合やwarを直接指定して動作させている場合にはプロセスを一度killしてから再度warを指定してJenkinsを起動する必要があります

それが面倒な場合にはURLでsafeRestartにアクセスすれば再起動を実施することができます
自分はいつもchefでJenkinsをインストールするので、トップ画面上部の説明の部分に再起動用のリンクを貼るようにしています
<a href="http://jenkins-server-name:8080/safeRestart">Jenkins再起動</a>

2014年2月14日金曜日

Jenkinsでワイルドカードを使う方法

■環境
Jenkins 1.550

■使い方
ワイルドカードを使いたい場合はフルパスを使ってアスタリスクを指定します
厳密に言うと「実行したジョブのworkspaceがカレントディレクトリ」になっているのでそこからの相対パスで指定すれば絶対パスである必要はありません

pwd コマンドのみを実行するビルドの結果を見てみるとカレントディレクトリが実行したジョブのworkspace配下であることがわかります


なので例えば「/var/tmp/test/」配下のファイルをすべて削除するというビルドを作成する場合は
「rm /var/tmp/test/*」
と指定するか
「rm ../../../../../var/tmp/test/*」
とする必要があります

カレントディレクトリの場所を把握して、相対パスで指定するのが面倒かなと感じたので冒頭で「フルパスを指定します」と書いた次第です
ちょっとはまりそうだったのでメモとして残しておきました

2014年2月10日月曜日

GithubのWebHookを使ってJenkinsのビルドを実行する方法

■概要
Githubはpushしたときにいろいろなサービスに「pushした」ということを通知する機能(Service Hooks(WebHook))があります
今回はWebHookの機能を使ってpushされたらビルドを実行するという流れをJenkinsで実現したいと思います

■環境
Windows Server 2008R2
Jenkins 1.549
※JenkinsサーバがWindows上で動作している環境で試しました
※Linux上のJenkinsでも問題なく動作するかと思います

■設定方法
1. Githubプラグインのインストール(Jenkins側設定)
Jenkinsの管理 -> プラグインの管理 -> 利用可能
で右上の検索窓に「github」と入力します
絞りこまれた一覧の中に「GitHub Plugin」という名前のプラグインがありますのでチェックしダウンロードして再起動後にインストールをクリックしてインストールを開始します
自動でインストールが始まりますので完了するまで待ちます

2. WebHookで実行するジョブの作成(Jenkins側設定)
Jenkins上でWebHookされた場合に実行するジョブを作成します
ジョブ作成時のポイントは
  • GitHub project の欄にリポジトリのURLを記載します、記載するURLはブラウザで表示する際のURLを入力してください
  • ソースコード管理 -> Git で GithubのgitリポジトリのURLを記載します、git://から始めるURLを記載してください、git clone用のURLの「https://」の部分を「git://」に変更すればOKです
  • ビルド・トリガ -> Build when a change is pushed to GitHub のチェックボックスをONにします
あとはいつも通りビルドを作成すれば大丈夫です

3. WebHookの設定(Github側設定)
WebHookを実施するリポジトリに設定します
リポジトリのトップ画面から右側にあるSettingsをクリックします


遷移した画面左側、Service Hooksをクリックします


WebHook可能なサービスの一覧が表示されますので中段より下のほうにある「Jenkins(GitHub Plugin)」をクリックします


Jenkins Hook Urlに通知を送信するJenkinsサーバのエンドポイントを入力します
hostnameやportは適宜変更してください、パスの後ろに記載されている「github-webhook/」は必ず入力してください
ActiveのチェックボックスをONにします


入力が完了したらUpdate settingsをクリックします
今回、JenkinsのGithub Pluginを使用していますが、その場合に後ろのパスの部分は必須の項目となります
またサンプルのURLはhttpで接続しています、どうやらhttpsだと証明書の関係等でうまく通知が受け取れないことがあるので、できればhttpで受け取ってください

4. GithubからのIPを許可する
これでGibHubからJenkinsサーバに通知が来るようにはなりました
FW等でアクセス拒否をしている場合にはGithubのIPアドレスを許可する必要があります
GithubのIPアドレスはGithubのMetaAPIで確認することが可能です
https://api.github.com/meta
2014/02/06時点では「192.30.252.0/22」が返却されました
WebHookからビルドがうまく動かくなった場合はIP変わっている可能性もありますので定期的に確認してみてください

5. 動作確認
GithubからWebHookのテストを実行することが可能です
JenkinsのURLを設定した画面で「Test Hook」をクリックするとJenkins側に通知を送信することができます
「Test payload deployed!」と表示されればGithub側は通知したことになります(あくまでも通知をしたということだけがわかるので、ちゃんとJenkins側が受け取っているかはここではわかりません)

Jenkins側に戻って設定したジョブから「GitHub Hook Log」を見るとTest Hookしたログが残っているかと思います
また同時にビルドが実行されていることも確認できるかと思います
ビルドされる条件はもちろんWebHookが来たらなのですが、gitの情報が変更されていない場合はビルドは実行されません
なので連続でTest Hookを実行してもgitの情報は変更されていないため連続でビルドは実行されません

以上です、githubのソースコードをCIするための基本となる動作を紹介しました

2014年2月4日火曜日

Travisを使ってみた

■概要
Travisとはgithubと連携したオープンなCI(Continuous Integration)ホスティングサービスです
JenkinsのようなCIサーバを独自で構築する必要がなくなるというのがメリットです
Githubのアカウントが必須となりますのでお持ちでない方はまずはGithubのアカウントを作成してください

■使い方
1. Travisへのログイン
https://travis-ci.org/
にアクセスします
右上の「Sign in with Github」をクリックします

※クリックすると拡大されます

GithubのOAuthのページにリダイレクトされるのでTravisからのアクセスを許可します

2. WebHook機能のON
初回ログイン時にはTravisがGithubからリポジトリの情報を取得するため多少時間がかかります
リポジトリの情報の取得が完了すると以下のようなリポジトリ一覧が表示されるかと思います


Travisと連携したい自分のリポジトリを選択し右側のON/OFFトグルボタンをONにします


これでGithubとTravisとのWebHookによる連携が完了しました、WebHook機能を使うことでGithubにpushされた情報をTravis側に通知してあげることができます、それによりpushをトリガーとしてTravisが自動実行されるようになります

3. .travis.ymlファイルの作成
Travisと連携したリポジトリのルート直下に「.travis.yml」ファイルを作成します
.travis.ymlファイルはTravis上で実行するビルドのルールを記載するものです
今回はJavaのリポジトリをTravisでビルドさせるために以下のように.travis.ymlファイルを記載しました
language: Java
jdk:
  - oraclejdk7
  - openjdk6
  - openjdk7
.travis.ymlの書き方は参考サイトに記載されているGetting Startedのページに各言語ごとの簡単なサンプルが記載されています
また、そこから各言語ごとの詳細な設定方法のページへもリンクしているので詳細はそちらを御覧ください

今回設定したのサンプル通りですが、見ての通りJDKを複数バージョン指定することができます
Travisは指定したバージョン分ビルドを実行してくれるため所謂、クロスプラットフォーム分散ビルド的なこともTravis上で実現することが可能となっています
(いちいち各バージョンごとのビルド環境を構築するのって大変ですからね。。。)

4. git push
あとは作成した.travis.ymlファイルをGithubにコミットすれば完了です
WebHookの情報はすぐにTravis側に通知されるようなのでTravis側のビルド結果を確認してみましょう


結果の詳細を確認することができるかと思います
各JDKごとのビルド結果を見れることはもちろん、Jobからリンクを辿って確認すれば実際に裏側で実行されたコマンドベースの結果を閲覧することも可能です

今回は残念ながら全部のビルドが失敗しているようですが、コマンドの結果を見てみるとSeleniumのテストをmaven経由で実行しておりX環境がないためにエラーとなっていました
https://travis-ci.org/kakakikikeke/java-selenium-ui-test/jobs/18171596
いろいろ調べてみるとSeleniumのようなUIテストもTravis上で実行する方法があるようなので次回Seleniumを実行する方法でも紹介できればと思っています

今回紹介する内容は以上です
基本中の基本の部分だけなのであとはビルドの内容をどうするかをもっと詳細に決めていく必要があります

■Tips
プライベートリポジトリに対応したプライベート版のTravisもあるようです、プライベート版は有料でご利用できます
基本的にTravisはパブリックなサービスなのでビルド結果は誰でも閲覧することが可能となっています
なのでパスワードや見られてはいけない情報などがビルド結果に出ないように注意してください

今回実はmavenプロジェクトだったのですが、.travis.ymlファイルにmavenプロジェクトであることを記載していないのに自動でmavenビルドしてくれました
仕組みは詳しく調べていないので分かりませんが、pom.xmlファイルの存在等を調べて自動で判断してくれているのかもしれません

■参考サイト

2013年11月14日木曜日

Jenkinsからメモ帳を開く方法

■概要
Jenkinsのビルドでnotepad.exe等を指定するとバックグランドでメモ帳が開かれて見ることができません
今回はJenkinsがバッググラウンドで開いたnotepad.exeを見る方法を紹介します

■環境
Windows7 64bit
Jenkins 1.538

■設定方法
1. スタート -> すべてのプログラム -> 管理ツール -> サービスからJenkinsサービスのプロパティを開く
(ローカルコンピュータ)Jenkinsのプロパティダイアログが表示されます
ログオンタブを開いてローカルシステムアカウントの「デスクトップとの対話サービスに許可」をONにします
以下のようにしてください

2. Jenkinsを再起動します
先ほどの管理ツールから「サービスの再起動」を実施すればOKです

3. メモ帳を開くビルドの作成
適当に作成します
ポイントとしては「Windowsバッチコマンドの実行」ビルドを以下のように設定します

作成できたらそのままビルドを実行します

4. 対話型サービスの検出からメッセージを表示する
ビルドを実行するとタスクバーに「対話型サービスの検出」というタスクが出現します
ここで「メッセージの表示」をクリックします

5. バックグラウンド側の状況を確認する
するとJenkinsが実行されているバックグラウンドの状況を確認することができます
別のデスクトップが立ち上がるイメージでそこに実行したメモ帳が開かれていることが確認できると思います
※スクリーンショットが取れなかったので実写になっています

このデスクトップ上で開かられているメモ帳を閉じるとJenkins側のジョブも終了します
ジョブはnotepad.exeが開かれている間実行され続けますので、上記画面で閉じるかtaskmgrからプロセスを強制的に停止する必要があります

いちおうこれでJenkinsからメモ帳や他のGUI系のアプリを開くことができるようになりましたが、
毎回、対話型サービスの検出を表示するとしないと表示されないので結構微妙かもしれません
他のやり方があるといいのですが。。

■参考サイト

2013年11月13日水曜日

Windows上のJenkinsでjavaが実行できない

前回
http://kakakikikeke.blogspot.com/2013/08/windowsjenkins.html
の記事でWindows上で実行する際の注意事項を紹介しましたが
どうやらJenkinsが読みにいく環境変数が「ユーザ環境変数」ではなく「システム環境変数」を読みに行っているようです
原因としては環境変数周りなのですが、今回は現象として以下のようなことが確認できました

■現象
  • Jenkinsをローカルシステムではなくログインしているユーザのプロセスとして立ち上げてもシステムの環境変数を読みに行っている
  • そのためJenkins上でユーザ環境変数が有効になっていない
  • システムの環境変数のPATHにJAVA_HOME変数を使ってPATHが設定してあった
  • システムの環境変数側にJAVA_HOME変数の定義がなかった
  • なのでシステム環境変数側のPATHにjavaコマンドまでのパスがうまく通っていなかった

■対策
  • システム環境変数側のPATHに設定してあるをjavaコマンドまでのパスをJAVA_HOME変数で参照するのではなくちゃんとパスを入力してあげた(C:\からはじまるパス)
  • 上記はシステム環境変数側にJAVA_HOME変数を追加してあげても対応可能かと思われます
  • Jenkinsを再起動し、うまくjavaコマンドが動作することを確認した(再起動しないと環境変数も反映されないようです)

Windows上でJenkinsを動かす場合は環境変数周りで苦しめられそうです
環境変数にスペースとか入っているとそれが原因でうまく変数が読み込めないみたいなこともありそうです。。。

2013年10月16日水曜日

Jenkins経由でjekyll buildを実行すると「invalid byte sequence in US-ASCII」

ジョブにシェルの実行を一個追加して jekyll コマンドを実行する前に

export LANG=ja_JP.UTF-8

を追加すれば解決した
需要はないだろうが備忘録として