JenkinsとGithub Webhookを使って、デプロイを自動化する。 

<h2>注意</h2>
<p>特になし</p>
<h2>環境</h2>
<ul>
<li>AWS EC2</li>
<li>Ubuntu 22.04.3 LTS</li>
<li>java -version 11.0.20.1</li>
<li>git version 2.34.1</li>
<li>Jenkins 2.430</li>
</ul>
<h2>目的</h2>
<p>今までは、Githubにpushした後、サーバにssh接続をして、git pull やサーバの再起動を行ってデプロイしていた。手間を減らすために、デプロイの工程を自動化したい。</p>
<h2>結論</h2>
<p>JenkinsとGithub Webhookを用いる。Githubにpushしたときに、Githubが、サーバにインストールされているJenkinsに通知して、Jenkinsに配置したシェルスクリプトが勝手に実行される仕組みである。このシェルスクリプトには、「git pull」などのデプロイするためのコマンドが書いてある。</p>

<h2>Jenkins, Github Webhookを用いて、デプロイの工程を自動化する</h2>
<h3>概要</h3>
<p>今回は、Jenkinsをインストールするサーバとアプリをホストするサーバは、同一になっている。</p>
<p>主に下記の設定を行う。</p>
<ul>
<li>サーバにSSH接続をしてLinuxコマンドを使って、ウェブサイトを立てる（すでにウェブサイトが立っている人は飛ばしてください）。この時、git cloneを用いてプロジェクトをコピーします。</li>
<li>サーバにSSH接続をしてLinuxコマンドを使って、Jenkinsをインストールする。</li>
<li>JenkinsのGUI画面からいろいろ設定を行う。</li>
<li>GithubのGUI画面からいろいろ設定を行う。</li>
</ul>


<h3>手順（サーバにSSH接続をして、ウェブサイトを立てる）</h3>
<h4>サーバ（ubuntu）にapache2をインストール</h4>
<p>下記のコマンドを実行してください。</p>
<p>「YourKey.pem」の部分はキーのパスに変更してください。また、「XXX.XXX.XXX.XXX」の部分はサーバのIPアドレスに変更してください。</p>

```ubuntu
>ssh -i YourKey.pem ubuntu@XXX.XXX.XXX.XXX
$ sudo apt update
$ sudo apt install apache2
```


<h4>git cloneして、ウェブサイトのプロジェクトをGithubからコピーする。</h4>
<p>下記のコマンドを実行してください。</p>
<p>{YourName}はあなたのGithubの名前に変更してください。{YourGithubToken}は、あなたのGithubトークンです。「JenkinsTest」は、今回使用するレポジトリの名前です。</p>
<p>今回私が使うレポジトリには、index.htmlしか含まれていません。中身は何でもいいです。</p>

```ubuntu
$ cd /var/www
/var/www$ sudo git clone https://github.com/{YourName}/JenkinsTest/
Cloning into 'JenkinsTest'...
Username for 'https://github.com': {YourName}
Password for 'https://{YourName}@github.com': {YourGithubToken}
...
/var/www$ cd JenkinsTest
/var/www/JenkinsTest$ ls -l
total 4
-rw-r--r-- 1 jenkins jenkins 223 Nov  2 14:52 index.html
```

<h4>apache2をの設定を行い、ウェブサイトを立てる。</h4>
<p>下記のコマンドを実行してください。</p>

```ubuntu
$ cd /etc/apache2/sites-available
/etc/apache2/sites-available$ sudo touch JenkinsTest.conf
/etc/apache2/sites-available$ sudo nano JenkinsTest.conf
$ sudo a2ensite JenkinsTest.conf
$ sudo systemctl restart apache2
```

