EC2のDockerでJenkinsを立ち上げてBacklogのgitリポジトリと連携してCIする

## 概要

- 動機：EC2でDocker使ってJenkinsする資料が意外と少ないなあ
- 対象読者：初めてJenkinsでデプロイをする人に向けて書きました
- 注意：あまりDockerらしいことはしてません

### 目次
1. EC2にDockerをインストール
- DockerでJenkinsを起動
- Webサーバを下準備（動作確認用）
- Backlogを設定する
- Jenkinsにプラグインを入れてデプロイする
- BacklogのWebHookを使ってJenkinsにデプロイさせる

## DockerでJenkinsを起動

EC2にインスタンスを作成する(t2.microで十分)

```bash
$ sudo yum install -y docker
$ sudo service docker start
$ sudo usermod -a -G docker ec2-user
```
コマンド実行後に再度ログインし直す。(ec2-userの所属グループを変更したため)

```bash
sudo mkdir /var/jenkins_home && sudo chown 1000 $_
docker run -d -p 8080:8080 -v /var/jenkins_home:/var/jenkins_home jenkins
```

これでJenkinsが起動しました。上のコマンドではJenkinsの永続化ディレクトリをホスト側の/var/jenkins_homeにして、コンテナ側の/var/jenkins_homeに割り当ててます。chownしているのはコンテナ側のJenkinsユーザ(ID1000)が読み書きするからです。

このときブラウザで確認してJenkinsの画面が開いていればOKです。このJenkinsをこのまま運用継続する予定ならばセキュリティを有効化してください「Jenkinsの管理」→「グローバルセキュリティの設定」→「セキュリティを有効化」。

