自宅にJekninsのローカル環境を構築してみた

[「Applibot Advent Calendar 2023」](https://qiita.com/advent-calendar/2023/applibot)21日目の記事になります。
前の記事は[@ref3000](https://qiita.com/ref3000)さんの[【Jenkins】「このビルドはパラメータが必要です。」を消す](https://qiita.com/ref3000/items/66056227def7d280a24c)になります。

## はじめに
今回は自宅のPCにJenkinsのローカル環境を構築してみた話になります。
個人的に詰まった部分などを中心に書いていければなと思います。
自宅の環境がWindowsのため他のプラットフォームには対応しない部分があると思いますがご容赦ください。

## Jenkinsとは
CI/CDを実現するためのOSSツール
自動でデプロイやビルドをすることが可能。

## 準備
### 事前に必要なもの
今回以下のものはすでにインストール済みで進めます。
* JDK11 or 17
* Git Bash


## インストール
まずは[こちら](https://www.jenkins.io/download/)からJenkinsのインストーラーをダウンロードします。

ダウンロード後インストールを画面に従って進めます。

![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/d9c34d9b-4ec2-8abc-cf42-99ea44c34581.png)
認証情報を求められる画面になったら上の`Run service as LocalSystem`を選択します。
Windows10 HomeやWindows11 Homeの場合、ここでuserの指定ができないので後ほど設定します。

:::note info
Win + R で`%systemroot%\system32\services.msc`をファイル名を指定して実行
Jenkinsを選択しプロパティ→ログオンから管理者ユーザーでログオンが可能です。
:::


インストールが終わったら`localhost:8080`にアクセスします。
下のような画面が出るので赤文字のフォルダにあるファイルをメモ帳等で開き、中にあるパスワードを貼り付けます。
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/f121a3ae-ce22-08b2-06cd-4c5ca024078c.png)

進めていくと途中pluginのインストールを選択する部分が出てきますが、明確に使いたいものがない限りは左側を選択することをお勧めします。

この画面ではJenkinsのURLを変更できるのですが、後からでも変更できるのといくつか設定が必要になるのでこのままにします。
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/e37e4ec0-8eff-c7da-6c1e-33d3f4f9f4ed.png)

ユーザーを作成し以下のようなホームに行ければインストール終了です。
![image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/f5585028-d3d4-a940-691d-5822ffe9276f.png)

### 設定
Jobの作成の前にシェルの設定をします。
Jenkinsの管理→Systemから下の方に`シェル実行ファイル`という項目があるので
そこにGit Bashのsh.exeのパスを渡します。

## Jobの作成
では本題のJobを作っていきましょう。
**ホームの新規ジョブ**作成から作っていきます。

まずは簡単なシェルの実行をするだけのJobを作っていきます。
フリースタイルを選択しジョブ名を入力したらOKを押します。
![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/61e0c356-269e-830f-06ca-a566e3b82432.png)


### Jobの設定
Jobの設定画面です。
下の方に行くと**Bulid Steps**とあるのでビルド手順の追加から`シェルノ実行`を選択し以下のコードを書きます。
![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/667a637c-1352-30b9-a0e1-dea7d3f3e57d.png)

```
echo "Hellow World"
```
書けたら保存し実行してみましょう。

しばらくするとビルドが実行され左側に`#1`というものが出てきます。
それを選択しコンソール出力を選び`Hello World`と表示されていれば成功です。
![image (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/5d1ab943-91f0-c434-bacd-2f95bc78258b.png)


:::note info
もしshが見つからないなどのエラーが出た場合はシステム環境変数のPathに`C:\Program Files\Git\bin`が通っているか確認してください。
:::

### パラメータの設定
シェルが実行できたので次はパラメータを渡せるようにしたいと思います。
パラメータを設定することでスクリプトを変更することなく設定などを変更することができます。

先ほど作成したJobの設定を開き、`ビルドのパラメータ化`にチェックを入れます。
パラメータを追加し文字列を選びます。
`パラメータの名前`、`デフォルト値`、`説明`を入力します。
![image (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/c41ac040-5554-07ed-d02d-978bcaaa6af6.png)


このままではパラメータがシェルに反映されないのでコードを以下のように編集します。
```diff_shell
+ echo "$TEXT"
- echo "Hello World"
```
`$パラメータ名`と書くことでパラメータを変数として渡すことができます。

では実行してみます。ここで**ビルドの実行**が**パラメータ付きビルド**に変わっています。
渡したパラメータが表示されていれば成功です。
![image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/ad684410-292a-4777-ee29-e26ec8ea9a4f.png)

### Pipelineの設定
次はPipelineの作成です。
これを使用することで先ほどのシェルの実行を複数のステップに分けて実行したり、Gitのチェックアウトやビルドなどをステップに分けることでメンテナンスか拡張性を持たせることができます。

PipelineはJenkinsスクリプト（言語はgroovy）で書くことができます。
Git管理も可能なのでバックアップや更新も可能です。

新規ジョブ作成から今度はパイプラインを選択してOKを押します。
![image (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637109/38afba24-2b7c-143a-42d5-ebc71ebe928a.png)

今回はパラメータに文字列`PARAM1`,`PARAM2`を追加します。
一番下のパイプライン定義に以下を書き込みます。
```
pipeline
{
    agent any

    stages
    {
        stage("Stage1")
        {
            steps
            {
                echo "PARAM1 = $PARAM1"  
            }
        }
        stage("Stage2")
        {
            steps
            {
                echo "PARAM2 = $PARAM2"   
            }
        }
    }
}
```
パラメータ付きビルドをしてエラーが出なければ成功です。

ただこのままではパラメータを追加したくなった際に毎回Jobの設定をしないといけなくなります。
Jenkinsスクリプトを使い回していると更新忘れなども出てくるはずです。
なのでスクリプトにパラメータの定義も追加します。

```diff_groovy
pipeline
{
    agent any

+   parameters
+   {
+       string(name: "PARAM1", defaultValue: "1", description: "Stage1のパラメータです。")
+       string(name: "PARAM2", defaultValue: "2", description: "Stage1のパラメータです。")
+   }

    stages
    {
        stage("Stage1")
        {
            steps
            {
                echo "PARAM1 = $PARAM1"  
            }
        }
        stage("Stage2")
        {
            steps
            {
                echo "PARAM2 = $PARAM2"   
            }
        }
    }
}
```
:::note warn
スクリプトに定義したパラメータは編集してすぐに反映されるわけではないです。
一度実行してスクリプトが読み込まれた時点でパラメータが更新されるので空実行してからビルドしてください。
:::

## 最後に
いかがでしたでしょうか？GitのチェックアウトやUnityのビルドなどもできるのですが記事が長くなりすぎるのでここまでさせてください。個人的にシェルの実行にかなり悩まされたので少しでも参考になれば幸いです。

以上、[「Applibot Advent Calendar 2023」](https://qiita.com/advent-calendar/2023/applibot)21日目の記事でした。
明日は[@shoma3571](https://qiita.com/shoma3571)さんです。