GitLabからWebhook飛ばしてJenkinsのJobを実行する。プラグイン0で

昨日に引き続くメモ。
Qiita - インターネット非接続環境のCentOS 7にJenkinsとGitLabをインストール
https://qiita.com/rk05231977/items/791490f5532baf749924

インターネット非接続環境のJenkinsとGitLab環境を作ったので、GitLabでファイルを更新したらそれをトリガーにJenkinsでJobを実行しようと、そういう記事。

##■ホストOSの準備
sshで昨日作ったCentOSサーバーにrootでログイン。

１．以下のコマンドを実行して、jenkinsユーザーがdockerコマンドを実行可能にする。

```
# groupmems -a jenkins -g docker
# systemctl restart jenkins
```

２．gitコマンドを導入する。

```
# yum install -y git
```

３．「devops.example.com」が自マシンのIPアドレスで解決されるように設定する。

```
# echo "192.168.0.116 devops.example.com" >> /etc/hosts
```


##■Jenkins側
以前はCSRF Protectionとかの設定を修正する必要があったのだが、今は必要なくなったらしい。簡単になるのは良いことだ。

###・ジョブを作る
１．Webブラウザで先に作ったCentOSサーバーのJenkinsにアクセス、adminユーザーでログインする。
http://devops.example.com:8080/

２．ダッシュボード画面、または http://devops.example.com:8080/manage の管理画面から「New item」をクリックする。

３．「Enter an item name」の画面でジョブ名を入力し（ここではSample）、「Freestyle project」を選択して、「OK」。

４．「Build」>「Add build step」>「Execute shell」をクリックし、「Command」に実行したいコマンドを入力。とりあえず、GitLabからgit cloneしてビルド番号のタグを付けたDockerイメージをビルドする以下を入力。

```
if [ -e project ]; then
  rm -rf project
fi
git clone http://devops.example.com/root/project.git
cd project
docker build . -t project:$BUILD_NUMBER
```

５．画面下の「Save」をクリック。

###・APIトークンを作成
１．Jenkins画面右上のユーザー名（admin）をクリック。

２．画面左メニューの「Configure」をクリック。

３．「APIトークン」の「Add new token」をクリック。

４．「Generate」をクリック。

５．作成されたトークン文字列（「111cc9183125ea9e099c754b059564c4fd」みたいな）、をコピペして退避。

６．一応、画面下の「Save」をクリック。


##■GitLab側

###・セキュリティ設定
１．WebブラウザでGitLabにアクセスし、rootユーザーでログインする。
http://devops.example.com/

２．画面上方のスパナのアイコン、「Admin Area」をクリック。

３．画面左メニュー下方の「Settings」>「Network」をクリック。

４．「Outbound requests」右の「Expand」をクリック。

５．「Allow requests to the local network from web hooks and services」をチェック。

６．「Save changes」をクリック。

###・プロジェクトを作る
１．画面上側中央の「+」ボタンから「New project」をクリック。

２．「Create new project」画面で「Create blank project」をクリック。

３．次の画面で、「Project name」に「project」と入力。
また、「Visibility Level」に「public」を選択。

４．画面下の「Create project」をクリック。

５．プロジェクトが出来たら、「New file」(画面の真ん中ら辺り、Cloneの隣)をクリック。
次の画面で、もう一回「New file」をクリック。

６．「Create new file」の画面で「Name」に「Dockerfile」と入力し、「Create file」をクリック。

７．テキストに以下を入力。作成するDockerイメージは適当なもの。

```
FROM gitlab/gitlab-ce:13.7.3-ce.0
COPY hello.txt /
```

８．画面下側の「Commit...」>「Commit」をクリック。


###・Jenkins連携を追加
１．Web IDEを閉じてProject管理画面に戻る。画面左上の「project」のアイコンをクリックする。

２．左メニュー下方、「Settings」>「Webhooks」を開く。

３．URLに、先に作成したJenkinsジョブのURLを入力。ユーザー名とAPIトークンも付ける。
http://admin:111cc9183125ea9e099c754b059564c4fd@192.168.0.116:8080/job/Sample/build
["http://][Jenkinsユーザー名]:[APIトークン]@[CentOSホストのIPアドレス:ポート番号]/job/[job名]/build

「192.168.0.116」の部分は、ホストOSのIPアドレスを指定。GitLabがDockerコンテナ上で動作している問題で、localhostとかは指定不可。

３．Triggerはそのまま、「Enable SSL Verification」からはチェックを外す。

４．「Add webhook」をクリック。

５．画面下に現れた「Project Hooks (1)」の「Test」>「Push event」を実行し、Webhookを飛ばしてJenkinsのJobが実行できることを確認する（「Hook executed successfully: HTTP 201」と青色のメッセージが画面の上の方に表示される）。なお、この時点ではJenkins側Jobは必要なファイルがGitLabプロジェクト上にないため失敗する。

###・GitLabにファイルをコミットしてビルド
１．画面左上の「project」をクリックして、プロジェクト画面を開く。

２．画面中央、プロジェクト名の右の「+」>「New file」をクリック。

３．「File name」に「hello.txt」を入力。

４．テキストに「hello」とか、適当な文字列を入力。

５．画面下の「Commit changes」をクリック。


設定が上手くいけば、「Commit changes」をクリックしたタイミングで、Jenkins上の「Sample」ジョブが起動しているはず。
Jenkinsのダッシュボード画面、「Build History」から最新のビルドを確認し、「Console Output」を確認すれば以下のようなメッセージが出力され、「project:<ビルド番号>」となるDockerイメージが生成されているはず。

```
Started by user admin
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/Sample
[Sample] $ /bin/sh -xe /tmp/jenkins3184583140096351880.sh
+ '[' -e project ']'
+ rm -rf project
+ git clone http://devops.example.com/root/project.git
Cloning into 'project'...
+ cd project
+ docker build . -t project:3
Sending build context to Docker daemon  53.76kB

Step 1/2 : FROM gitlab/gitlab-ce:13.7.3-ce.0
 ---> ffadb2afd260
Step 2/2 : COPY hello.txt /
 ---> e24f9f6e8e13
Successfully built e24f9f6e8e13
Successfully tagged project:3
Finished: SUCCESS
```

ちなみにここまで設定しておいてなんだが、GitLab画面からファイルを直接編集するような運用では、コミット毎に自動でJenkinsのジョブ実行って却って少ないんじゃないかと思う。
ファイルセーブするごとにCI/CDパイプラインが流れるとか、煩わしい。
その場合はWebhookを外して、Jenkinsにログインして手動でビルドジョブを実行するのが吉。


（追記 2021/01/09）思いのほかView数を稼ぐため記事をメンテ。オリジナルの発行は2019/05/03。