注意
特になし
環境
- 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
<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アドレスです。
手順(対象のGithubレポジトリにWebhookの設定を行う)
対象のGithubレポジトリにWebhookの設定を行う。
下記の写真の場所から、Webhookの設定を行います。
Payload URLは、「http://XXX.XXX.XXX.XXX:8080/github-webhook/」のように書いてください。「XXX.XXX.XXX.XXX」の部分は、JenkinsがインストールされているサーバのIPアドレスです。
手順(サーバに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画面が表示されるはずです。
Administrator passwordは下記のようにして取得します。下記の「XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」の部分をコピペしてください。
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Jenkinsの初期設定を行う。
下記の画像のように選択肢を選ぶ。
下記の画像の時、ユーザを作るのはスキップでいいです。
下記の画像の時、なにも変更しなくていいです。
新しいジョブの作成
新しいジョブを作成します。ジョブ名は「TestJenkinsDeploy」としました。「フリースタイル・プロジェクトのビルド」を選択します。
次に、下記の画像の場所からいろいろ設定を行います。
「ソースコード管理」の項目の設定
下記の画像の「Git」にチェックをつける。
リポジトリURLは、下記のような形式で記載する。「XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」の部分は、Githubのトークンを記載する。{YourName}は、Githubでの名前を記載する。
https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@github.com/{YourName}/JenkinsTest/
「ビルド・トリガ 」の項目の設定
下記の画像の「GitHub hook trigger for GITScm polling」にチェックをつける。
「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してみる。そうすると、自動でデプロイが行われて、勝手にウェブサイトに変更が反映されます。
補足(ログの確認)
Githubのログ
ログではないかもしれないが、下記の画像の場所から、正常に送信されたかどうかのチェックはできる。
JenkinsTestのログ
下記の画像の場所から、ログを確認することができます。
サーバのログ
他の記事に「/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/