![ダッシュボード__Jenkins_.png](https://qiita-image-store.s3.amazonaws.com/0/75613/12ee17c5-4281-4d20-3da1-eef63a4915de.png)

また永続化ディレクトリは下記のように書き込まれています。※Dockerホストでコマンド実行してください。

```bash
[ec2-user@ip-10-0-69-69 ~]$ ls /var/jenkins_home/
Download metadata.log          init.groovy.d     plugins                   secrets
copy_reference_file.log        jobs              queue.xml.bak             updates
hudson.model.UpdateCenter.xml  nodeMonitors.xml  secret.key                userContent
identity.key.enc               nodes             secret.key.not-so-secret  war
```

## Webサーバを下準備（動作確認用）

EC2にインスタンスをもう一つ作成する(デプロイ先のサーバすでにあれば不要)

```bash
$ mkdir html
$ touch deploy.sh && chmod +x $_
$ vi deploy.sh
    #!/bin/bash
    /bin/cp -rf html/* /var/www/html/
$ sudo yum install -y httpd
$ sudo chkconfig httpd on
$ sudo chown apache.apache /var/www/html
$ sudo chmod g+w /var/www/html
$ sudo usermod -a -G apache ec2-user
```

コマンド実行後に再度ログインしてから下記コマンドで、deploy.shが出来るか確認する。この時もしできなければ、パーミッションなどを確認してください。

```bash
$ echo '<html><body>hello world' > html/index.html
$ ./deploy.sh
$  sudo service httpd start
```

ブラウザで確認して「hello world」がでればデプロイの準備はOKです。

![52_69_147_156.png](https://qiita-image-store.s3.amazonaws.com/0/75613/8e5728b0-9ef6-c365-5eff-5b833d07feca.png)

※補足：cpコマンドでローカルファイルをコピーしてデプロイしてるだけです。これはけして良い習慣ではありません。rsync、git pull、アプリでCapistranoするなど改善の余地があります。

## Backlogを設定する

Backlogでgitリポジトリを作って、ソースコードをpushしておいてください。
この時点ではWebフックURLを設定しません。
たぶんリポジトリのSSHは下記のようになっているはずです。

```
****@****.git.backlog.jp:/**PJ_NAME**/**REPO_NAME**.git
```

## Jenkinsにプラグインを入れてデプロイする

### デプロイの概要

デプロイ方法は様々ですが、シンプルに下記のようにします。

1. gitリポジトリからcheckout
- checkoutしたファイルをJenkinsからWebサーバへ転送
- Webサーバにあるdeploy.shを起動してデプロイ

### 「Publish over SSH」のインストール
利用するプラグインは「Publish over SSH」です。
下記の手順でインストールします。

1. 「Jenkinsの管理」→「プラグインの管理」→「利用可能タブ」
- フィルターに「ssh」→「Publish Over SSH」をチェック
- 「再起動せずにインストール」を押下

![アップデートセンター__Jenkins_.png](https://qiita-image-store.s3.amazonaws.com/0/75613/312f8493-d409-7b81-3f0c-86040f6dbce1.png)

プラグインのインストールが成功したら

1. 「Jenkinsの管理」→「システムの設定」
- 「Publish over SSH」→「Key」にWebサーバへログインするためのキーをテキストで貼り付ける※もしまだセキュリティを有効化してなければしたほうが良い
- 「SSH Servers」→「追加」を押下
- 「Name」にわかり易い名前、「Hostname」にWebサーバのローカルIPアドレス、「Username」にec2-userなどを入力し、「Test Configration」を実行
- Successが表示されればOK
- 「保存」を押下

### gitのインストール

前述と同様の手順で「GIT plugin」をインストールする。
Backlogのgitリポジトリにアクセスできるように秘密鍵をJenkinsに登録する。

1. 「認証情報」→「グローバルドメイン」→「認証情報の追加」を押下
- 「SSHユーザ名と秘密鍵」を選択
- 「ユーザ名」を入力(Backlogのgitへアクセスできるユーザ名
- 「秘密鍵」→「直接入力」を選択し、鍵に秘密鍵を貼り付ける(Backlogのgitへアクセスできるユーザの公開鍵とペアとなっている秘密鍵)
- 「OK」を押下

### ジョブを作ってデプロイする

1. 「新規ジョブ作成」→「ジョブ名」を適当に入力し、「フリースタイル・プロジェクトのビルド」を選択して、「OK」を押下
- 「ソースコード管理」→「Git」を選択
- まず「Credentials」に先ほど作った認証情報を選択
- 次に「Repository URL」にBacklogのリポジトリーURLを入力する(```****@****.git.backlog.jp:/**PJ_NAME**/**REPO_NAME**.git```みたいなURL)
- 「ビルド」→「ビルド手順の追加」→「Send files or execute commands over SSH」を選択
- 「SSH Server」→「Name」にWebサーバの情報を選択(出てこない場合は「Publish over SSH」の設定を見なおしてください)
- 「Transfers」→「Transfer Set」→「Source files」に「```*```(すべてのファイルを指す)」を入力
- 「Transfers」→「Transfer Set」→「Remote directory」に「html」を入力
- 「Add Transfer Set」を押下
- 「Transfer Set」→「Exec command」に「./deploy.sh(Webサーバにあるデプロイスクリプト)」を入力
- 「保存」を押下

あとはビルド(いま設定した内容)が通るかテストしましょう。成功すれば、おめでとう！Webサーバにgitリポジトリに登録してあるファイルがデプロイされます。

## BacklogのWebHookを使ってJenkinsにデプロイさせる

最後にWebHookを設定しましょう。
Backlogのgitリポジトリの編集を行い「WebフックURL」に```http://IPアドレス:8080/git/notifyCommit?url=****@****.git.backlog.jp:/**PJ_NAME**/**REPO_NAME**.git```を入力して保存してください。

また、先ほど作ったビルドの「設定」→「ビルド・トリガ」→「SCMをポーリング」をチェック(スケジュールは何も入力する必要はありません)→「保存」を押下してください。

gitリポジトリにpushしたあと、ビルドが走ってデプロイが動作すれば、これにてシンプルなCIが完成です。おめでとう！