JenkinsでローカルのGitリポジトリと連携しMavenでビルド

# はじめに
JenkinsでローカルのGitリポジトリと連携しMavenでビルドする際、ハマりポイントがいくつかあったので、ここに備忘録として記載します。

Jenkinsやプラグインのインストールは、ここでは割愛します。

# 環境（インストール済み資材）
* OS: Windows 11
* Jenkins 2.492.2
* JDK 21
* Git for Windows
* Maven

## 前提条件
* 環境変数にJAVA_HOME設定済み
* Mavenインストールフォルダのbinフォルダにパス設定済み
* JenkinsのGitプラグインがインストールされていること

# ローカルのGitリポジトリとの連携が出来るようになるまで
## 新規プロジェクトの作成
まず、「新規ジョブ作成」で「ジョブ名を入力」にジョブ名を入力、「フリースタイル・プロジェクトのビルド」を選択し、「OK」をクリックします。

Configure画面で、ソースコード管理セクションを以下のようにします。
![ソースコード管理1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863714/76ca5173-5d72-4f3d-8536-0c0a9446b1c8.png)
* リポジトリURL: Gitリポジトリのパス
* 認証情報: なし
* その他項目はデフォルト

更新があるたびにビルドするため、Triggersセクションを以下のようにします。
![トリガー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863714/8e30b391-050f-4e1c-ac95-30e505d952d3.png)
* 「SCMをポーリング」を選択
* スケジュールに「H/5 * * * *」を入力
　※この例は5分間隔で更新を見に行き、あればビルドされるという設定です。

 Maven関連は後程設定します。
 とりあえず、ここまで入力した段階で「Save」をクリックして保存します。

 ## Git側の設定
 上記設定だけでビルドを実行すると、Git実行時にエラーが出てしまいます。
 ※コンソール出力 で実行内容やエラーを確認できます。
 > fatal: unsafe repository ('....' is owned by someone else)
To add an exception for this directory, call:
        git config --global --add safe.directory '....'
        
エラーでは「git config --global --add safe.directory ～」とありますが、この通りのコマンドだとうまく通らないので、以下のようにする必要があります。
1. コマンドプロンプトを **「管理者として実行」** で立ち上げる
1. 次のコマンドを実行する
```bat
git config --system --add safe.directory "*"
```

:::note warn
JenkinsのユーザとWindowsのユーザが違うため、`--global`ではなく、`--system`にする必要があるようです。
更に、`--system`を付与するためには、管理者として実行しないと設定変更が出来ないようです。
:::

更に、フォルダのネストが深くなりファイルパスが長くなってしまうとチェックアウト時にエラーが発生します。
それを回避するため、上記コマンドプロンプトにて、
```bat
git config --system core.longpaths true
```
を実行します。
これで、パスが長くなってもエラーが出なくなります。

:::note warn
Git for Windowsではパス名が所定数以上となるとエラーになるようにデフォルトとして設定されているようです。
それを回避するために、``core.longpaths``をtrueに設定する必要があります。
:::


 ## Jenkins側の設定
上記の設定後ビルドを行っても今度は以下のエラーで失敗してしまいます。
> ERROR: Checkout of Git remote 'C:.......' aborted because it references a local directory, which may be insecure. You can allow local checkouts anyway by setting the system property 'hudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT' to true.

これには、jenkins.xmlで設定変更が必要です。

C:\Program Files\Jenkins\jenkins.xml を開き、``<arguments>``タグに
> -Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true

を **-jar の前**に記述します。


```xml:jenkins.xml の記入例
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true -jar "C:\Program Files\Jenkins\jenkins.war" --httpPort=8080 --webroot="%ProgramData%\Jenkins\war"</arguments>
```
これで、ビルドを行うと、Gitリポジトリのclone、チェックアウトまで行えるようになります。

# Mavenが動くようになるまで
Mavenが動くようになるまでには、もう少し設定が必要です。

## JDKの設定
「ダッシュボート」→「Jenkinsの管理」→「Toolsの管理」を選択し、Tools画面を開きます。

「インストール済みJDK」セクションで、「JDK追加」をクリック
「自動インストール」チェックボックスを外し、「名前」に任意の名前を入力して、JAVA_HOME にJavaがインストールされているフォルダを設定します。
![JDK設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863714/2424d978-e4b5-469b-9f9a-1ba921ec6ab0.png)

## Mavenの設定
引き続き同一画面の
「インストール済みMaven」セクションで、「Maven追加」をクリック
「自動インストール」チェックボックスを外し、「名前」に任意の名前を入力して、MAVEN_HOME にMAVENがインストールされているフォルダを設定し「Save」をクリックします。
![maven1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863714/034afeca-53e8-43b6-84bb-53999f25d5a2.png)

## プロジェクト側の設定
再度、最初に作成したプロジェクトの「設定」を開いて、Configure画面を開きます。

「Build Steps」セクションで「ビルド手順の追加」→「Mavenの呼び出し」を選択します。
「使用するMaven」に、上記で設定したMavenを選択して、「ゴール」に、mavenをコマンド実行する際の「mvn～」以降の内容を記述します。

![maven2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863714/d7f3def1-0577-4a96-837b-1d56f5ba7351.png)

「高度な設定」にて、pom.xmlファイルを直接指定することもできます。
![maven3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863714/c004d232-8491-4776-9d77-b739b769c098.png)

上記例は、プロジェクト直下のtestフォルダ配下のpom.xmlを実行することを想定した内容です。

なお、省略した場合は、プロジェクト直下にあるpom.xmlファイルが対象となります。

これらの設定にて、Mavenビルドが行えるようになります。