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


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

前提条件

  • GitlabとJenkinsのソフト間の連携が完了済みであること
  • GitlabにJenkinsの情報を投稿するための専用ユーザを作成し、sshキー登録等が完了済みであること
  • Jenkins内で、Gitlabからアクセスができるユーザの認証情報を作成していること
  • Jenkins内で、GitlabにJenkinsの情報を投稿するための専用ユーザのAPIアクセストークンが登録済みであること
    (この辺は参考参考を参照。)

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

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-プロジェクト作成
  2. G-プロジェクトメンバにjenkinsを追加
  3. J-ジョブ作成
  4. J-APIトークン作成
  5. G-Webhook作成
  6. G-マージリクエスト発行
  7. J-ビルド結果確認

G-プロジェクト作成

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

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

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

J-ジョブ作成

新規ジョブ作成

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

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

ソースコード管理

Gitを選択。

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

ビルド・トリガ

プロジェクトの運用方法に応じて設定。
今回は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
      チェックを外す。

ビルド環境

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

ビルド

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

echo "Hello world"

ビルド後の処理

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

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

J-APIトークン作成

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

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

忘れたりした場合は再度トークンを作成する

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にする必要はない。
マージリクエストページ内下部のディスカッション欄で以下の投稿がされていることを確認する。

J-ビルド結果確認

jobのページ内左にあるビルド履歴の最新のビルドを確認する。
番号がリンクになっているので押下。

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

参考資料

JenkinsとGitLabを連携する方法
Gitlab+Jenkins 自动构建(自動ビルド)
JenkinsとGitHubのWebhook連携の整理