GitlabプロジェクトとJenkinsジョブの連携方法

GirlabとJenkinsを連携させる機会がありましたので、備忘録を兼ねて残します。
結構端折っていたり、オレオレルールがあると思います。
ご指摘等々ありましたら、お教え頂ければ幸いです。

## 前提条件

* GitlabとJenkinsのソフト間の連携が完了済みであること
* GitlabにJenkinsの情報を投稿するための専用ユーザを作成し、sshキー登録等が完了済みであること
* Jenkins内で、Gitlabからアクセスができるユーザの認証情報を作成していること
* Jenkins内で、GitlabにJenkinsの情報を投稿するための専用ユーザのAPIアクセストークンが登録済みであること  
(この辺は[参考参考](#%e5%8f%82%e8%80%83%e8%b3%87%e6%96%99)を参照。)

### ソフトウェアバージョン情報

#### Gitlab

Community Edition 11.10.4

#### Jenkins

2.164.3

## 説明すること

簡単(低レベル)なGitlabとjenkinsの連携。
GitlabでMerge Request(Pull Request)を送ったらJenkinsで自動ビルドを行い、その結果がMerge Requestに反映されるまで行う。
低レベル : テスト等しない

## 説明しない事

テストツール等の連携方法。

## 注意事項

URLのhttps等については使用しているシステムに依存する。

## 手順 (Gitlabの手順はG、Jenkinsの手順はJを付けている)

1. [G-プロジェクト作成](#g-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e4%bd%9c%e6%88%90)
2. [G-プロジェクトメンバにjenkinsを追加](#g-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%83%a1%e3%83%b3%e3%83%90%e3%81%abjenkins%e3%82%92%e8%bf%bd%e5%8a%a0)
3. [J-ジョブ作成](#J-ジョブ作成)
4. [J-APIトークン作成](#J-APIトークン作成)
5. [G-Webhook作成](#g-webhook%e4%bd%9c%e6%88%90)
6. [G-マージリクエスト発行](#g-%e3%83%9e%e3%83%bc%e3%82%b8%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e7%99%ba%e8%a1%8c)
7. [J-ビルド結果確認](#j-%e3%83%93%e3%83%ab%e3%83%89%e7%b5%90%e6%9e%9c%e7%a2%ba%e8%aa%8d)

## G-プロジェクト作成

ここでは特別な設定はなし。

## G-プロジェクトメンバにjenkins用ユーザを追加

権限を`developer`以上にする。 (プロジェクト内でコメント等行うため。)

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/1ba43214-e20d-4d59-b741-47b0efaf04c9.png" width="70%"></img></div>

## J-ジョブ作成

### 新規ジョブ作成

`ダッシュボード(左上のJenkinsを押下したときに表示される画面)` -> `新規ジョブ作成`。
`<Jenkins URL>/view/all/newJob`
ジョブ名を入力し、ジョブの種類を選択して`OK`ボタンを押下。
今回は`フリースタイル・プロジェクトのビルド`を選択。

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/86f4f046-184c-0772-dd19-fbe146611bf0.png" width="70%"></img></div>

### ジョブ設定 (記述していないものについては設定変更しない)

#### ソースコード管理

Gitを選択。

* リポジトリ
  * リポジトリURL  
    `git clone`するときのURL。
  * 認証情報  
    Gitlabからアクセスができるユーザの認証情報を選択する。  
    接続できるかどうか自動で判別してくれる。  
    接続できなければ赤文字でその旨が表示される。
  * ビルドするブランチ
     * ブランチ指定子  
      プロジェクトの運用方法に応じて設定。  
      今回は`**`(全て)を入力。

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/5c441460-c790-f81c-0492-70e42fdf4fc9.png" width="70%"></img></div>

#### ビルド・トリガ

プロジェクトの運用方法に応じて設定。
今回は`Build when a change is pushed to GitLab. GitLab webhook URL: <URL>`をチェック。

* Enabled Gitlab triggers  
  プロジェクトの運用方法に応じて設定。  
  今回は、Merge Requestを open / 再open した時のみビルドするようにしたかったため以下のように設定した。
  * Push Events  
    チェックを外す。
  * Approved Merge Requests (EE-only)  
    チェックを外す。
  * Comments  
    チェックを外す。

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/3b223277-240d-f036-1368-b1ffb04c0edb.png" width="70%"></img></div>

#### ビルド環境

プロジェクトの運用方法に応じて設定。
今回は`ビルド開始前にワークスペースを削除する`をチェック。

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/8a2cc0d5-4f9c-2d5c-c8b5-bc4abdff9023.png" width="70%"></img></div>

#### ビルド

テスト等設定できるが、今回はしない。
簡単に連携を確認するだけなので、`ビルド手順の追加`ボタンを押下して`シェルの実行`を選択し、以下コマンドを記入。

``` shell
echo "Hello world"
```

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/1b4d9d04-d46f-8215-abd0-f4e916a2c2ca.png" width="70%"></img></div>

#### ビルド後の処理

ビルドが成功したかどうかをGitlab上のMerge Requestに記述したいので、`ビルド後御処理の追加`ボタンを押下して`Add note with build status on GitLab merge requests`を選択

<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/dbfa1e06-869c-f23b-00d2-de059ad85bf9.png" width="70%"></img></div>

全ての設定が終わったら`保存`ボタンを押下してジョブの作成を完了する。

## J-APIトークン作成

GitlabからJenkinsにアクセスする用のAPIトークンを作成する。

1. Jenkinsの画面右上の自分のユーザ名をクリックする。
2. 左メニューの`設定`を押下する。
3. `APIトークン` -> `Current token(s)`で`Add new Token`ボタンを押下する。
4. トークンの名前を任意で入力する。
5. `Generate`ボタンを押下し、表示された文字列はあとで使うのでコピーしてメモ帳等で保持しておく。

<span style="color:red">忘れたりした場合は再度トークンを作成する</span>

## G-Webhook作成

連携のための設定を行う。

### 設定する場所

`設定` -> `インテグレーション`
`<projectURL>/settings/integrations`

### 設定項目

* URL
  `https://<jenkinsのユーザID>:<jenkinsのユーザがjenkins上で作成したAPIトークン>@<projectURL>`

* Trigger
  プロジェクトの運用方法に合わせてチェックする

* SSL verification
  チェックを外す

設定後、`Add webhook` ボタンを押下し、webhookを作成。
作成後、`Test`ボタンでWebhookが動作するかどうかを確認し、動作すればOK。
エラーが起きた場合の対処方法については後述。

### エラーと対処方法

参考程度に。
解決しなければエラー文で検索。
どうしようもない場合は最終手段としてプロジェクトかジョブを削除。

#### 401

認証エラー。

##### 原因

* jenkinsでAPIトークンが作成されていない。
* ユーザIDが間違っている。

##### 対処方法

* APIトークンが作成されているか確認。作成されていたならもう一度作り直す。
* ユーザIDの確認。ユーザ名と混同しないよう注意。

#### 404

指定したURLにアクセスできない。

##### 原因

URLが間違っている。

##### 対処方法

URLをもう一度コピペし直す。

## G-マージリクエスト発行

Gitlabで適当にマージリクエストを発行する。
担当者はjenkinsにする必要はない。
マージリクエストページ内下部のディスカッション欄で以下の投稿がされていることを確認する。
<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/ad59752f-9d65-5ed8-5171-c1532e2136ef.png" width="70%"></img></div>


## J-ビルド結果確認

jobのページ内左にある`ビルド履歴`の最新のビルドを確認する。
番号がリンクになっているので押下。
<div align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275511/e8456d62-4ada-0c97-5859-c01767be4538.png" width="70%"></img></div>

`コンソール出力`を押下する。
今回、[ビルド](#%e3%83%93%e3%83%ab%e3%83%89)設定の中で`echo`コマンドを打ったので、コンソールに文字列が出力される。その旨がかかれていて、エラーが起きていないならば連携は完了。

## 参考資料
[JenkinsとGitLabを連携する方法](https://qiita.com/takamii228/items/3598f403518c296f93f3)
[Gitlab+Jenkins 自动构建(自動ビルド)](https://www.jianshu.com/p/9d7615e2ea50)
[JenkinsとGitHubのWebhook連携の整理](https://developer.aiming-inc.com/infra/jenkins-github-webhook-collaboration/)