GitLabとJenkinsのCI連携設定


よく忘れそうになるので、自分用の備忘としても残しておきます。

# やりたいこと

- GitLabでのMR作成やpushやコメント書き込みをトリガーにしてJnekinsジョブを動かす
- JenkinsはGitLabからソースを取得してジョブを実行
- Jenkinsはジョブの実行結果を元にGitLabのMRステータスを変更したり、コメント等で通知する

GitLabとJenkinsでお互いに情報を取り合う必要があるので、双方でトークンの発行や登録をする必要があります。
Jenkinsがややこしいです。

# GitLab事前準備

### GitLabでJenkinsユーザーの作成

JenkinsからGitLabにアクセスするためのユーザーを作成する。
当然、ビルドとかしたいレポジトリに対してアクセス権を付ける必要がある。
マージリクエストとかにコメントさせたいなら、Reporter以上が必要。

ユーザーを作成したら、一度ログアウトしてJenkinsユーザーで再度ログイン。

### アクセストークンの取得

`Settings` -> `Access Tokens`

適当な名前と権限を入れます。
ビルドとかするだけならread_repositoryがあればOK.
Issueとかに書き込みをさせたいなら、apiにチェック

トークンが発行されるのでコピーしておきます。(1)


# Jenkins側の設定

### GitLabプラグインの導入

[Gitlab Plugin](https://plugins.jenkins.io/gitlab-plugin/)から入手。
これを入れることにより、Jenkinsの各種画面にGitLabへの接続設定が出てくる。

### Credentialの登録

GitLabで作成したアクセストークンをJenkins Credentialに登録します。

`Manage Jenkins` -> `Credentials` -> `global` -> `Add Credentials`

KindにGitLab API Tokenを入れる。
tokenにGitLabで取得したトークン(1)を入れる。

### GitLab接続情報の追加

今作成したCredentialをJenkinsに登録します。なんか二度手間です。

`Manage Jenkins` -> `Configure System` -> `Gitlab`

Connection Nameは適当な名前を入力。
GitLabで作成したJenkins用ユーザーのアクセストークンを入力します。
Credentialsはプルダウンで先ほど登録したGitLabトークンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215103/9a82b70d-9ee6-b5ab-31dc-80e9a81914f8.png)

Test Connectionを押して、うまくいけばSuccessと出ます。
※ドメインがgitlabとなってるのはDocker-Compsoeで動かしてるからです。

### ジョブ作成

`New Item` -> `Pipeline`や`Freestyle Project`など

適当なジョブを作成します。

### ビルドトリガーの設定

GitLabからのWebhookでビルドを開始する設定を入れます
ジョブの編集で以下にチェックを入れます。

`Build Triggers` -> `Build when a change is pushed to GitLab`

Webhook用のURLが出ているので、これをコピーします(2)。あとでGitLab側に入力します。
また、Advancedの設定を展開して、一番下のSecret Tokenをコピーします(3)。これもあとでGitLab側に入力します。もし空欄なら自分で入力するか、Generateでランダムな値を生成します。
下の方のチェックにはどういう時にビルド開始したいかを設定しておきます。

# GitLab側の設定

### Webhook許可先の登録

`Admin Area` -> `Settings` -> `Network` -> `Outbound requests`

ローカルネットワーク内でWebhookを投げたい時は、許可設定を入れる必要があります。
Allow requests to the local network from web hooks and servicesにチェックを入れるか、allow listに入れます。

### Webhookの作成

GitLab側でWebhookを出す設定を入れます。

レポジトリの`Settings` -> `Integrations`

URLにはJenkinsのジョブ編集画面でコピーしたURL(2)を入力。
Secret TokenにはJenkinsで作成したトークン(3)を入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215103/46e19242-05c8-3a89-a54d-08a7716f228e.png)


Jenkinsジョブを動かすトリガにしたいイベントにチェックを入れる。
レポジトリにpushした時、マージリクエスト作成時、コメントが付いた時など。

Jenkins側でも条件を設定しましたが、あっちはWebhookを受ける条件。
こっちはどういう時にWebhookを出すかです。
pushトリガでビルドを開始したいなら、両方でpushにチェックを入れる必要があります。

登録したらTestを選択して適当なWebhookを投げてみましょう。
`200 OK`が返ってきたらOKです。

# 動確

GitLabに対してコードをpushした後に、Jenkinsのジョブが勝手に動いてるはずです。
JenkinsのジョブからGitlabのMRステータスを変更したりコメントを書き込んだりしたい時は、パイプラインの中でGitLabのAPIを叩きましょう。

# まとめ

### トークン

| トークン | 発行する場所 | 使う場所 | 用途 |
|---|---|---|---|
| Jenkins ジョブ実行用トークン | Jenkinsのパイプライン編集画面 | GitLabのWebhook設定 | GitLabからWebhookでJenkinsのジョブを実行する |
| Jenkins APIトークン | Jenkinsのユーザー設定 | - | 今回は使わないので1つ目と間違えないように注意 |
| GitLab APIトークン | GitLabのユーザーの設定 | JenkinsのCredentials設定 | JenkinsからGitLabのソースを読み取ったり、コメントを投稿したりする |


### ConnectionやCredentials設定

| 設定項目 | 登録するもの |
|---|---|
| JenkinsのGlobal credentials | GitLab APIトークン |
| Jenkinsシステム設定のGitLab Connection | Jenkins Credential |
| Jenkinsのパイプライン編集画面 | GitLab Connection | GitLab Connection(プルダウンで選択) |