```JenkinsTest.conf
<VirtualHost *:80>
    ServerName XXX.XXX.XXX.XXX

    # JenkinsTestへのリクエストを/var/www/JenkinsTestにマッピング
    Alias "/JenkinsTest" "/var/www/JenkinsTest"

    <Directory "/var/www/JenkinsTest">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

<h4>ウェブサイトが立ったかどうかの確認</h4>
<p>これにより、「XXX.XXX.XXX.XXX/JenkinsTest」にアクセスした場合、プロジェクトのindex.htmlの内容がブラウザに表示されるはずです。無事に表示されていれば、ウェブサイトが立っています。「XXX.XXX.XXX.XXX」はもちろん、ウェブサイトをホストしているIPアドレスです。</p>

![Untitled (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/9165509c-3a30-4a3d-dd0a-544796203b26.png)



<h3>手順（対象のGithubレポジトリにWebhookの設定を行う）</h3>
<h4>対象のGithubレポジトリにWebhookの設定を行う。</h4>
<p>下記の写真の場所から、Webhookの設定を行います。</p>
<p>Payload URLは、「http://XXX.XXX.XXX.XXX:8080/github-webhook/」のように書いてください。「XXX.XXX.XXX.XXX」の部分は、JenkinsがインストールされているサーバのIPアドレスです。</p>

![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/7c7320bd-45a0-d9a0-8533-bfe8e2a3629e.png)

<h3>手順（サーバにSSH接続をして、Jenkinsをインストールする）</h3>

<h4>サーバ（ubuntu）にJavaをインストールする。</h4>
<p>Jenkinsをインストールするためには、まずはJavaをインストールする必要があります。</p>
<p>下記のコマンドを実行してください。</p>

```ubuntu
$ sudo apt update
$ sudo apt install openjdk-11-jdk -y
$ java -version
openjdk version "11.0.20.1" 2023-08-24
...
```

<h4>サーバ（ubuntu）にJenkinsをインストールする。</h4>
<p>下記のコマンドを実行してください。</p>

```ubuntu
$ sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian/jenkins.io-2023.key
$ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install jenkins
$ sudo systemctl status jenkins
...
Active: active (running)
...
$ sudo ufw disable
$ sudo ufw status
Status: inactive
```

<p>ファイアウォールを有効化したい場合は、下記のようになると思います。「sudo ufw disable」で無効化してしまうのが手っ取り早いので、上記のままでいいと思います。</p>

```ubuntu
$ sudo ufw allow 8080
$ sudo ufw allow 80
$ sudo ufw enable
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
8080                       ALLOW       Anywhere
80                         ALLOW       Anywhere
8080 (v6)                  ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
```


<h3>手順（JenkinsのGUI画面から、いろいろ設定を行う）</h3>
<h4>JenkinsのGUI画面を確認する。</h4>
<p>あなたのサーバのIPアドレスの8080ポート（http://XXX.XXX.XXX.XXX:8080）にアクセスすると、JenkinsのGUI画面が表示されるはずです。</p>

![Untitled (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/2aa30228-298c-89cf-624e-19691d72af87.png)

<p>Administrator passwordは下記のようにして取得します。下記の「XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」の部分をコピペしてください。</p>

```ubuntu
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

<h4>Jenkinsの初期設定を行う。</h4>
<p>下記の画像のように選択肢を選ぶ。</p>

