LoginSignup
0
0

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

Last updated at Posted at 2023-11-03

注意

特になし

環境

  • AWS EC2
  • Ubuntu 22.04.3 LTS
  • java -version 11.0.20.1
  • git version 2.34.1
  • Jenkins 2.430

目的

今までは、Githubにpushした後、サーバにssh接続をして、git pull やサーバの再起動を行ってデプロイしていた。手間を減らすために、デプロイの工程を自動化したい。

結論

JenkinsとGithub Webhookを用いる。Githubにpushしたときに、Githubが、サーバにインストールされているJenkinsに通知して、Jenkinsに配置したシェルスクリプトが勝手に実行される仕組みである。このシェルスクリプトには、「git pull」などのデプロイするためのコマンドが書いてある。

Jenkins, Github Webhookを用いて、デプロイの工程を自動化する

概要

今回は、Jenkinsをインストールするサーバとアプリをホストするサーバは、同一になっている。

主に下記の設定を行う。

  • サーバにSSH接続をしてLinuxコマンドを使って、ウェブサイトを立てる(すでにウェブサイトが立っている人は飛ばしてください)。この時、git cloneを用いてプロジェクトをコピーします。
  • サーバにSSH接続をしてLinuxコマンドを使って、Jenkinsをインストールする。
  • JenkinsのGUI画面からいろいろ設定を行う。
  • GithubのGUI画面からいろいろ設定を行う。

手順(サーバにSSH接続をして、ウェブサイトを立てる)

サーバ(ubuntu)にapache2をインストール

下記のコマンドを実行してください。

「YourKey.pem」の部分はキーのパスに変更してください。また、「XXX.XXX.XXX.XXX」の部分はサーバのIPアドレスに変更してください。

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

git cloneして、ウェブサイトのプロジェクトをGithubからコピーする。

下記のコマンドを実行してください。

{YourName}はあなたのGithubの名前に変更してください。{YourGithubToken}は、あなたのGithubトークンです。「JenkinsTest」は、今回使用するレポジトリの名前です。

今回私が使うレポジトリには、index.htmlしか含まれていません。中身は何でもいいです。

$ 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

apache2をの設定を行い、ウェブサイトを立てる。

下記のコマンドを実行してください。

$ 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>

ウェブサイトが立ったかどうかの確認

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

Untitled (11).png

手順(対象のGithubレポジトリにWebhookの設定を行う)

対象のGithubレポジトリにWebhookの設定を行う。

下記の写真の場所から、Webhookの設定を行います。

Payload URLは、「http://XXX.XXX.XXX.XXX:8080/github-webhook/」のように書いてください。「XXX.XXX.XXX.XXX」の部分は、JenkinsがインストールされているサーバのIPアドレスです。

Untitled (5).png

手順(サーバにSSH接続をして、Jenkinsをインストールする)

サーバ(ubuntu)にJavaをインストールする。

Jenkinsをインストールするためには、まずはJavaをインストールする必要があります。

下記のコマンドを実行してください。

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

サーバ(ubuntu)にJenkinsをインストールする。

下記のコマンドを実行してください。

$ 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

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

$ 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)

手順(JenkinsのGUI画面から、いろいろ設定を行う)

JenkinsのGUI画面を確認する。

あなたのサーバのIPアドレスの8080ポート(http://XXX.XXX.XXX.XXX:8080)にアクセスすると、JenkinsのGUI画面が表示されるはずです。

Untitled (12).png

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

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

Jenkinsの初期設定を行う。

下記の画像のように選択肢を選ぶ。

Untitled (13).png

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

Untitled (14).png

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

Untitled (15).png

新しいジョブの作成

新しいジョブを作成します。ジョブ名は「TestJenkinsDeploy」としました。「フリースタイル・プロジェクトのビルド」を選択します。

次に、下記の画像の場所からいろいろ設定を行います。

Untitled (16).png

「ソースコード管理」の項目の設定

下記の画像の「Git」にチェックをつける。

リポジトリURLは、下記のような形式で記載する。「XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」の部分は、Githubのトークンを記載する。{YourName}は、Githubでの名前を記載する。

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

Untitled (18).png

「ビルド・トリガ 」の項目の設定

下記の画像の「GitHub hook trigger for GITScm polling」にチェックをつける。

Untitled (17).png

「Build Steps 」の項目の設定

同じページに、「Build Steps 」の項目があるはずです。「シェルの実行」を選択して、下記のようにスクリプトを記載します。

{YourGithubToken}、{YourGithubName}の部分はそれぞれ、あなたのGithubアカウントのトークンと名前に変更してください。今回、レポジトリの名前は、「JenkinsTest」となっています。

#!/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 "処理が正常に完了しました。"

手順(シェルスクリプトが正常に実行されるように、権限などの修正)

サーバに接続して、jenkinsユーザがsudoコマンドを実行できるようにする。

$ sudo visudo

上記でファイルを編集することができるので、下記を追加する。

jenkins ALL=(ALL) NOPASSWD: ALL

手順(成功したかどうかの確認)

対象プロジェクトのindex.htmlに変更を加えて、Githubにpushしてみる。そうすると、自動でデプロイが行われて、勝手にウェブサイトに変更が反映されます。

Untitled (20).png

補足(ログの確認)

Githubのログ

ログではないかもしれないが、下記の画像の場所から、正常に送信されたかどうかのチェックはできる。

Untitled (19).png

JenkinsTestのログ

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

Untitled (21).png

Untitled (22).png

サーバのログ

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

参考

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0