Jenkinsプラグイン開発ノウハウ3 - リリース

## Jenkinsプラグイン開発ノウハウシリーズ
1. [Jenkinsプラグイン開発ノウハウ1 - 環境構築](http://qiita.com/sona-tar/items/e6d7ebb5470236a0cc50)
2. [Jenkinsプラグイン開発ノウハウ2 - 開発とテスト](http://qiita.com/sona-tar/items/933e55594bfed757fe8d)
3. [Jenkinsプラグイン開発ノウハウ3 - リリース](http://qiita.com/sona-tar/items/45eae75eb5f91f4ebf55)


## 1. Jenkins Pluginの動作確認

リリースする前に`mvn run`からの実行ではなく、実際に生成されたバイナリをJenkinsに配置して動作確認をしてみましょう。

### 1.1. Jenkinsのインストール
今回は動作確認にDockerコンテナのJenkinsを利用してみます。
MacでDockerを使うためにDocker for Macをインストールします。

- [Getting Started with Docker for Mac](https://docs.docker.com/docker-for-mac/)

続いてターミナルを開きます。

以下のようにDockerが使えるようになっていることを確認できます。

```zsh
$ docker --version
Docker version 1.12.0-rc2, build 906eacd, experimental

$ docker-compose --version
docker-compose version 1.8.0-rc1, build 9bf6bc6
```

続いてJenkinsをdocker-composeで起動したいと思います。
作業フォルダを作って`docker-compose.yml`を作成しましょう。

```zsh
$ mkdir -p ~/docker/jenkins
$ cd ~/docker/jenkins
$ mkdir jenkins_home
$ cat << _EOF_ > docker-compose.yml
app:
  image: jenkins
  container_name: jenkins
  ports:
   - "50001:8080"
  volumes:
   - ./jenkins_home:/var/jenkins_hom
  environment:
   - JENKINS_OPTS=--prefix=/jenkins
_EOF_
```

```zsh
# 起動
$ docker-compose up -d
# 実行できていることを確認
$ docker-compose ps
```

http://localhost:50001/jenkins/ にアクセスするとJenkinsに繋がります。

![jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/54186/084d1bfa-d652-bc06-4620-fe32fc6b9f3e.png)

### 1.2. 作成したプラグインを配置
続いて自分で作成したプラグインをインストールしたJenkinsに配置してみましょう。

```zsh
# 1度Jenkinsを起動するといくつかのファイルが作成されます。
$ ls jenkins_home
Download metadata.log		nodeMonitors.xml		secrets/
copy_reference_file.log		nodes/				updates/
hudson.model.UpdateCenter.xml	plugins/			userContent/
identity.key.enc		queue.xml.bak			war/
init.groovy.d/			secret.key
jobs/				secret.key.not-so-secret
# 作成したプラグインをJenkinsに配置
$ cp ~/jobcreate-builder-plugin/target/jobcreate-builder.hpi jenkins_home/plugins/
```

http://localhost:50001/jenkins/restart にアクセスするとJenkinsを再起動することが可能です。もちろん`docker-compose restart`でも問題ありません。

![jenkins_restart.png](https://qiita-image-store.s3.amazonaws.com/0/54186/11a6b270-47eb-e7fc-4cdd-c4f9af53ea6d.png)


### 1.3. プラグインの動作確認

http://localhost:50001/jenkins/ にアクセスしてインストールしたプラグインが動いていることを確認しましょう。

JenkinsのUIでは**適当な名前でジョブを作成 -> ジョブの設定 -> ビルド手順の追加 -> ジョブの作成**という項目があればインストールに成功しています。

![jobcreate01.png](https://qiita-image-store.s3.amazonaws.com/0/54186/f37e8376-cce8-6c05-8aec-c2b82ee92e84.png)


## 2. リリース
JenkinsのプラグインはGithubのjenkinsciグループで管理されています。
https://github.com/jenkinsci/

自分のアカウントでリポジトリを作り、その後にjenkinsciにforkをしてもらう必要があるのでその手順を紹介したいと思います。

### 2.1. Jenkinsユーザグループアカウントの作成
https://jenkins-ci.org/account/

### 2.2. リリース準備
今まではサンプルプラグインで開発を進めてきたので、もし実際に自分で開発してリリースする際にはいくつかのルールに従って`pom.xml`を修正が必要になります。

以下修正するべきポイントで自分が作成したプラグインに合わせて修正してください。
プロジェクト名はGithubのリポジトリ名とは異なり、アッパーキャメルケースで、単語の接続はスペースを用います。
一部省略

```xml:pom.xml
<artifactId>jobcreate-builder</artifactId>

<name>JobCreate Builder Plugin</name>
<description>Sample Jenkins plugin for Japanese.</description>
<url>https://wiki.jenkins-ci.org/display/JENKINS/JobCreate+Builder+Plugin</url>

<developers>
  <developer>
    <id>YOURID</id>
    <name>YOURNAME</name>
    <email>YOUREMAIL@gmail.com</email>
  </developer>
</developers>
```



### 2.3. Githubリポジトリの作成
JenkinsプラグインのGithubリポジトリ名は習慣として、小文字で単語の接続には-を使うということが決まっているので、このルールに従い作成しましょう。

またリリースに必要なファイルは`src/`と`pom.xml`のみになります。他の生成されるようなファイルは`.gitignore`に登録してしまいましょう。


```zsh
$ cd jobcreate-builder
$ cat << _EOF_ > .gitignore
target/
.project/
.classpath/
work/
.settings/
.idea/
*.iml
_EOF_
$ git init
$ git add -A :/
$ git commit -m "First commit"
// hubコマンドを使っていない方はGithubにアクセスしてリポジトリを作成してください。
// hubコマンドはhomebrew install hubでインストール可能です。
$ hub create 
$ git push -u origin master
```

### 2.4. fork、issue trackerへのcomponent追加依頼
Jenkinsプラグインはjenkinsciグループ以下でリポジトリを管理します。
またJenkinsの各プラグインのissueはGithubのissueではなく[Jenkins - JIRA](https://issues.jenkins-ci.org/projects/JENKINS)で管理されています。

これらを作成する権限はない方は、以下の[日本Jenkisユーザ会のGoogleグループ](https://groups.google.com/forum/#!forum/jenkinsci-ja/)でforkとissue trackerへのcomponentの依頼を出します。

またfork依頼をする前に[Jenkins コミッタになる前に気をつけるべき、たった 1 つのこと - Kenichi Maehashi's Blog](http://blog.kenichimaehashi.com/?article=13545499920)を参考に、参加グループのリポジトリを自動的にwatchとなる機能をオフにしておきましょう。
これを実施しないとfork依頼が受領されるとともにjenkinsciグループに参加することとなるため大量のメールに悩まされることになります・・・

forkしてもらうと同時にGithubのjenkisciグループへの招待メールが届くので参加してください。

数日するとforkの権限を持っている方がforkをして連絡をくれます。

### 2.5. リリース

```zsh
$ git clone https://github.com/jenkinsci/jobcreate-builder-plugin.git
$ cd jobcreate-builder-plugin
$ mvn release:prepare release:perform
```

リリースに成功したかどうか確認してみましょう。

Jenkins -> Jenkinsの管理 -> プラグインの管理 -> 利用可能 -> http://localhost:50001/jenkins/pluginManager/available
リリース直後に反映はされません。私は、一晩寝て起きたらリリースされていました。
Jenkinsを終了している場合にはもう1度Dockerのターミナルを開いて、`docker-compose.yml`があるディレクトリに移動して`docker-compose up -d`を実行してください。

### 2.6. プラグインのCI
リリースしたプラグインは以下のJenkinsでCIが実行されています。
自分のプラグインが存在することを確認してみましょう。
https://jenkins.ci.cloudbees.com/job/plugins/


### 2.7. Wikiの作成

Jenkinsのプラグイン紹介やChangeLogなどはWikiで管理するのがルールと成っています。

- 1. [Jenkins Wiki](https://wiki.jenkins-ci.org/)にアクセス
- 2. Add -> Pageをクリック
![wiki1.png](https://qiita-image-store.s3.amazonaws.com/0/54186/02904e70-4100-ff0d-8669-a12fa598c178.png)
- 3. ページタイトルとページコンテンツを入力  
タイトル JobCreate Builder Plugin  
コンテンツ

```text
{hudson-plugin-info:pluginId=jobcreate-builder}

{excerpt}
This plugin to create jobs in a build step.

h1. Change Log

h2. Version 1.0 (Sep 23, 2015)

Initial release
```
- 4. Locationを`Jenkins > Plugins`と設定
- 5. Labelをプラグインの特徴に合わせて設定
[All Labels - Jenkins Wiki](https://wiki.jenkins-ci.org/labels/listlabels-alphaview.action?key=JENKINS)を参考にしてみてください。特に右にある**Popular Labels**
Labelを正しく設定して少し待つと[Jenkins Wiki - Pluings](https://wiki.jenkins-ci.org/display/JENKINS/Plugins)の一覧に表示されるようになります。
- 6. save

## まとめ

以上でJenkinsプラグイン開発でフローは全て完了です。
みなさんの参考になれば幸いです。

## 参考
[日本語公式プラグイン開発チュートリアル](https://wiki.jenkins-ci.org/display/JA/Plugin+tutorial)
[日本語公式リリース手順](https://wiki.jenkins-ci.org/display/JA/Hosting+plugins)
[Jenkinsプラグインを公開する - Qiita](qiita.com/kazuqqfp/items/41c7481c4a4c1c6a1653)
[Jenkins Pluginを作成してみた。 - Qiita](http://qiita.com/ukiuni@github/items/0e164ac69b4f3c9ac56a)
[Jenkinsプラグイン開発～リリースまで～ - wadatkaの日記](http://d.hatena.ne.jp/wadatka/20120118/1326903499)