![Untitled (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/b7b7886d-bfcd-6f1c-ac9d-59035312ef15.png)

<p>下記の画像の時、ユーザを作るのはスキップでいいです。</p>

![Untitled (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/cd78ec62-abf5-8beb-916d-2e0e1ae4cb83.png)

<p>下記の画像の時、なにも変更しなくていいです。</p>

![Untitled (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/7ce3f80a-d048-5aef-0f83-d8200a5d95c2.png)


<h4>新しいジョブの作成</h4>
<p>新しいジョブを作成します。ジョブ名は「TestJenkinsDeploy」としました。「フリースタイル・プロジェクトのビルド」を選択します。</p>
<p>次に、下記の画像の場所からいろいろ設定を行います。</p>

![Untitled (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/b6c68a9c-674b-ece9-0352-58383ff51b5b.png)

<h4>「ソースコード管理」の項目の設定</h4>
<p>下記の画像の「Git」にチェックをつける。</p>
<p>リポジトリURLは、下記のような形式で記載する。「XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」の部分は、Githubのトークンを記載する。{YourName}は、Githubでの名前を記載する。</p>

```ubuntu
https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@github.com/{YourName}/JenkinsTest/
```

![Untitled (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/60ea4a20-e7af-e8a7-9251-eeb2676f7a3c.png)


<h4>「ビルド・トリガ 」の項目の設定</h4>
<p>下記の画像の「GitHub hook trigger for GITScm polling」にチェックをつける。</p>

![Untitled (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/b34062c0-5400-8400-d126-2a6dbcd973a0.png)


<h4>「Build Steps 」の項目の設定</h4>
<p>同じページに、「Build Steps 」の項目があるはずです。「シェルの実行」を選択して、下記のようにスクリプトを記載します。</p>
<p>{YourGithubToken}、{YourGithubName}の部分はそれぞれ、あなたのGithubアカウントのトークンと名前に変更してください。今回、レポジトリの名前は、「JenkinsTest」となっています。</p>

```bash
#!/bin/bash

# ディレクトリに移動
echo "移動先ディレクトリ: /var/www/JenkinsTest"
cd /var/www/JenkinsTest || { echo "ディレクトリの変更に失敗しました。"; exit 1; }

# git pull を実行
echo "GitHub リポジトリから最新の内容を取得します。"
sudo git pull https://{YourGithubToken}@github.com/{YourName}/JenkinsTest/ || { echo "git pull に失敗しました。"; exit 1; }

# Apache2 サーバーを再起動
echo "Apache2 サーバーを再起動します。"
sudo systemctl restart apache2 || { echo "Apache2 の再起動に失敗しました。"; exit 1; }

echo "処理が正常に完了しました。"
```

<h3>手順（シェルスクリプトが正常に実行されるように、権限などの修正）</h3>
<p>サーバに接続して、jenkinsユーザがsudoコマンドを実行できるようにする。</p>

```ubuntu
$ sudo visudo
```
<p>上記でファイルを編集することができるので、下記を追加する。</p>

```ubuntu
jenkins ALL=(ALL) NOPASSWD: ALL
```

<h3>手順（成功したかどうかの確認）</h3>
<p>対象プロジェクトのindex.htmlに変更を加えて、Githubにpushしてみる。そうすると、自動でデプロイが行われて、勝手にウェブサイトに変更が反映されます。</p>

![Untitled (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/e8ccb6d6-bedf-ab52-ee83-d1c763f9bea6.png)


<h3>補足（ログの確認）</h3>
<h4>Githubのログ</h4>
<p>ログではないかもしれないが、下記の画像の場所から、正常に送信されたかどうかのチェックはできる。</p>

![Untitled (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/a416f83a-95fb-5931-7e58-e8a4220d4e7b.png)


<h4>JenkinsTestのログ</h4>
<p>下記の画像の場所から、ログを確認することができます。</p>

![Untitled (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/4c497b58-6904-7087-c81d-a9cbe87aecf3.png)

![Untitled (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/0108f8c1-42c9-152d-89eb-337620779c1e.png)

<h4>サーバのログ</h4>
<p>他の記事に「/var/log/Jenkins」の位置にログが残ると書いてあったが、何もログがなかった。サーバから得られる最大限の情報は、「/var/log/syslog」くらいだった。</p>


<h2>参考</h2>
<ul>
<li>https://phoenixnap.com/kb/install-jenkins-ubuntu</li>
<li>https://www.blazemeter.com/blog/how-to-integrate-your-github-repository-to-your-jenkins-project</li>
<li>https://www.jenkins.io/doc/book/installing/linux/#debianubuntu</li>
<li>https://stackoverflow.com/questions/70541720/jenkins-has-no-installation-candidate-error-while-trying-to-install-jenkins-on</li>
<li>https://pkg.jenkins.io/debian/</li>

</ul>